随笔-145  评论-173  文章-70  trackbacks-0
首先,需要一个画笔函数,此函数用于响应消息为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 阅读(1208) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理