用CBitmapButton类以图标方式显示按钮!!!

MFC中,默认的按钮控件是显示文字的,使用CBitmapButton可以使得按钮以图形化的形式显示出来。
//VC98\MFC\Include\AFXEXT.H,省略部分代码
class CBitmapButton : public CButton
{
DECLARE_DYNAMIC(CBitmapButton)
public:
// Construction
CBitmapButton();
BOOL LoadBitmaps(LPCTSTR lpszBitmapResource,
LPCTSTR lpszBitmapResourceSel = NULL,
LPCTSTR lpszBitmapResourceFocus = NULL,
LPCTSTR lpszBitmapResourceDisabled = NULL);
BOOL LoadBitmaps(UINT nIDBitmapResource,
UINT nIDBitmapResourceSel = 0,
UINT nIDBitmapResourceFocus = 0,
UINT nIDBitmapResourceDisabled = 0);
BOOL AutoLoad(UINT nID, CWnd* pParent);
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)
virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);
};
CBitmapButton加载4个位图(使用LoadBitmaps函数和AutoLoad函数),分别用于显示按钮的正常状态、按下时的状态、具有输入焦点时的状态、不可用时的状态,下面举例说明其用法。步骤如下:
(1)创建基于对话框的MFC应用程序。
(2)在主对话框中放入一个Button空间,调整适当大小,为其添加CButton类型变量m_btnBitmap,如图15.7所示。
(3)设置该按钮风格为Owner draw,如图15.8所示。
图15.7 对话框布局
图15.8 设置Owner draw风格
(4)在资源视图中创建或导入4副位图,分别设置ID为IDB_BITMAP1、IDB_BITMAP2、IDB_BITMAP3、IDB_BITMAP4,注意这4副位图的大小必须相同并和按钮的大小一致,如图15.9所示。
(5)修改m_btnBitmap类型为CBitmapButton。
(6)修改主对话框的OnInitDialog函数,添加如下代码:
BOOL CMFCDlg::OnInitDialog()
{
CDialog::OnInitDialog();
 // 省略相关代码
// 加载图片
m_btnBitmap.LoadBitmaps(IDB_BITMAP1,IDB_BITMAP2,IDB_BITMAP3,IDB_BITMAP4);
return TRUE; // return TRUE unless you set the focus to a control
}

(7)按Ctrl+F5键编译并运行程序,效果如图15.10所示。
图15.9 IDB_BITMAP2示意图
图15.10 CBitmapButton按钮效果图
 
 
现在软件界面流行那种Hover按钮,就是鼠标移到按钮上时,按钮图片
会显示发亮、上移的效果,鼠标移出按钮则按钮恢复原状,而CBitmapButton类只有如上面所说的四种效果图片,
不包含鼠标移到按钮上时的显示图片;我想到了一种办法:利用 lpszBitmapResourceFocus(位图
按钮获得焦点时的位图),当鼠标移动到按钮上的时候,用代码使按钮获得焦点,当鼠标移
出按钮时,用代码使按钮失去焦点,这样就间接的实现了HoverButton,效果还不错;
//实现Hover效果的处理代码:///////////////////////////////////////////////
//在初始化对话框的时候要用SetTimer函数设置一个定时器,200ms足矣;/////////
void CCBitmapButtonDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if (1==nIDEvent)
{
   POINT p;
   GetCursorPos(&p);
   CString s;
   CWnd *hwnd;
   s.Format("%d",hwnd=WindowFromPoint(p));
   this->GetDC()->DrawText(s,CRect(10,10,100,100),0);
   CWnd *hwnd2=GetDlgItem(IDC_BUTTON1);
   if (hwnd2 == hwnd)//如果鼠标在按钮上
   {
    if (GetFocus()!=hwnd2)//如果按钮无焦点,那么设置焦点
     hwnd2->SetFocus() ;
   }
   else//如果鼠标不在按钮上;
   {
    if (GetFocus() == hwnd2 )//如果按钮有焦点,那么去焦点;
     GetDlgItem(IDC_EDIT1)->SetFocus();
   }
  
}
CDialog::OnTimer(nIDEvent);
}

你可能感兴趣的:(职场,休闲,CBitmapButton)