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

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

时间: 2024-10-01 02:30:18

MFC自绘按钮的实现的相关文章

VC用Win API实现自绘按钮类

俗话说佛要金装.人要衣装,作软件的当然得要个好界面啦^_^.网上提供的控件自绘基本上是MFC或WTL封装好的类,对于不想用MFC的人来说是一无是处的,我可是WIN32API的坚决拥护者.因为MFC等也是用WIN32API封装起来的,学好了WIN32API,可以深入的了解WINDOWS内部的机制,编写出来的程序才能得到更好的优化. 下面分析一下自绘按钮的原理,用过MFC自绘按钮的人都知道,是通过重载了父窗口WM_DRAWITEM的响应消息实现的.同时也要子类化按钮来得到按钮的其他有用的消息,比如W

自绘按钮补遗

(包括:改进后的CXPButton类.练习程序.练习程序答案) 在<自绘按钮的实现>一文中所示范的CXPButton按钮从形状上看可以说是一个不规则按钮.我们把MFC中提供的控件成为标准控件,而其中的按钮控件则可称为规则按钮,因为它是的形状是一个规则的矩形.但是随着流线型设计在界面设计中被广泛采用,越来越多的程序设计者都乐意在自己的作品中加入一些非规则形状的控件.以按钮为例,最简单的就到有圆形按钮,三角按钮等.下图是一组定义好的圆形按钮: 但是这些在我们眼中似乎呈现出不规则形状的按钮,有时候的

自绘按钮的实现

如果你希望能够在自己的程序中表现出新意,那么你一定不会仅仅满足于MFC提供那些标准控件.这时,我们就必须自己另外多做些工作了.就改变控件外观这一点来说,主要是利用控件的自绘功能(Owner Draw)实现的.本篇将和各位一起定义一个XP风格的CXPButton按钮类,目的不在于介绍CXPButton类的使用技巧,而在于向各位阐述实现自绘按钮的方法.当然如果你觉得CXPButton有用的话,也可以把它的源文件保存下来,直接加入到自己的项目中. 一.准备工作 在开始编码之前,首先应该确定好,更准确的

MFC自绘控件学习总结

前言:从这学期开始就一直在学习自绘控件(mfc),目标是做出一款播放器界面,主要是为了打好基础,因为我基础实在是很烂....说说我自己心得体会以及自绘控件的方法吧,算是吐槽吧,说的不对和不全的地方,或者有更好的方法,请不吝赐教. 我的机器环境是:Windows7旗舰版 Service Pack 1,Visual studio 2005 1).重绘某个控件时,强烈推荐使用子类化方法,比如想自绘Button控件, 首先添加自己的类CMYButton 继承自 CButton ,声明一个CMYButto

vc++-在mfc中添加按钮,怎么可以实现按钮按下和弹起两个功能

问题描述 在mfc中添加按钮,怎么可以实现按钮按下和弹起两个功能 也就是按钮按下为启动,但不会自己弹起,再按一遍按钮弹起,停止.大神求详细点,接触VC++时间不长 解决方案 标准MFC 按钮控件不支持这个 不过你不一定要按钮不可弹起,可以修改按钮上面的文字,比如开始显示"启动",按下以后变成"结束" 解决方案二: 你用Button的BS_CHECKBOX来模拟即可.自绘CButton 解决方案三: [MFC]按钮提示功能的实现MFC添加一个按钮,实现浏览功能 解决方

MFC自绘控件学习总结第二贴---转

首先感谢大家对第一帖的支持,应一些网友烈要求下面我在关于上一贴的一些补充和说明(老鸟可以无视)这一贴是实战+理论不知道第一帖的先看第一帖:http://topic.csdn.net/u/20110710/19/5209f358-31c8-4057-b108-02155a417fd0.html 1).补充个高级可重载函数PreSubclassWindow(),我的理解是允许用户在子类化之前再做一额外些处理 ,这个重载函数也是非常重要的,要引起相当的注意.可以在这里改变控件的大小,位置,窗口样式,字

MFC自绘控件学习总结第二贴

首先感谢大家对第一帖的支持,应一些网友烈要求下面我在关于上一贴的一些补充和说明(老鸟可以无视)这一贴是实战+理论不知道第一帖的先看第一帖:http://topic.csdn.net/u/20110710/19/5209f358-31c8-4057-b108-02155a417fd0.html 1).补充个高级可重载函数PreSubclassWindow(),我的理解是允许用户在子类化之前再做一额外些处理 ,这个重载函数也是非常重要的,要引起相当的注意.可以在这里改变控件的大小,位置,窗口样式,字

mfc如何用按钮打开新的对话框

问题描述 mfc如何用按钮打开新的对话框 想通过单击按钮打开新的对话框.不要原来的对话框.求教我该如何写代码 解决方案 你在按键的处理中,定义一个新窗体的变量,然后调用此变量对应的方法显示窗体即可.以前的窗体,是需要关闭或隐藏,也需要你来处理 解决方案二: 你在按键的处理中,定义一个新窗体的变量,然后调用此变量对应的方法显示窗体即可. 解决方案三: 首先在资源视图里面添加一个新的dlg对话框,然后给这个对话框添加一个类,之后在之前的按钮所在的文件里添加这个心的对话框对应的头文件,然后创建这个新的

不同MFC对话框之间按钮的点击的问题

问题描述 不同MFC对话框之间按钮的点击的问题 MFC关于按钮自动点击的问题,请问如何点击另一个窗口上的一个按钮,调用OnCutton1前面的对象名怎么写? 解决方案 不同窗口,是同一个程序的话,可以借助app对象传对方窗体的hwnd