专栏首页cloudskymeMFC自绘按钮的实现

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);
}

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 红帽的PAAS平台openshift

    什么是paas PaaS是Platform-as-a-Service的缩写,意思是平台即服务。 把服务器平台作为一种服务提供的商业模式。通过网络进行程序提供的服...

    cloudskyme
  • java.lang.IllegalArgumentException: Wrong FS: hdfs://localhost:54310/user/Hadoop/b, expected: file:/

     java.lang.IllegalArgumentException: Wrong FS: hdfs://localhost:54310/user/Hadoo...

    cloudskyme
  • C++动态链接库

    动态链接库 动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL 是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可...

    cloudskyme
  • 使用宝塔控制面板建站时出现网页出现404错误怎么办?

    发迹创业网,最近在使用宝塔面板建站的时候发现,网站建设好之后,打开网页提示“404错误,文件不存在”,这是怎么回事呢?重新检查了一下,所有的步骤都是按照以前的流...

    发迹创业网www.082765.com
  • why we need a undefined parameter in function signature

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    Jerry Wang
  • 浅尝Python快速排序

    用户1634449
  • PHP与语音识别功能现在也是很普遍了

    将语音实时识别为文字,适用于语音聊天、语音输入、语音搜索、语音下单、语音指令、语音问答等多种场景。

    php007
  • Golang之(for)用法

    地鼠每次选好了一块地,打洞,坚持半个月发现地下有块石头,然后他就想绕路了。。。殊不知绕路只会让它离成果越来越远

    超蛋lhy
  • 安卓不再支持华为手机,国外网友怎么看

    据国外媒体报道,谷歌母公司Alphabet已按特朗普要求,停止与华为相关的业务和服务,涉及硬件、软件和技术服务,包括旗下手机操作系统:安卓。

    挖数
  • 如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?

    Java 提供了不同层面的线程安全支持。在传统集合框架内部,除了 Hashtable 等同步容器,还提供了所谓的同步包装器(Synchronized Wrapp...

    葆宁

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动