MFC 自绘按钮的实现

 

MFC自绘按钮的实现

自绘按钮的实现过程

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

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

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

为按钮设置属性

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

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

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

 

01//添加绘图函数
02void 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}

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

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值