系统环境:Windows 7
软件环境:Visual C++ 2008 SP1
本次目的:使用位图按钮,并且设置按钮的鼠标悬停效果

在用MFC开发时,界面是比较不好开发的一块。VC中自带了CBitmapButton类,但是用途不多,网上很多Button类的派生类蛮实用的,但是若是简单的位图按钮用自带的CBitmapButton就可以实现了,以下是效果图:

步骤一:新建基于对话框工程,放置一个按钮,可以适当调整大小,设置其Owner Draw属性为TRUE,右键为按钮添加变量,改变其变量类型为CBitmapButton,按确定完成;

步骤二:导入按钮位图,这里四幅图大小要一致,以下是四种状体的按钮,若读者要实验这次的设计的话,可以右键另存为,然后用“画图”把png格式的另存为bmp格式的。在资源视图,右键“添加资源”,“导入”以下图片:

步骤三:初始化工作,在对话框的OnInitDialog()函数里面添加以下代码:

[cpp] view plaincopy
  1. m_btButton.LoadBitmaps(IDB_BITMAP1,IDB_BITMAP2,IDB_BITMAP3,IDB_BITMAP4);   //载入
  2. m_btButton.SizeToContent();  //使按钮适应图片大小

步骤四:为控制位图按钮的可用、不可用添加代码,这是为了验证第四种状态的按钮:

[cpp] view plaincopy
  1. void CTestDlg::OnBnClickedButton2()
  2. {
  3. m_btButton.EnableWindow(0);
  4. }
  5. void CTestDlg::OnBnClickedButton3()
  6. {
  7. m_btButton.EnableWindow();
  8. }

步骤五:到这里已经完成了位图按钮的实现,编译运行可以看到结果。但是鼠标滑过的时候,按钮并不会感应到焦点的存在。这里用定时器捕获焦点在按钮上,并且改变此时的按钮状体为第三种图片。首先为窗体添加OnTimer()事件,在OnTimer()函数里面填写如下代码:

[cpp] view plaincopy
  1. void CTestDlg::OnTimer(UINT_PTR nIDEvent)
  2. {
  3. // TODO: 在此添加消息处理程序代码和/或调用默认值
  4. if (1==nIDEvent)
  5. {
  6. POINT p;
  7. GetCursorPos(&p);
  8. CWnd *hwnd;
  9. hwnd=WindowFromPoint(p);        //检索窗口中包含指定的点;点必须指定屏幕坐标在屏幕上的一个点。
  10. CWnd *hwnd2=GetDlgItem(IDC_BUTTON1);
  11. if (hwnd2 == hwnd)         //如果鼠标在按钮上
  12. {
  13. if (GetFocus()!=hwnd2)        //如果按钮无焦点,那么设置焦点
  14. hwnd2->SetFocus() ;
  15. }
  16. else          //如果鼠标不在按钮上;
  17. {
  18. if (GetFocus() == hwnd2 )                  //如果按钮有焦点,那么去焦点;
  19. GetDlgItem(IDC_BUTTON2)->SetFocus();      //这里的IDC_BUTTON2为你想跳转到的控件ID号
  20. }
  21. }
  22. CDialog::OnTimer(nIDEvent);
  23. }

最后在对话框的OnInitDialog()函数里面添加开启定时器,时间间隔200ms足够了。

[cpp] view plaincopy
  1. SetTimer(1,200,NULL);

完成后,运行就可实现与文章开头所示的图片一样的效果

利用CBitmapButton类实现位图按钮的两种方法:
方法一:
 1、在资源编辑的时候选中按钮的 Owner draw 属性,不需要选择 Bitmap 属性.
       按钮右键-->Styles-->Owner draw

2、在程序中定义一个CBitmapButton成员变量。
        注意:不能使用ClassWizard为按钮映射一个CButton变量,然后改为CBitmapButton,
        这么做并不能将按钮直接映射为CBitmapButton类的对象,反而会出现初始化错误

3、使用CBitmapButton::LoadBitmaps装载各种状态的图片,
     使用CBitmapButton::SubclassDlgItem关联到想要的按钮,
     使用CBitmapButton::SizeToContent函数使按钮适合图片大小。
     注意Loadbitmaps一定要在关联到按钮之前进行!

附:添加资源Bitmap的方法:Insert菜单-->Resource -->Resource type:Bitmap-->Import, 
                之后选择所需的图片就可以了

方法一的例子:
    首先,选中按钮的owner Draw属性,在资源中加载两副*.bmp格式的位图,
  然后在对话框类中加入:

 1CBitmapButton m_btnX1;
 2//定义变量,必须放在函数外面才能正常实现
 3
 4BOOL CXXXXXXX::OnInitDialog()
 5{
 6CDialog::OnInitDialog();
 7
 8m_btnX1.LoadBitmaps(IDB_XXXX_UP,IDB_XXXX_DOWN);
 9//这里是两副位图,鼠标按下和弹起,
10//  也可以只加一个ID资源;
11m_btnX1.SubclassDlgItem(IDC_DASEN_X1,this);
12m_btnX1.SizeToContent();
13}
14
15文章引用自:http://blog.sina.com.cn/s/blog_44e571d70100080o.html 
16

方法二:使用CBitmapButton::AutoLoad函数关联到想要的按钮
需要注意:
A、使用CBitmapButton::AutoLoad函数之前不能使用CBitmapButton::LoadBitmaps装载
  各种状态的图片,否则会出错。
B、AutoLoad函数完成关联和改变按钮大小的功能。类似于上面CBitmapButton::SubclassDlgItem
   和CBitmapButton::SizeToContent函数的功能。
C、CBitmapButton::AutoLoad使用的位图是默认资源ID的,即它会自动装载相关资源位图。
  位图的资源ID格式为:
  "按钮Caption+U"、"按钮Caption+D"、"按钮Caption+F"、"按钮Caption+X",
  分别代表Up、Down、Focus、Disable状态。
  如资源编辑时,希望关联的按钮的Caption为Test,
  那么其默认装载的位图资源的ID为:"TestU"/"TestD"/"TestF"/"TestX",
  注意分号""也是其ID的一部分。
方法二例子:
首先,选中Caption为:"myBitmapButton"按钮的owner Draw属性
其次,添加两个位图资源,并修改其ID分别为:"myBitmapButtonU"和"myBitmapButtonD",这里只添加两个位图
然后在对话框类中加入:

1 CBitmapButton m_btnX1;//必须放在函数外面才能正常实现
2 BOOL CXXXXXXX::OnInitDialog()
3 {
4 CDialog::OnInitDialog();

6 m_btnX1.AutoLoad(IDC_BUTTON1,this);//ID为IDC_BUTTON1的按钮的Caption为:myBitmapButton
7 }

至此两种方法就都结束了。

MFC 为按钮加载位图 CBitmapButton相关推荐

  1. Windows API(非MFC)编程加载位图

    很久都没写博客了,前段时间ACM那些题都是有空的时候水着玩的,虽然大二的课只有6门,但是作业很多,也一直很忙,刚刚都才完成一个电路设计的实验报告.准备TOEFL,GRE,还要跟着导师做计算机视觉的一些 ...

  2. 基于对话框的MFC程序加载位图为背景图案

    from: http://rwsk.snnu.edu.cn/?uid-156-action-viewspace-itemid-240 先载入一张图片 ,ID 为 IDB_BITMAP2 TestDlg ...

  3. MFC加载位图和图标

    MFC加载位图和图标 | 火苗999℃的博客 从文件加载位图 #pragma once// ZBitmap从文件加载位图资源 class ZBitmap { private:HBITMAP m_hBi ...

  4. VC++图片框控件静态和动态加载位图

    win10,vc6:新建一个对话框工程:右击资源文件夹,插入...: 类型,Bitmap:引入:选择一个bmp图片: 插入后如下:自动给了一个id: 图片框属性:类型,下拉选中 位图: 图像属性,选中 ...

  5. MFC——在视图窗口加载背景图片

    1.若是文档视图程序的话,在视图类的OnDraw(CDC* pDC)函数中调用pDC->TextOut()函数,就像平常输出文字一样.若是嫌文字的背景颜色破坏了图像,可以在输出文字之前调用pDC ...

  6. php网站首页点击更多时获取数据,jQuery+PHP实现点击按钮加载更多,不刷新页面加载更多数据!附:可用源码+demo...

    先上效果: 刚打开页面的时候,只显示部分数据,点击加载更多的时候,就会加载我们预先定义的加载数量显示出来!当数据库里面的所有数据都显示出来,就提示全部加载了! 新建index.php jQuery+p ...

  7. win32汇编--加载位图(bmp)资源

    本例通过静态(static)控件的SS_BITMAP属性来加载位图: 核心代码如下:(完整工程下载) 转载于:https://www.cnblogs.com/wbbice/archive/2012/0 ...

  8. html中searchbutton点击没有反应,点击按钮加载完整的HTML后,使用Selenium加载其他元素...

    我想刮一页并收集所有链接.该页面显示30个条目并查看完整列表,点击全部加载按钮是必要的.点击按钮加载完整的HTML后,使用Selenium加载其他元素 我使用下面的代码: from selenium ...

  9. php ajax loading图片居中显示,PHP语言入门之PHP+ajax实现登录按钮加载loading效果

    本篇教程探讨了PHP语言入门之PHP+ajax实现登录按钮加载loading效果,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入. < php+ajax实现登录按钮加载loa ...

  10. ros中web端通过 按钮加载本地静态 pgm 地图显示在canvas画布中

    ros中web端通过 按钮加载本地静态 pgm 地图显示在canvas画布中 var input = this.$("fielinput");if (typeof (FileRea ...

最新文章

  1. 学习编译原理对下面这段java跳不出死循环大概能有较好的解释吧
  2. java异常日志不要只打一半,要输出全部错误信息
  3. linux date fmt,date_format(date,frm) 详解
  4. ROS笔记(21) 地图
  5. 可折叠手机Galaxy Fold被曝屏幕问题后 三星股价下跌逾3%
  6. django中collectstatic的使用
  7. Matplotlib画热力图---heatmap(逐行注释)
  8. Unity,Sketchfab和Verge3D对比
  9. 《炬丰科技-半导体工艺》晶片键合技术和薄膜传输技术
  10. 无语的index hint:手工分配哈希区,5小时不出结果,优化后20分钟
  11. 2020双周训练训练日志
  12. java计算时间区间工作日_Java如何计算两个日期之间的工作日数?
  13. Apue学习:高级I/O
  14. 计算机硬盘一直正在处理,win7电脑快速退出移动硬盘时一直提示设备正在使用中怎么办?...
  15. Low Latency HLS的实现优化
  16. php解析m3u8代码,PHP解码转发M3U8 PHP读取转发M3U8的方法
  17. 奥比中光网络深度摄像头——人脸活体检测
  18. 利用自定义方法显示数组中的全部数据
  19. root精灵有mac版的吗,苹果有root
  20. c# 中崎_C#版OPOS打印(基于北洋OPOS SDK二次开发包,支持EPSON和北洋、佳博、商祺等支持标准ESC/POS指令的POS打印机)...

热门文章

  1. MQTT 测试工具介绍
  2. 音乐播放器之QQ音乐最新api,亲测可用
  3. 人脸识别之数据库存取
  4. 基于MATLAB的一维条码识别
  5. 国际c语言混乱编码大赛,国际C语言混乱代码大赛(IOCCC)
  6. Google 工作十年后,我选择离开!
  7. C++多线程函数_beginthread/_beginthreadex/CreateThread
  8. Android Patcher应用增量更新(App补丁式更新,无需下载整个apk)
  9. C++ 读取TXT文件
  10. 现代优化算法:遗传算法