最近项目需要实现按钮的动态效果,多方学习,现在终于能实现一些功能了。

过程如下:

  第一,新建一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自绘按钮的实现,按钮动态效果的更多相关文章

  1. Chapter 4. Button, Checkbutton, and Radiobutton Widgets 按钮,复选按钮,单选按钮

    Chapter 4. Button, Checkbutton, and Radiobutton Widgets   按钮,复选按钮,单选按钮 几乎所有的Perl/Tk 应用使用按钮以这样或者那样的方式 ...

  2. C# 动态生成的按钮及定义按钮的事件的代码

    内容闲暇时间,把内容过程中比较常用的内容备份一下,如下的内容内容是关于C# 动态生成的按钮及定义按钮的事件的内容,应该对码农们也有用途. HtmlGenericControl control = ne ...

  3. iOS 11开发教程(二十一)iOS11应用视图美化按钮之实现按钮的响应(1)

    iOS 11开发教程(二十一)iOS11应用视图美化按钮之实现按钮的响应(1) 按钮主要是实现用户交互的,即实现响应.按钮实现响应的方式可以根据添加按钮的不同分为两种:一种是编辑界面添加按钮实现的响应 ...

  4. iOS 11开发教程(二十)iOS11应用视图美化按钮之设置按钮的状态

    iOS 11开发教程(二十)iOS11应用视图美化按钮之设置按钮的状态 在示例2-2中,设置按钮的标题和颜色时,需要对按钮的状态进行设置,表示按钮在某一状态下的标题和标题颜色是什么样子.例如,UICo ...

  5. iOS 11开发教程(十九)iOS11应用视图美化按钮之设置按钮的外观

    iOS 11开发教程(十九)iOS11应用视图美化按钮之设置按钮的外观 美化按钮说白了就是对按钮的属性进行设置,设置按钮的属性有两种方法:一种是使用编辑界面中的属性检查器:另一种是使用代码进行设置.以 ...

  6. 如何调换antd中Modal对话框确认按钮和取消按钮两个按钮的位置

    今天有个工作是把所有的确认按钮放在取消按钮的左边,类似于下图这样的,公司用的时antd组件 但是antd组件的按钮时确认键放在右边的 可以采用下面的方式,将按钮调换过来: 对的,就是在modal里面的 ...

  7. 提问(prompt 消息对话框)用于询问一些需要与用户交互的信息。弹出消息对话框(包含一个确定按钮、取消按钮与一个文本输入框)

    提问(prompt 消息对话框) prompt弹出消息对话框,通常用于询问一些需要与用户交互的信息.弹出消息对话框(包含一个确定按钮.取消按钮与一个文本输入框). 语法: prompt(str1, s ...

  8. wxpython(2)--按钮,位图按钮,滑动块,微调控制器

    本文介绍按钮,位图按钮,滑动块,微调控制器**.. 按钮 基本按钮 创建一个按钮,绑定点击事件,点击后修改Label 123456789101112131415161718 import wx cla ...

  9. 使用 JavaScript 中的 document 对象查找 HTML 元素,实现“登录”按钮的高亮特效 鼠标悬浮于“登录”按钮时,按钮高亮显示;

    查看本章节 查看作业目录 需求说明: 使用 JavaScript 中的 document 对象查找 HTML 元素,实现"登录"按钮的高亮特效 鼠标悬浮于"登录" ...

  10. 通过HTML+CSS+Javascript实现向下滚动滚动条出现导航栏并出现回到顶部按钮点击按钮回到顶部(一)

    回到顶部实例一 效果:默认隐藏导航栏,当滚动条滚到超过300px后导航栏和按钮出现,点击回到顶部按钮回到顶部,并隐藏导航栏和按钮(导航栏和按钮都是固定定位) <!doctype html> ...

随机推荐

  1. Object-C反射读取实体属性和值

    举例: 首先定义TestModel如下: @interface TestModel : NSObject @property (nonatomic, strong) NSString *name; @ ...

  2. 初识Adapter

    首先得了解Adapter层级关系: 示例,将user对象适配到textview public class User { private String userName; private String ...

  3. [Java]Eclipse无法import “com.sun.management.OperatingSystemMXBean”的解决方法

    背景: 当使用jdk的自带的API获取系统信息时,代码中import “com.sun.management.OperatingSystemMXBean”出现报错. 解决方法: Eclipse默认把这 ...

  4. encryptjs 加密 前端数据(vue 使用 RSA加密、java 后端 RSA解密)

    1.index.html引入 <script src="./static/js/jsencrypt.min.js"></script> 或者 npm i j ...

  5. LeetCode Happy Number 开心数字

    题意: 给出一个整数n,判断其是否为幸运数. 规则是,将n按十进制逐位拆出来后,每个位各自进行取平方,再将这些平方数求和作为新的数字n.若最后n=1,就是幸运数. 思路: 计算例子:n=47,接着n= ...

  6. 爬取豆瓣电影top250并存储到mysql数据库

    import requests from lxml import etree import re import pymysql import time conn= pymysql.connect(ho ...

  7. 2018.3.26 Linux下学习命令

    Linux下的终端文件颜色说明 ---color[=WHEN] 用色彩辨别文件类型 WHEN 可以是'never'.'always'或'auto'其中之一 白色:表示普通文件 蓝色:表示目录 绿色:表 ...

  8. a survey for RL

    • A finite set of states St summarizing the information the agent senses from the environment at eve ...

  9. 关于lua 5.3 服务端热更新流程

    脚本的热更新的流程都大同小异, 第一步先保存旧代码的块的数据, 第二部加载新的代码块,第三步将旧代码块的局部和全局数据拷贝到新代码块的对应的 变量中. 在服务器热更新中,主要考虑热更的内容是什么, 一 ...

  10. NSOperation、NSOperationQueue

    NSOperation.NSOperationQueue NSOperation 和 NSOperationQueue 配合使用也能实现多线程. NSOperation 继承于 NSObject,是一 ...