You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改设为fmTabStyleButtons的Multipage控件Tab按钮的ForeColor/BackColor属性

修改fmTabStyleButtons样式Multipage控件Tab按钮颜色的可行方案

当Multipage控件设置为fmTabStyleButtons时,Tab按钮会采用系统标准按钮的渲染逻辑,直接设置ForeColor或BackColor属性不会生效——控件会忽略这些自定义设置,优先使用系统主题样式。以下是两种可行的解决思路:

方案一:用Windows API自定义绘制Tab按钮

通过拦截控件的绘制消息,手动覆盖系统的渲染逻辑,实现自定义颜色:

  1. 先在标准模块中声明所需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
  1. 在用户窗体的代码中添加绘制逻辑(示例为遍历所有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切换,完全自定义样式:

  1. 在窗体上添加多个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)
  2. 添加对应数量的Frame控件(如fraPage1、fraPage2),将原Multipage中的控件移到对应Frame里,初始设置所有Frame的Visible=False。

  3. 编写按钮点击事件切换页面:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 09:27:03