如何修改设为fmTabStyleButtons的Multipage控件Tab按钮的ForeColor/BackColor属性
当Multipage控件设置为fmTabStyleButtons时,Tab按钮会采用系统标准按钮的渲染逻辑,直接设置ForeColor或BackColor属性不会生效——控件会忽略这些自定义设置,优先使用系统主题样式。以下是两种可行的解决思路:
方案一:用Windows API自定义绘制Tab按钮
通过拦截控件的绘制消息,手动覆盖系统的渲染逻辑,实现自定义颜色:
- 先在标准模块中声明所需API:
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long Private Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long Private Declare Function SetTextColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long Private Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Private Const DT_CENTER = &H1 Private Const DT_VCENTER = &H4 Private Const DT_SINGLELINE = &H20
- 在用户窗体的代码中添加绘制逻辑(示例为遍历所有Tab页自定义颜色):
Private Sub Multipage1_Paint() Dim hdc As Long Dim rct As RECT Dim tabIndex As Integer Dim tabCaption As String For tabIndex = 0 To Multipage1.Pages.Count - 1 hdc = GetDC(Multipage1.hwnd) ' 调整坐标以匹配实际Tab按钮位置,需根据控件布局微调 rct.Left = Multipage1.Pages(tabIndex).Left + 5 rct.Top = Multipage1.Pages(tabIndex).Top + 5 rct.Right = Multipage1.Pages(tabIndex).Left + Multipage1.Pages(tabIndex).Width - 5 rct.Bottom = Multipage1.Pages(tabIndex).Top + Multipage1.Pages(tabIndex).Height - 5 ' 设置背景色(浅蓝色)和前景色(深蓝色) SetBkColor hdc, RGB(200, 230, 255) SetTextColor hdc, RGB(0, 50, 100) tabCaption = Multipage1.Pages(tabIndex).Caption DrawText hdc, tabCaption, Len(tabCaption), rct, DT_CENTER Or DT_VCENTER Or DT_SINGLELINE ReleaseDC Multipage1.hwnd, hdc Next tabIndex End Sub
⚠️ 注意:如果需要更精准的消息拦截,建议结合SetWindowLongPtr进行控件子类化,避免绘制冲突;使用API时要注意内存释放,防止泄漏。
方案二:用按钮+Frame模拟Multipage(无API依赖)
放弃原Multipage的按钮样式,用独立CommandButton和Frame控件模拟Tab切换,完全自定义样式:
在窗体上添加多个
CommandButton(如cmdTab1、cmdTab2),直接设置它们的ForeColor、BackColor属性,比如:- 未选中按钮:
BackColor=RGB(240,240,240),ForeColor=RGB(0,0,0) - 选中按钮:
BackColor=RGB(200,230,255),ForeColor=RGB(0,50,100)
- 未选中按钮:
添加对应数量的
Frame控件(如fraPage1、fraPage2),将原Multipage中的控件移到对应Frame里,初始设置所有Frame的Visible=False。编写按钮点击事件切换页面:
Private Sub cmdTab1_Click() ' 隐藏所有页面 fraPage1.Visible = False fraPage2.Visible = False ' 显示当前页面 fraPage1.Visible = True ' 更新按钮样式 cmdTab1.BackColor = RGB(200, 230, 255) cmdTab1.ForeColor = RGB(0, 50, 100) cmdTab2.BackColor = RGB(240, 240, 240) cmdTab2.ForeColor = RGB(0, 0, 0) End Sub Private Sub cmdTab2_Click() fraPage1.Visible = False fraPage2.Visible = True cmdTab2.BackColor = RGB(200, 230, 255) cmdTab2.ForeColor = RGB(0, 50, 100) cmdTab1.BackColor = RGB(240, 240, 240) cmdTab1.ForeColor = RGB(0, 0, 0) End Sub
这种方法无需依赖API,样式完全可控,适合对自定义程度要求高且不想处理复杂API逻辑的场景。
内容的提问来源于stack exchange,提问作者Piero Begelle The Middleman
相关产品推荐
相关产品推荐

