准备制作自己的控件类,按钮是第一个,我会将我在其中遇到困难和大家分享一些,只要实现下面的功能,按钮类就可以满足大部分的需求
按钮类功能:
1、正常
2、光标在按钮区域上
3、按下
4、当前按钮为活动按钮
5、按钮不可用
6、位图按钮上显示名称
7、制作圆角矩形、圆形按钮
其中前三个都很好实现,下面是响应函数;
OnMouseLeave()//光标离开按钮区域
OnMouseHover()//光标在按钮区域
OnLButtonDown//按下
OnLButtonUp//松开
//以下4个问题都是在DrawItem(DRAWITEMSTRUCT lpdrawitemstruct)中添加代码
第四个问题的解决方式:
函数:DrawItem(DRAWITEMSTRUCT lpdrawitemstruct)
lpdrawitemstruct->itemState();//itemState:指定了当前绘制操作完成后,所绘项的可见状态。例如,如果菜单项应该被灰色显示,则可以指定ODS_GRAYED状态标志。其取值可以为下表中所示值的一个或者多个的联合。
【ODS_FOCUS=H8:如果菜单项将被选中,则可设置该值。该值只对菜单项有用。】
所以只要通过判断lpdrawitemstruct->itemState();是否等于ODS_FOCUS=H8:就可以设置按钮为当前活动按钮时的响应了。
第五个问题
函数:DrawItem(DRAWITEMSTRUCT lpdrawitemstruct)
lpdrawitemstruct->itemState();//itemState:指定了当前绘制操作完成后,所绘项的可见状态。例如,如果菜单项应该被灰色显示,则可以指定ODS_GRAYED状态标志。其取值可以为下表中所示值的一个或者多个的联合。
【ODS_DISABLED=H4:如果控件将被禁止,则设置该值。】
所以只要通过判断lpdrawitemstruct->itemState();是否等于ODS_DISABLED=H4:就可以设置按钮为不可用按钮时的响应了。
第六个问题:按钮上的名称怎么显示(我的按钮的几个状态都是位图切换)
CString add;
CDC ButtonDC;
ButtonDC.Attach(lpdrawitemstruct->hDC);//获取DC
ButtonDC.SetBkMode(TRANSPARENT);//字体背景透明
GetWindowText(add);
.DrawText(add,CRect(5,5,10,10),DT_CENTER | DT_VCENTER | DT_SINGLELINE);
第七个问题:怎么制作圆形按钮或者是圆角按钮
CRng rc;
rc.CreateRoundRect(0,0,rect.Width(),rect.Heignt(),50,50);//获取一个圆角矩形区域
::GetWindowRgn(lpdrawitemstruct->hwndItem,rc);
ButtonDC.SelectClipRng(&rc);
SetWindowRgn(rc,true)//有效区域
最后记得释放内存
ButtonDC.DeleteDC();
http://blog.csdn.net/bigtree_mfc/article/details/42269417