最近练习VC的界面设计,想给Edit的颜色改改,在父对话框的CtlColor函数中可通过if(nCtlColor==CTLCOLOR_EDIT){……}控制,但是由于软件中有多个对话框(20多),所以在每个父对话框都重写CtlColor函数非常麻烦(程序中所有Edit均用同一种颜色,虽然代码完全可以复制,但是觉得这不是一个好方法),于是就想到了重载CEdit类,从CEdit派生了一个CMyEdit类,同时对CEdit的CtlColor函数进行重写,如下:
HBRUSH CMyEdit::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
// HBRUSH hbr = CEdit::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
// MessageBox("CTLCOLOR");
pDC->SetBkColor(RGB(255,0,0));
pDC->SetTextColor(RGB(0,255,0));
CBrush brush;
brush.CreateSolidBrush(RGB(0,255,0));
return brush;
// TODO: Return a different brush if the default is not desired
// return hbr;
}再对父对话框的Edit控件关联CMyEdit类型的控件成员变量m_MyEdit
然后运行程序,发现所关联CMyEdit变量的控件颜色并无改变,还是原来的白色
于是在CMyEdit::OnCtlColor函数中添加了以个MessageBox,并加一个断点,在CMyEdit::CMyEdit中增加一个断点,调试运行,发现运行时在CMyEdit::CMyEdit中最先停下,继续调试运行,并没有转到CMyEdit::OnCtlColor中,也没有MessageBox窗口出现,就直接出现了父对话框,并且关联CMyEdit的控件颜色是白色的
请大虾们指教下,这么做可以实现Edit控件的颜色控制吗?如果可以,是哪里出了问题?如果不可以,还有别的方法吗?
HBRUSH CMyEdit::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
// HBRUSH hbr = CEdit::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
// MessageBox("CTLCOLOR");
pDC->SetBkColor(RGB(255,0,0));
pDC->SetTextColor(RGB(0,255,0));
CBrush brush;
brush.CreateSolidBrush(RGB(0,255,0));
return brush;
// TODO: Return a different brush if the default is not desired
// return hbr;
}再对父对话框的Edit控件关联CMyEdit类型的控件成员变量m_MyEdit
然后运行程序,发现所关联CMyEdit变量的控件颜色并无改变,还是原来的白色
于是在CMyEdit::OnCtlColor函数中添加了以个MessageBox,并加一个断点,在CMyEdit::CMyEdit中增加一个断点,调试运行,发现运行时在CMyEdit::CMyEdit中最先停下,继续调试运行,并没有转到CMyEdit::OnCtlColor中,也没有MessageBox窗口出现,就直接出现了父对话框,并且关联CMyEdit的控件颜色是白色的
请大虾们指教下,这么做可以实现Edit控件的颜色控制吗?如果可以,是哪里出了问题?如果不可以,还有别的方法吗?
按这位大虾说的,添加后函数如下:HBRUSH CMyEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
// TODO: Change any attributes of the DC here
pDC->SetBkColor(RGB(255,0,0));
pDC->SetTextColor(RGB(0,255,0));
CBrush brush;
brush.CreateSolidBrush(RGB(0,255,0));
// TODO: Return a non-NULL brush if the parent's handler should not be called
return NULL;
}
增加断点,调试运行到了这个函数中
调试运行时无法看到Edit控件的颜色,于是正常运行
但是正常运行后,发现Edit控件的颜色还是没有改变
请这位大虾再赐教下。。
而你CMyEdit类没有子窗口,你需要更改的是自己的背景颜色。
建议响应WM_ERASEBKGND消息。
重载CMyEdit::OnEraseBkgnd(CDC*)消息响应函数
表示是反射消息,就是父窗口收到这个消息后,反射给子窗口处理
看它的定义ON_WM_CTLCOLOR_REFLECT(),有个REFLECT
我的理解只要改变了DC的字体颜色,同样能完成你的目的。
你试一试吧
HBRUSH CMyEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
// TODO: Change any attributes of the DC here
pDC->SetBkColor(RGB(255,0,0));
pDC->SetTextColor(RGB(0,255,0));
CBrush brush;
brush.CreateSolidBrush(RGB(0,255,0));
// TODO: Return a non-NULL brush if the parent's handler should not be called
return NULL;
}在这个函数中,当return NULL;时,pDC->SetBkColor(RGB(255,0,0));和pDC->SetTextColor(RGB(0,255,0));似乎都是等于白设了,但是当CBrush brush; brush.CreateSolidBrush(RGB(0,255,0)); return brush;时却可以实现对Edit控件的颜色控制,这是为什么呢?并且在brush.CreateSolidBrush(RGB(0,255,0));中,不管你选的是什么颜色,最后Edit控件的背景颜色和字体颜色好像只和pDC->SetBkColor(RGB(255,0,0));和pDC->SetTextColor(RGB(0,255,0));这两条语句有关,请问下这里的return是怎么个意思?还有这句注释语句也不太理解// TODO: Return a non-NULL brush if the parent's handler should not be called
希望多多指教!
如果你返回NULL,那么父窗口的WM_CTLCOLOR就会被调用,而父窗口OnCtlColor如果没有对EDIT控件做处理的话,那就跟什么都没写一样了。