动态加载CBitmapButton的四副状态图

一、CBitmapButton存在的问题

在MFC中,要使用图形按钮,一般会选择CBitmapButton类,使用CBitmapButton类可以设置按钮的Normal、Selected、Focused和Disabled四种状态的bmp图像,这四副状态图像要求同尺寸大小,其中normal状态图片是必需提供的。常见调用代码示例:

CBitmapButton m_bmpBtn;
  m_bmpBtn.SubclassDlgItem(IDC_BUTTON1,this);//关联控件
  //CBitmapButton对象m_bmpBtn的LoadBitmaps函数加载程序内bmp资源。
  m_bmpBtn.LoadBitmaps(IDB_BITMAP1,IDB_BITMAP2,IDB_BITMAP3,IDB_BITMAP4);
  m_bmpBtn.SizeToContent();

遗憾的是:上述代码中LoadBitmaps函数只可以加载程序内部bmp资源文件,不可以加载磁盘图像文件,但有时我们又急需更改CBitmapButton 对象的按钮状态图,比如界面皮肤动态切换时,就有可能碰到这种情况。如何才能让CBitmapButton 对象动态加载状态图像呢?这里给出一个解决方案。

二、解决思路分析

通过分析CBitmapButton发现,其四种状态图保存在四个CBitmap类型的成员变量中,其定义如下:

class CBitmapButton : public CButton
{
....
protected:
  // all bitmaps must be the same size
  CBitmap m_bitmap;      // normal image (REQUIRED)
  CBitmap m_bitmapSel;    // selected image (OPTIONAL)
  CBitmap m_bitmapFocus;   // focused but not selected (OPTIONAL)
  CBitmap m_bitmapDisabled;  // disabled bitmap (OPTIONAL)
...
}
由于CBitmapButton的protected属性成员变量普通外部函数无法直接访问,因此我们定义一个其public继承类CGetBitmaps,从而可以访问这四个成员变量,CGetBitmaps类定义如下:

class CGetBitmaps : public CBitmapButton
{
  CBitmapButton *btn;
public:
  CGetBitmaps(CBitmapButton *button)
  {
    btn=button;
  }
  inline CBitmap * Nor(){ //normal image (REQUIRED)
    return (CBitmap *)(PCHAR(btn)+(ULONG)(PCHAR (&m_bitmap)-PCHAR(this)));//not PTCHAR, butPCHAR
  }
  inline CBitmap * Sel(){ // selected image (OPTIONAL)
    return (CBitmap *)(PCHAR(btn)+(ULONG)(PCHAR (&m_bitmapSel)-PCHAR(this)));//not PTCHAR, butPCHAR
  }
  inline CBitmap * Foc(){ // focused but not selected (OPTIONAL)
    return (CBitmap *)(PCHAR(btn)+(ULONG)(PCHAR (&m_bitmapFocus)-PCHAR(this)));//not PTCHAR, butPCHAR
  }
  inline CBitmap * Dis(){ // disabled bitmap (OPTIONAL)
    return (CBitmap *)(PCHAR(btn)+(ULONG)(PCHAR (&m_bitmapDisabled)-PCHAR(this)));//not PTCHAR, butPCHAR
  }
};

时间: 2024-09-02 13:27:28

动态加载CBitmapButton的四副状态图的相关文章

js的动态加载、缓存、更新以及复用(四)

本来想一气呵成,把加载的过程都写了,但是卡着呢,所以只好在分成两份了. 1.页面里使用<script>来加载 boot.js . 2.然后在boot.js里面动态加载 bootLoad.js.以时间作为标识 var dateVer = date.getYear() + "_" + date.getMonth() + "_" + date.getDate() + "_" + date.getHours(); 这样可以保证一小时内肯定会被

java-Java动态加载jar包问题

问题描述 Java动态加载jar包问题 请问哪位大神做过,Java通过读配置文件的jar路径,加载jar包并调用里面的类和方法,求解答 解决方案 package org.util; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.A

ASP.NET中实现模版的动态加载

ASP.NET中,经常会使用到templates(模版)功能,比如在datagrid,datalist,repeater等控件中,使用templates,将会大大增强其功能.以往,我们一般是在设计程序时,就已经设置好控件中的模版是怎样的了.但是,有的时候,可能我们需要动态加载模版,比如,当你要求你的应用程序的界面风格随着用户的需求而变化时,你就需要到动态加载模版的功能了.但要注意的是,并不是所有的web控件都支持模版功能,而且要注意,哪些控件支持模版的哪些功能,下面简单列出了一些支持模版功能的控

动态加载用户控件的组件!

动态|加载|控件 我们写用户控件的目的就是放到页面中去.根据不同的条件,我们可以改变加载的用户控件! 其实原理就是MasterPage的原理.这个MasterPage会在vs2005中提供,但是现在也可以实现. 在我的项目中就用到: MasterPage就四个类,其中容器就动态加载用户控件.这种功能在vs2005中将无处不在. 下面简单介绍一下动态加载叶面组件: 我们只需要改变用户组件的地址就可以动态改变加载的用户组件了. 在程序中动态改变SkinPath就可以了. 组件源码如下: using

aspx页面中按照情况,后台动态加载不同的ascx的按键问题

问题描述 首先说明一下,我是刚学asp.net没多久,很多概念不清,如有错误请见谅.问题是这样的,我现在已经实现了根据情况向aspx页面中动态加载ascx,即可以点击左边的选项,向右边将在ascx.大致界面效果如下概念图(新手,勿怪.....),这是一个aspx页面:LinkButton:员工管理|右侧LinkButton:新闻管理|具体LinkButton:时间安排|显示右边显示的就是ascx,aspx的Page_load中有一个默认的加载的ascx.现在的麻烦是,当我点击左边的非默认的部分,

CSS文件动态加载(续)—— 残酷的真相

在之前的文章<CSS文件动态加载>中,我们提到了在动态加载CSS文件的时候,如何检测加载是否完成.注意,这里的加载完成包含了两种情况: 1)加载成功 2)加载失败 也就是说,这里并没有将成功与失败的情况区分开来.看到这里你可能疑惑了,就动态加载个CSS文件,洋洋洒洒写了一两百行代码,连是否加载成功/失败都没能区分开来,这似乎有些不可理解. 美好的假象--如何判断CSS加载完成 这里先不抛出结论,而是先思考一个问题:如何动态加载CSS文件? 很简单,就下面几行代码: var node = doc

ajax 动态加载数据提示没有更多内容加载了

问题描述 ajax 动态加载数据提示没有更多内容加载了 怎么判断所有的数据已经加载完毕,提示没有更多内容加载了? if(data=='') 这个判断有误,求高人指点 解决方案 如果是分页你自己服务器端计算好总页数赋值给js变量,然后js设置一个当前页变量,每次加载后和总量对比就好了,干么多请求一次服务器由服务器返回空内容来控制是否加载完呢.. 解决方案二: 不知道你想问什么,data是什么?你的返回值怎么判断没有内容了.你的判断有误怎么得出的结论?有误的时候data什么值 解决方案三: data

Android ViewPager制作新手导航页(动态加载)_Android

我们来讲个老生常谈的话题,估计大家都用过的->ViewPager,用它来做新手导航页面,虽然这次也是讲这个,但是和以往的用法可能有些不同,大家都看到标题进来的,应该知道的是:动态加载指示器. 什么叫动态加载呢,是不是感觉很高大上呢,其实呢就是动态的去加载指示器的数量的,而不是在布局文件中写死.希望看了这篇文章大家对ViewPager有新的认识. 看到这个效果大家应该都很不屑吧,今天讲这个就是为了让大家有新的认识.好了,好好听,开始了. 这个动态加载就是为了动态的加载下面的灰色圆点指示器和红色圆点

android viewpager根据数组的长度动态加载布局,隐藏控件无效。

问题描述 android viewpager根据数组的长度动态加载布局,隐藏控件无效. 布局文件 android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <android.support.v4.view.ViewPager android:id="@+id/viewpag