首页 > 解决方案 > 如何在 MFC 中更改 CDateTimeCtrl 的配色方案?

问题描述

CDateTimeCtrl我需要在 MFC中更改背景、文本、下拉按钮的颜色 。我创建了派生自的新类CDateTimeCtrl并尝试覆盖OnCtlColorand CtlColor,但从未调用过这些函数(已使用类向导添加了消息映射)。如果不编写自己的全新datetimectrl类,我应该如何实现这一点?

标签: mfc

解决方案


你可以尝试这样的事情:

// header
CBrush* m_pBkgBrush { nullptr };
COLORREF m_bkgColor { RGB(255, 255, 255) };

COLORREF SetBackgroundColor(BOOL bSysColor, COLORREF cr);

并立即实施:

CYourDateTimeCtrl::CYourDateTimeCtrl()
    : CDateTimeCtrl()
    , m_bkgColor(::GetSysColor(COLOR_WINDOW))
{
    m_pBkgBrush = new CBrush(::GetSysColor(COLOR_WINDOW));
}

CYourDateTimeCtrl::~CYourDateTimeCtrl()
{
    if (nullptr != m_pBkgBrush)
        delete m_pBkgBrush;
}

COLORREF CYourDateTimeCtrl::SetBackgroundColor(BOOL bSysColor, COLORREF cr)
{
    COLORREF color = m_bkgColor;
    m_bkgColor = bSysColor ? ::GetSysColor(COLOR_WINDOW) : cr;

    if (color != m_bkgColor)
    {
        delete m_pBkgBrush;
        m_pBkgBrush = new CBrush(m_bkgColor);
            Invalidate();
    }

    return color;
}

BOOL CYourDateTimeCtrl::OnEraseBkgnd(CDC* pDC) 
{
    CBrush* pOldBrush = pDC->SelectObject(m_pBkgBrush);
    CRect rect;
    pDC->GetClipBox(&rect);
    pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);
    pDC->SelectObject(pOldBrush);
    return TRUE;
}

使用时,您会:

MyMonthCalCtrl.SetBackgroundColor(FALSE, RGB(255, 255, 0));

我希望它有所帮助。


推荐阅读