Shaobo Zi
Shaobo Zi

Reputation: 729

How to change the color scheme of CDateTimeCtrl in MFC?

I need to change the colors of the background, the text, the color of the dropdown button of CDateTimeCtrl in MFC. I created new class derived from CDateTimeCtrl and tried overwritten OnCtlColor and CtlColor, but these functions are never called (the message map has been added using the Class Wizard). How should I achieve this without writing a completely new datetimectrl class of my own?

Upvotes: 0

Views: 293

Answers (1)

Flaviu_
Flaviu_

Reputation: 1346

You can try something like this:

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

COLORREF SetBackgroundColor(BOOL bSysColor, COLORREF cr);

and implementation now:

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;
}

When you use, you do:

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

I hope it helps.

Upvotes: 1

Related Questions