首先,需要一个画笔函数,此函数用于响应消息为WM_CTLCOLOR的消息,当子控件要被绘制的时候,主窗口调用这个函数。
于是,我要改变颜色的话,那么点击另外一个按钮,启动绘图的函数时,就会调用这个函数,来用这个函数设置的方法绘制,比如这里设置颜色
如果控制为CTLCOLOR_EDIT,也就是说是改变的EDIT控件的颜色,那么就相应的用pDC->SetTextColor()来实现。
总体来说,每当子控件要被绘制时,需要调用这个函数,因此进行重写,实现个性化的要求。
HBRUSH CTest10Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
if(nCtlColor == CTLCOLOR_EDIT)
pDC->SetTextColor(color);
// TODO: Return a different brush if the default is not desired
return hbr;
}
然后在每一个RadioButton中添加响应的方法,设置这个color,于是每次就会响应并设置这个Color,至此,在绘制的时候就会显示新的颜色。
另外一点是在RadioButton的上面,见代码:
static COLORREF color=RGB(0,0,0);
void CTest10Dlg::OnRadio1()
{
// TODO: Add your control notification handler code here
color = RGB(255,0,0);
GetDlgItem(IDC_EDIT1)->SetFocus();
}
看到上处,用到的是一个static变量Color来实现这个,当然也可以作为类成员初始化,然后设置完了后,每一个RadioButton响应函数中都可以改变这个color的值,改变后,主窗口就会自动调用前面的那个函数,根据颜色来绘制。关键的问题是:后面的那个SetFocus()函数有什么用呢?
试着注释掉吧,我先前注释后,点击RadioButton没有反映,然后只有当鼠标放到EditBox的时候,激活这个控件才有作用,为何?
从这里可以知道SetFocus的作用,就是设置该控件为当前的活动控件,也就是激活这个控件的意思,如果不激活,那么只有手动激活才可以使得子控件被激活,请求绘制,此时主窗口才会调用相应的函数来重新绘制的。
去掉这个,就会出现问题。必须手动的激活。。。
于是知道了这个函数的作用:
SetFocus的作用,就是激活某个控件,使得它成为活动控件,导致被绘制或者其他的消息。
当然,原书上是用一个成员m_edit作为控件,而我这里是自己做了一个EditBox控件,于是我想到了GetDlgItem的作用,就是获得某个指定ID控件的指针,然后书上是:m_edit.SetFocus();而我这里就是一个指针对应的调用SetFocus(),效果实际相同。成功!
下载地址:
http://www.pudn.com/detail.asp?id=1059826
posted on 2010-02-05 19:58
deercoder 阅读(1212)
评论(0) 编辑 收藏 引用