自绘按钮的实现过程
- 申明自绘属性
- 进行VM_MESUREITEM事件响应,说明按钮的尺寸
- 进行VM_DRAWITEM消息的重新响应,说明如何绘制按钮
首先在vc6中新建工程,选择MFC并且新建dialog工程
输入工程名,然后将生成的按钮等删除,重新添加两个按钮。
为按钮设置属性
选择自绘,就是自己向上贴图
在dlg类的对象上添加WM_DRAWITEM属性
在生成的OnDrawItem方法中添加如下代码
02 | void CMy40_mybuttonDlg::OnDrawItem( int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) |
11 | ButtonDC.Attach(lpDrawItemStruct->hDC); |
13 | mem.CreateCompatibleDC(&ButtonDC); |
15 | rc=lpDrawItemStruct->rcItem; |
17 | UINT state = lpDrawItemStruct->itemState; |
21 | bitmapTrans.LoadBitmap(IDB_BITMAP1); |
22 | bitmapTrans.GetBitmap(&bmp); |
23 | CBitmap *old=mem.SelectObject(&bitmapTrans); |
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(); |
30 | ButtonDC.SetBkMode(TRANSPARENT); |
31 | ButtonDC.DrawText( "已选中" ,&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE); |
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(); |
46 | CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct); |
编译运行,运行后得到效果如果所示