一、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
由于CBitmapButton的protected属性成员变量普通外部函数无法直接访问,因此我们定义一个其public继承类CGetBitmaps,从而可以访问这四个成员变量,CGetBitmaps类定义如下:
{
....
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)
...
}
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
}
};