繁体   English   中英

从派生的 CEdit 更改文本和背景颜色 class

[英]Change text and background color from a CEdit derived class

我有一个来自CEdit的 class,我想更改文本和背景颜色。 我试过消息ON_WM_CTLCOLOR_REFLECTON_WM_CTLCOLOR ,但我从未收到这些消息。 除了ON_PAINT还有其他选择吗?

以下是我如何初始化CColorEdit控件:

//in my dialog.h
CColorEdit m_test;
//in .cpp
DDX_Control(pDX, IDC_TEST, m_test);

我不能像这样手动设置颜色:

m_test.SetTextColor(...);

这是我尝试处理ON_WM_CTLCOLOR的方式:

BEGIN_MESSAGE_MAP(CColorEdit, CEdit)
    ON_WM_CTLCOLOR()
END_MESSAGE_MAP()

HBRUSH CColorEdit::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CEdit::OnCtlColor(pDC, pWnd, nCtlColor);
    if (m_theme != 0)
    {
        pDC->SetTextColor(RGB(0, 255, 0));
    }
    return hbr;
}

这是我对WM_CTLCOLOR_REFLECT的尝试:

BEGIN_MESSAGE_MAP(CColorEdit, CEdit)
    //{{AFX_MSG_MAP(CColorEdit)
    ON_WM_CTLCOLOR_REFLECT()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CColorEdit::SetTextColor(COLORREF textColor)
{
    m_textColor = textColor;
    Invalidate();
}
void CColorEdit::SetBkColor(COLORREF backgroundColor)
{
    m_backgroundColor = backgroundColor;
    m_brBkgnd.DeleteObject();
    m_brBkgnd.CreateSolidBrush(backgroundColor);
    Invalidate();
}

HBRUSH CColorEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
    pDC->SetBkColor(m_backgroundColor);
    pDC->SetTextColor(m_textColor);

    if (nCtlColor)       // To get rid of compiler warning
        nCtlColor += 0;

    return hbr;
}

谢谢。

这里 去引用:

简单地更改CEdit的背景颜色对我来说是一个真正的挑战。 我很惊讶地发现没有标准的 function(例如CEdit::SetBkColor )来执行此操作。

第一步是创建从CEdit派生的 class 并声明 function CtlColor

// CustomEdit.h
class CCustomEdit : public CEdit
{
protected:
  HBRUSH CtlColor(CDC *pDC, UINT);
  DECLARE_MESSAGE_MAP()
};

二、处理WM_CTLCOLOR_REFLECT事件:

// CustomEdit.cpp
BEGIN_MESSAGE_MAP(CCustomEdit, CEdit)
  ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()

HBRUSH CCustomEdit::CtlColor(CDC *pDC, UINT)
{
  COLORREF bkColor = RGB(255, 255, 255);
  pDC->SetBkColor(bkColor);
  return CreateSolidBrush(bkColor);
}

所以你需要同时使用它们!

如果你制作CColorEdit class 只是为了执行这种自定义颜色绘图,则不需要它,因为你可以简单地处理父 window 中的WM_CTLCOLOR消息。该消息实际上是WM_CTLCOLOREDITWM_CTLCOLOR在旧的 windows 版本中使用),然而 MFC 将所有WM_CTLCOLORxxxx消息映射到ON_WM_CTLCOLOR处理程序并将控件类型作为参数传递。

这是一些代码:

#define COLOR_YELLOW RGB(255,255,0)
HBRUSH hBrYellow = []() { return CreateSolidBrush(COLOR_YELLOW); }();

HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    // Our custom edit-control
    if (nCtlColor == CTLCOLOR_EDIT && pWnd->GetDlgCtrlID() == IDC_MYCUSTOMEDIT)
    {
        pDC->SetBkColor(COLOR_YELLOW);
        return hBrYellow;
    }

    // All the rest
    return CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
}

此代码示例将编辑控件的背景颜色设置为黄色。 编辑控件是一个简单标准的 windows 编辑框,无需子类化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM