如何获得CTabCtrl的背景颜色?

时间:2012-11-22 11:20:12

标签: c++ windows mfc tabs

我的对话框中有一个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提供画笔来绘制标签的背景,唯一的麻烦是,我不知道如何获取标签的背景颜色,而是将其硬编码为{ {1}}。

即使我将标签重新显示在标签控件上,它们仍然会以灰色背景结束(即使标签控件具有白色背景)。

如何检索m_nullBrush.CreateStockObject(WHITE_BRUSH);的背景颜色?

1 个答案:

答案 0 :(得分:1)

您可以将控件放在子对话框中,并且必须使用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