1

我的对话框上有一个CTabCtrl,上面有几个标签 ( CStatic)。问题是,选项卡控件有白色背景,标签有灰色背景。我知道为什么 - 标签的父级实际上是对话框,而不是选项卡控件。但是,我应该能够使用CWnd::OnCtlColor为标签提供自定义背景画笔:

HBRUSH MyDialog::OnCtlColor(CDC *pDC, CWnd *pWnd, UINT nCtlColor)
{
    HBRUSH hBrush = __super::OnCtlColor(pDC, pWnd, nCtlColor);

    const int dialogId = pWnd->GetDlgCtrlID();
    if (dialogId == IDC_MY_CONTROL)
    {
        pDC->SetBkMode(TRANSPARENT);
        hBrush = m_nullBrush;
    }

    return hBrush;
}

在这里,我使用m_nullBrush提供了一个画笔来绘制标签的背景,唯一的麻烦是,我不知道如何获取选项卡的背景颜色,而是将其硬编码为m_nullBrush.CreateStockObject(WHITE_BRUSH);.

即使我将标签重新设置为标签控件的父级,它们仍然以灰色背景结束(即使标签控件具有白色背景)。

如何检索 a 的背景颜色CTabCtrl

4

1 回答 1

2

您可以将控件放在子对话框中,并且必须使用 为该子对话框启用主题EnableThemeDialogTexture

#include "Uxtheme.h"

...

BOOL CTabDemoDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    COneDlg* OneDlg= new COneDlg;
    OneDlg->Create(IDD_ONE, this);
    AddPage(OneDlg, L"One");

    return TRUE;
}

void CTabDemoDlg::AddPage(CDialog *Dialog, const wchar_t* Title)
{
    if (IsAppThemed())
        EnableThemeDialogTexture(*Dialog, ETDT_ENABLETAB);  

    CRect Rect;
    TabCtl.GetWindowRect(Rect);

    Rect.top+= 20;
    Rect.InflateRect(-4, -4);

    ScreenToClient(Rect);

    Dialog->MoveWindow(Rect);

    TabCtl.InsertItem(0, Title);
}

IDD_ONE DIALOGEX 0, 0, 224, 111
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_VISIBLE
EXSTYLE WS_EX_CONTROLPARENT
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    CONTROL         "Check1",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,16,39,10
    LTEXT           "Static",IDC_STATIC,20,36,19,8
    EDITTEXT        IDC_EDIT1,20,48,40,14,ES_AUTOHSCROLL
    PUSHBUTTON      "Button1",IDC_BUTTON1,84,16,50,14
END
于 2012-11-22T21:06:17.710 回答