自绘控件之按钮类

准备制作自己的控件类,按钮是第一个,我会将我在其中遇到困难和大家分享一些,只要实现下面的功能,按钮类就可以满足大部分的需求

按钮类功能:

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

原文地址:https://www.cnblogs.com/findumars/p/5801429.html