首页 > 解决方案 > 在 vbnet 中擦除 TabControl 的边框而不制作 CustomTabControl

问题描述

我想用不同的风格绘制我自己的 TabControl。我的表单中有一个 TabControl,我为其添加了事件处理程序,

MainTabControl.DrawMode = TabDrawMode.OwnerDrawFixed
AddHandler MainTabControl.DrawItem, AddressOf TabControlPaint

TabControlPaint() 是一种使用位图和缓冲区变量绘制自己的图形的方法。(见这里

我没有从 TabControl 继承,因为我的应用程序有许多表单和窗口,这将迫使我转到每个表单并为我的 CustomTabControl 更改 TabControl。我希望能够绘制自己的选项卡来覆盖 DrawItem 事件。

我想出了这个结果Screenshot,您可以在其中看到红色边框,选项卡的不同背景颜色,甚至选择了选项卡的不同配色方案。

我想不通的是擦除仅出现在所选选项卡上的白色 3D 边框。我猜是在 drawItem 事件之后调用 OnPaint() 方法时绘制在顶部(如果我错了,请纠正我)。如果我调试,则在 TabControlPaint 方法(我为 DrawItem 事件调用的方法)完成执行后会出现白色 3D 边框。

为了使问题更清楚,我想设计自己的 TabControl 而不覆盖 OnPaint 方法。到目前为止,我想出的东西并没有成功,只是因为那个窗口绘制了边框。有没有办法把它取下来?或者你知道任何替代方案吗?

标签: windowsvb.netvisual-studio

解决方案


我设法解决了这个问题,

For Each page As TabPage In MainTabControl.TabPages AddHandler page.Paint, AddressOf test Next

然后在我的测试功能中,我画出我想要的任何东西。在这种情况下,我只是画了一个矩形。它效率不高,但我认为可以通过双缓冲来改进。

Private Sub test(ByVal sender As System.Object, ByVal e As PaintEventArgs)
    Dim ScreenGraphic As Graphics = Graphics.FromHwnd(MainTabControl.Handle)
    Dim myRect As Rectangle = MainTabControl.GetTabRect(MainTabControl.SelectedIndex)
    Dim borderColor As Pen = New Pen(Color.FromArgb(42, 38, 37), 5)
    myRect.X -= 1
    myRect.Y -= 1
    ScreenGraphic.DrawRectangle(borderColor, myRect)
End Sub

推荐阅读