我有一个来自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;
}
谢谢。
答案 0 :(得分:1)
查看here。引用:
对
CEdit
进行简单的背景颜色更改对我来说是一个真正的挑战。令我惊讶的是,没有像CEdit::SetBkColor
这样的标准函数可以做到这一点。
第一步是创建从CEdit
派生的类并声明函数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);
}
因此,您需要同时使用两者!
答案 1 :(得分:0)
如果将CColorEdit
类仅用于执行这种自定义彩色绘图,则不需要它,因为您可以在父窗口中简单地处理WM_CTLCOLOR
消息。该消息实际上是WM_CTLCOLOREDIT
(在旧的Windows版本中使用了WM_CTLCOLOR
),但是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编辑框,无需子类化。