MFC自绘按钮的实现,按钮动态效果
最近项目需要实现按钮的动态效果,多方学习,现在终于能实现一些功能了。
过程如下:
第一,新建一MFC对话框应用程序。
第二,删除自带按钮,并添加两个按钮,button1,button2,ID为IDB_BUTTON1,IDB_BUTTON2.同时响应鼠标单击按钮事件。如下
void Cbutton_fly3Dlg::OnBnClickedButton2()//video2
{
// TODO: 在此添加控件通知处理程序代码
MessageBox(L"video2");//这里简单测试一下
}
第三,添加位图资源,在资源视图下添加几张图片,如下图

第四,设置按钮参数OwnerDraw为true,此参数说明,按钮的绘制有使用者自己绘制。我的环境是VS2010,位置如下:

第五,添加消息响应函数WM_DRAWITEM,相应用户的按键操作,如图
在OnDrawItem()函数内部添加处理函数,我打算加载两个位图,在按钮按下以及释放时显示图片。
CDC buttonDC;
CBitmap bitmapTrans;
BITMAP bmp;
CDC mem;
CRect rc;
buttonDC.Attach(lpDrawItemStruct->hDC);//得到用于绘制按钮的DC
mem.CreateCompatibleDC(&buttonDC);//准备向按钮区域传输图形 if (lpDrawItemStruct->CtlID == IDC_BUTTON1)
{
rc = lpDrawItemStruct->rcItem;//获取按钮所占的矩形大小
UINT state = lpDrawItemStruct->itemState;//获取按钮当前的状态,不同状态绘制不同的按钮
if (state & ODS_FOCUS)//如果按钮已经取得焦点,绘制选中状态下的按钮
{
bitmapTrans.LoadBitmap(IDB_BITMAP2);
bitmapTrans.GetBitmap(&bmp);
CBitmap * old = mem.SelectObject(&bitmapTrans);
//向按钮传输位图,使用stretcnblt可以使图片随按钮大小而改变
buttonDC.StretchBlt(rc.left,rc.top,rc.right,rc.bottom,&mem,,,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
mem.SelectObject(old);
bitmapTrans.DeleteObject();
}
else //如果按钮已经取得焦点,绘制选中状态下的按钮
{
bitmapTrans.LoadBitmap(IDB_BITMAP3);
CBitmap *old2 = mem.SelectObject(&bitmapTrans);
bitmapTrans.GetBitmap(&bmp);
CBitmap *old=mem.SelectObject(&bitmapTrans);
buttonDC.StretchBlt(rc.left,rc.top,rc.right,rc.bottom,&mem,,,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
mem.SelectObject(old2);
bitmapTrans.DeleteObject();
}
}
我只是把图片的颜色稍微变了一下,但是效果在运行时可以明显看出来。效果如图:

部分重要代码:
void Cbutton_fly3Dlg::OnBnClickedButton1()//video1
{
// TODO: 在此添加控件通知处理程序代码
MessageBox(L"video1"); } void Cbutton_fly3Dlg::OnBnClickedButton2()//video2
{
// TODO: 在此添加控件通知处理程序代码
MessageBox(L"video2");
} void Cbutton_fly3Dlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//自绘按钮的实现
CDC buttonDC;
CBitmap bitmapTrans;
BITMAP bmp;
CDC mem;
CRect rc;
buttonDC.Attach(lpDrawItemStruct->hDC);//得到用于绘制按钮的DC
mem.CreateCompatibleDC(&buttonDC);//准备向按钮区域传输图形 if (lpDrawItemStruct->CtlID == IDC_BUTTON1)
{
rc = lpDrawItemStruct->rcItem;//获取按钮所占的矩形大小
UINT state = lpDrawItemStruct->itemState;//获取按钮当前的状态,不同状态绘制不同的按钮
if (state & ODS_FOCUS)//如果按钮已经取得焦点,绘制选中状态下的按钮
{
MFC自绘按钮的实现,按钮动态效果的更多相关文章
- Chapter 4. Button, Checkbutton, and Radiobutton Widgets 按钮,复选按钮,单选按钮
Chapter 4. Button, Checkbutton, and Radiobutton Widgets 按钮,复选按钮,单选按钮 几乎所有的Perl/Tk 应用使用按钮以这样或者那样的方式 ...
- C# 动态生成的按钮及定义按钮的事件的代码
内容闲暇时间,把内容过程中比较常用的内容备份一下,如下的内容内容是关于C# 动态生成的按钮及定义按钮的事件的内容,应该对码农们也有用途. HtmlGenericControl control = ne ...
- iOS 11开发教程(二十一)iOS11应用视图美化按钮之实现按钮的响应(1)
iOS 11开发教程(二十一)iOS11应用视图美化按钮之实现按钮的响应(1) 按钮主要是实现用户交互的,即实现响应.按钮实现响应的方式可以根据添加按钮的不同分为两种:一种是编辑界面添加按钮实现的响应 ...
- iOS 11开发教程(二十)iOS11应用视图美化按钮之设置按钮的状态
iOS 11开发教程(二十)iOS11应用视图美化按钮之设置按钮的状态 在示例2-2中,设置按钮的标题和颜色时,需要对按钮的状态进行设置,表示按钮在某一状态下的标题和标题颜色是什么样子.例如,UICo ...
- iOS 11开发教程(十九)iOS11应用视图美化按钮之设置按钮的外观
iOS 11开发教程(十九)iOS11应用视图美化按钮之设置按钮的外观 美化按钮说白了就是对按钮的属性进行设置,设置按钮的属性有两种方法:一种是使用编辑界面中的属性检查器:另一种是使用代码进行设置.以 ...
- 如何调换antd中Modal对话框确认按钮和取消按钮两个按钮的位置
今天有个工作是把所有的确认按钮放在取消按钮的左边,类似于下图这样的,公司用的时antd组件 但是antd组件的按钮时确认键放在右边的 可以采用下面的方式,将按钮调换过来: 对的,就是在modal里面的 ...
- 提问(prompt 消息对话框)用于询问一些需要与用户交互的信息。弹出消息对话框(包含一个确定按钮、取消按钮与一个文本输入框)
提问(prompt 消息对话框) prompt弹出消息对话框,通常用于询问一些需要与用户交互的信息.弹出消息对话框(包含一个确定按钮.取消按钮与一个文本输入框). 语法: prompt(str1, s ...
- wxpython(2)--按钮,位图按钮,滑动块,微调控制器
本文介绍按钮,位图按钮,滑动块,微调控制器**.. 按钮 基本按钮 创建一个按钮,绑定点击事件,点击后修改Label 123456789101112131415161718 import wx cla ...
- 使用 JavaScript 中的 document 对象查找 HTML 元素,实现“登录”按钮的高亮特效 鼠标悬浮于“登录”按钮时,按钮高亮显示;
查看本章节 查看作业目录 需求说明: 使用 JavaScript 中的 document 对象查找 HTML 元素,实现"登录"按钮的高亮特效 鼠标悬浮于"登录" ...
- 通过HTML+CSS+Javascript实现向下滚动滚动条出现导航栏并出现回到顶部按钮点击按钮回到顶部(一)
回到顶部实例一 效果:默认隐藏导航栏,当滚动条滚到超过300px后导航栏和按钮出现,点击回到顶部按钮回到顶部,并隐藏导航栏和按钮(导航栏和按钮都是固定定位) <!doctype html> ...
随机推荐
- zblog去除底部版权信息 “请勿修改或删除主题版权及作者信息”
场景:使用了免费模板,但底部带作者版权.删除版权信息的代码后访问前台弹窗:请勿修改或删除主题版权及作者信息... 1. 删除版权信息代码 使用notepad++搜索功能,搜索版权信息:如ABC,找到相 ...
- Easy UI 关联表的字段展示
刚接触的easy UI ,发现展示关联表的字段的时候,卡住了 好一段时间,后来通过qq群询问,终于得到答案 实体Record public class Record:Base { public Gui ...
- MVC4学习之官方教程中迁移版本库报错
因工作需要,学习MVC4,但是微软官方教程中迁移版本库步骤在本地测试报错 官方教程地址:http://www.asp.net/mvc/overview/older-versions/getting-s ...
- Python+selenium之fixtures
fixtures即可以表示测试用例的开始和结束,也可以表示测试类和测试模块的开始和结束. import unittest def setUpModule(): print("test mod ...
- winform 配置文件增删改查
winform 配置文件是 App.config webform 的配置文件 是web.config 其实基本操作都一样 设置个配置文件 全局文件 访问者个配置文件 对这个配置文件增删 ...
- WinForm 窗体
Winform是.NET开发中对windows Form的一种称谓,form是窗体的意思,winform 称之为windows form. 一般中我们使用的东西分为 客户端.网页.APP 三大类. w ...
- [windows]窗口文件夹中使用常见任务
文件夹中使用常见任务,如截图所示增加红色框部分. 设置步骤: 我的电脑--〉右键--〉属性--〉高级选项--〉性能设置--〉自定义:勾选在文件夹中使用常见任务.
- 通过Java代码实现图片的放大和缩小
本文介绍的例子在Android安卓手机上测试通过. 先看看效果吧.可以看到这个开发好的安卓应用有三个按钮:Zoom In缩小图片,Zoom Out放大图片和Save保存. 初始页面: 可以在左边边框自 ...
- 使用FileSystemWatcher组件监视日志文件
实现效果: 知识运用: FileSystemWatcher组件的Path属性 Filter属性 //要监视那些文件 默认为*.* Endinit方法 //结束在窗体上使用或有另一个组件使用的Fil ...
- hadoop相关资料集锦
1 Hadoop集群系列集锦http://www.cnblogs.com/xia520pi/archive/2012/04/08/2437875.html 2 Hadoop和MapReduce详解ht ...