2017-02-09 82 views
2

我已经在Visual Basic中创建了这个类,它工作正常,但有一个轻微的design issue。正如你可以看到有这个小笨蛋,我该如何解决这个问题?另外,如何修复内容框和选择菜单之间的间距。自定义控件显示问题

Public Class VerticallTabControll 
    Inherits TabControl 

    Sub New() 
     SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.OptimizedDoubleBuffer Or ControlStyles.ResizeRedraw Or ControlStyles.UserPaint, True) 
     DoubleBuffered = True 
     SizeMode = TabSizeMode.Fixed 
     ItemSize = New Size(30, 170) 
    End Sub 

    Protected Overrides Sub CreateHandle() 
     MyBase.CreateHandle() 
     Alignment = TabAlignment.Left 
    End Sub 

    Protected Overrides Sub OnPaint(e As PaintEventArgs) 
     Dim selected As New SolidBrush(Color.FromArgb(0, 122, 204)) 
     Dim notSelected As New SolidBrush(Color.FromArgb(63, 63, 70)) 



     Dim B As New Bitmap(Width, Height) 
     Dim G As Graphics = Graphics.FromImage(B) 




     G.Clear(Color.FromArgb(63, 63, 70)) 

     For i = 0 To TabCount - 1 
      Dim TabRectangle As Rectangle = GetTabRect(i) 



      If i = SelectedIndex Then 
       '// if tab is selected 
       G.FillRectangle(selected, TabRectangle) 
      Else 
       '// tab is not selected 
       G.FillRectangle(notSelected, TabRectangle) 
      End If 

      'Line Test 
      'Dim start As New Point(10, 31 * (i + 1)) 
      'Dim ende As New Point(160, 31 * (i + 1)) 
      'G.DrawLine(Pens.White, start, ende) 


      G.DrawString(TabPages(i).Text, Font, Brushes.White, TabRectangle, New StringFormat With {.Alignment = StringAlignment.Center, .LineAlignment = StringAlignment.Center}) 

     Next 

     e.Graphics.DrawImage(B.Clone, 0, 0) 
     G.Dispose() : B.Dispose() : selected.Dispose() : notSelected.Dispose() 

     MyBase.OnPaint(e) 
     e.Dispose() 
    End Sub 
End Class 
+1

你能澄清你由一个“bumb”是什么意思?你不喜欢显示器究竟是什么? – user3697824

+0

那么内容和菜单高度不一样。 – Ramog

+0

将我添加到无法看到您要求我们解决什么问题的用户列表。不要调用'e.Dispose()'并使用TextRenderer.DrawText而不是DrawString。 – LarsTech

回答

0

你可以尝试重写DisplayRectangle属性来调整相应的内部空间:

Public Overrides ReadOnly Property DisplayRectangle As Rectangle 
    Get 
    Return New Rectangle(MyBase.DisplayRectangle.Left, 
         MyBase.DisplayRectangle.Top - 2, 
         MyBase.DisplayRectangle.Width + 2, 
         MyBase.DisplayRectangle.Height + 4) 
    End Get 
End Property 
+0

谢谢你的工作greate :) – Ramog