【发布时间】:2019-06-13 18:09:38
【问题描述】:
我有一个来自CEdit 的派生类,我想更改文本和背景颜色。我已尝试使用消息ON_WM_CTLCOLOR_REFLECT 和ON_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;
}
谢谢。
【问题讨论】:
-
展示一下你到目前为止所做的处理程序怎么样?你能确定他们没有被叫到吗?
-
@AndrewTruckle 我已经在 OnCtlColor 中放置了一个断点,但我永远不会进入该函数。我已经编辑了我的问题。我已经尝试了您链接中的示例,但仍然没有收到消息。
-
您是否在调试模式下运行?发布模式并不总是在断点处停止。
-
ON_WM_CTLCOLOR是这里的错误用法。显示您对ON_WM_CTLCOLOR_REFLECT的尝试