【问题标题】:How to change the color scheme of CDateTimeCtrl in MFC?如何在 MFC 中更改 CDateTimeCtrl 的配色方案?
【发布时间】:2021-03-14 09:44:22
【问题描述】:

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

【问题讨论】:

  • 你必须像这样覆盖“OnCtlColor”函数:stackoverflow.com/questions/60095590/…
  • 看来CDateTimeCtrl控件和CCombBox不一样。 CDateTimeCtrl 不调用 OnCtlColor。
  • Windows 让制作自己的颜色主题变得特别困难。有时您确实需要从头开始重新实现控件。

标签: mfc


【解决方案1】:

你可以试试这样的:

// 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));

希望对你有帮助。

【讨论】:

  • 我会试一试的。文字颜色和右侧下拉按钮的颜色呢?
猜你喜欢
  • 2015-08-24
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 2017-10-30
相关资源
最近更新 更多