MFC自绘按钮的实现

简介:

自绘按钮的实现过程

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

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

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

为按钮设置属性

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

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

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


//添加绘图函数
void CMy40_mybuttonDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
 // TODO: Add your message handler code here and/or call default
 CDC ButtonDC;
 CBitmap bitmapTrans;
 BITMAP bmp;
 CDC mem;
 CRect rc;
 //得到用于绘制按钮的DC
 ButtonDC.Attach(lpDrawItemStruct->hDC);
 //准备用于向按钮区域传输位图
 mem.CreateCompatibleDC(&ButtonDC);
 //获取按钮所占的矩形大小
 rc=lpDrawItemStruct->rcItem;
 //获取按钮目前所处的状态,根据不同的状态绘制不同的按钮
 UINT state = lpDrawItemStruct->itemState;
 //如果按钮已经得到焦点,绘制选中状态下的按钮
 if(state&ODS_FOCUS)
 {
 bitmapTrans.LoadBitmap(IDB_BITMAP1);
 bitmapTrans.GetBitmap(&bmp);
 CBitmap *old=mem.SelectObject(&bitmapTrans);
 //向按钮所在位置传输位图
 //使用StretcnBlt的目的是为了让位图随按钮的大小而改变
 ButtonDC.StretchBlt(rc.left,rc.top,rc.right,rc.bottom,&mem,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
 mem.SelectObject(old);
 bitmapTrans.DeleteObject();
 //设置文字背景为透明
 ButtonDC.SetBkMode(TRANSPARENT);
 ButtonDC.DrawText("已选中",&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
 }
 else
 {
 bitmapTrans.LoadBitmap(IDB_BITMAP2);
 CBitmap *old2 = mem.SelectObject(&bitmapTrans);
 bitmapTrans.GetBitmap(&bmp);
 CBitmap *old=mem.SelectObject(&bitmapTrans);
 ButtonDC.StretchBlt(rc.left,rc.top,rc.right,rc.bottom,&mem,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
 ButtonDC.SetBkMode(TRANSPARENT);
 ButtonDC.DrawText("未选中",&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
 mem.SelectObject(old2);
 bitmapTrans.DeleteObject();
 }
 
 CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}

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


目录
相关文章
|
7月前
MFC控件间介绍(二)
MFC控件间介绍(二)
46 0
14 MFC - 普通按钮 CButton
14 MFC - 普通按钮 CButton
45 0
|
C++
基于MFC实现选项卡控件练习
基于MFC实现选项卡控件练习
73 0
基于MFC实现选项卡控件练习
|
XML 程序员 C语言
Qt编写控件属性设计器2-拖曳控件
一、前言 上一篇文章把插件加载好了,并且把插件中的所有控件都显示到了列表框中,这次要做的就是实现拖曳控件的功能,用户选择一个控件拖曳到画布上,松开,在松开位置处自动实例化该控件,这个需要用到dropEvent和dragEnterEvent事件,重新实现这两个事件,对拖曳的对象进行过滤并调用函数实例化该控件,在实例化该控件的同时实例化控件跟随控件以便拉伸调整大小和位置。
918 0
|
程序员 C语言
Qt编写自定义控件48-面板窗体控件
一、前言 很多时候需要有一个控件,能够替代容器控件,自动容纳多个widget,自适应宽高,然后提供滚动条功能,这就必然需要用到QScrollArea控件,可设置各个子面板的间距等,也在很多系统中用到,比如温湿度设备面板,有几百个温湿度设备,需要一个容器放置,自动产生滚动条,可以设置面板的固定宽高或者自适应拉伸,其实就是放了表格布局+弹簧来设置。
1280 0
|
开发工具 C语言
Qt编写自定义控件9-导航按钮控件
一、前言 导航按钮控件,主要用于各种漂亮精美的导航条,我们经常在web中看到导航条都非常精美,都是html+css+js实现的,还自带动画过度效果,Qt提供的qss其实也是无敌的,支持基本上所有的CSS2属性,配合QPainter这个无敌大法工具,没有什么不能绘制的。
1278 0