MFC 自绘按钮的实现

 

MFC自绘按钮的实现

自绘按钮的实现过程

  • 申明自绘属性
  • 进行VM_MESUREITEM事件响应,说明按钮的尺寸
  • 进行VM_DRAWITEM消息的重新响应,说明如何绘制按钮

首先在vc6中新建工程,选择MFC并且新建dialog工程

输入工程名,然后将生成的按钮等删除,重新添加两个按钮。

MFC 自绘按钮的实现_第1张图片

为按钮设置属性

MFC 自绘按钮的实现_第2张图片

选择自绘,就是自己向上贴图

在dlg类的对象上添加WM_DRAWITEM属性

MFC 自绘按钮的实现_第3张图片

在生成的OnDrawItem方法中添加如下代码

 

view source print ?
01 //添加绘图函数
02 void CMy40_mybuttonDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
03 {
04     // TODO: Add your message handler code here and/or call default
05     CDC ButtonDC;
06     CBitmap bitmapTrans;
07     BITMAP bmp;
08     CDC mem;
09     CRect rc;
10     //得到用于绘制按钮的DC
11     ButtonDC.Attach(lpDrawItemStruct->hDC);
12     //准备用于向按钮区域传输位图
13     mem.CreateCompatibleDC(&ButtonDC);
14     //获取按钮所占的矩形大小
15     rc=lpDrawItemStruct->rcItem;
16     //获取按钮目前所处的状态,根据不同的状态绘制不同的按钮
17     UINT state = lpDrawItemStruct->itemState;
18     //如果按钮已经得到焦点,绘制选中状态下的按钮
19     if(state&ODS_FOCUS)
20     {
21         bitmapTrans.LoadBitmap(IDB_BITMAP1);
22         bitmapTrans.GetBitmap(&bmp);
23         CBitmap *old=mem.SelectObject(&bitmapTrans);
24         //向按钮所在位置传输位图
25         //使用StretcnBlt的目的是为了让位图随按钮的大小而改变
26         ButtonDC.StretchBlt(rc.left,rc.top,rc.right,rc.bottom,&mem,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
27         mem.SelectObject(old);
28         bitmapTrans.DeleteObject();
29         //设置文字背景为透明
30         ButtonDC.SetBkMode(TRANSPARENT);
31         ButtonDC.DrawText("已选中",&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
32     }
33     else
34     {
35         bitmapTrans.LoadBitmap(IDB_BITMAP2);
36         CBitmap *old2 = mem.SelectObject(&bitmapTrans);
37         bitmapTrans.GetBitmap(&bmp);
38         CBitmap *old=mem.SelectObject(&bitmapTrans);
39         ButtonDC.StretchBlt(rc.left,rc.top,rc.right,rc.bottom,&mem,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
40         ButtonDC.SetBkMode(TRANSPARENT);
41         ButtonDC.DrawText("未选中",&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
42         mem.SelectObject(old2);
43         bitmapTrans.DeleteObject();
44     }
45   
46     CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
47 }

编译运行,运行后得到效果如果所示

 

MFC 自绘按钮的实现_第4张图片

你可能感兴趣的:(mfc,dialog)