WEB开发网
开发学院软件开发VC 动态加载CBitmapButton的四副状态图 阅读

动态加载CBitmapButton的四副状态图

 2008-08-09 19:26:02 来源:WEB开发网   
核心提示:本文示例源代码或素材下载 一、CBitmapButton存在的问题在MFC中,要使用图形按钮,一般会选择CBitmapButton类,动态加载CBitmapButton的四副状态图,使用CBitmapButton类可以设置按钮的Normal、Selected、Focused和Disabled四种状态的bmp图像

本文示例源代码或素材下载

一、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
  }
};
增加了四个inline函数用来得到四副状态图对应的保存地址。在保持原CBitmapButton对象的不变情况下,我提供一个普通函数BOOL ChangeBitmapBtnImages(CBitmapButton &button,LPCTSTR lpszFilename)来更改CBitmapButton对象的按钮状态图,该函数接受一个CBitmapButton引用对象和一个四状态组合的bmp磁盘文件路径名,如果成功设置返回TRUE,否则FALSE,该函数定义的核心代码如下(详细请看示例源代码中changeBmp.cpp文件):BOOL ChangeBitmapBtnImages(CBitmapButton &button,LPCTSTR lpszFilename)//
{
...
  HBITMAP hbm = (HBITMAP) ::LoadImage (NULL, lpszFilename, IMAGE_BITMAP, 0, 0,
    LR_LOADFROMFILE|LR_CREATEDIBSECTION);//动态加载磁盘bmp文件
  if (hbm == NULL)
  {
    return FALSE;
  }
  src.Attach(hbm);
...
  CGetBitmaps gbitmap(&button);//这里调用我们的定义类
  CBitmap * pbitmap[4];
...
  BOOL Rz=TRUE;
  for(int i=0;i<4;i++) //分割四副状态图
  {
    pbitmap[i]->CreateCompatibleBitmap(&srcDC,bmpWidth,bmpHeight); 
    memDC.SelectObject(pbitmap[i]); 
    if(  !memDC.BitBlt(0,0,bmpWidth, bmpHeight, &srcDC,bmpWidth*i,0,SRCCOPY) )
    {
      Rz=FALSE;
      break;
    }
  }
...
  return Rz;
}
三、代码示例

1 2  下一页

Tags:动态 加载 CBitmapButton

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接