windows - 在 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 方法。到目前为止,我想出的东西并没有成功,只是因为那个窗口绘制了边框。有没有办法把它取下来?或者你知道任何替代方案吗?
解决方案
我设法解决了这个问题,
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
推荐阅读
- bixby - Bixby:如何在 Note 9 中测试私人提交
- azure - 公有云服务如何设置内部环境?
- go - 如何从堆栈跟踪中删除绝对路径?
- php - 如何在 wordpress 中添加用户自定义元数据
- reactjs - 无法在 Windows 7 上安装 ReactJS 库
- python - 确认烧瓶安装后,Flask app no module named flask 错误在 elasticbeanstalk
- javascript - 如何从排序中排除/跳过项目?
- r - 无法让 dCast 工作 - 缺少聚合函数:默认为长度
- redis - 故障转移中止无好从主 mymaster
- python - 实现具有重复值的二叉搜索树