你的按钮可以使用CBitmapButton类CBitmapButton* pmyButton = new CBitmapButton();// Create the bitmap button (must include the BS_OWNERDRAW style). pmyButton->Create(NULL, WS_CHILD|WS_VISIBLE|BS_OWNERDRAW, CRect(10,10,100,100), pParentWnd, 1);// Load the bitmaps for this button. pmyButton->LoadBitmaps(IDB_UP, IDB_DOWN, IDB_FOCUS, IDB_DISABLE);
pmyButton->Create(NULL, WS_CHILD|WS_VISIBLE|BS_OWNERDRAW,
CRect(10,10,100,100), pParentWnd, 1);// Load the bitmaps for this button.
pmyButton->LoadBitmaps(IDB_UP, IDB_DOWN, IDB_FOCUS, IDB_DISABLE);
//======================================================================//
//自定义MyImageButton类
//======================================================================//#define BTN_STATE_NORMAL 0
#define BTN_STATE_HOVER 1
#define BTN_STATE_PRESS 2
#define BTN_STATE_UNABLE 3#define WM_MY_MESSAGE_LBUTTON_DOWN WM_USER+1001class MyImageButton : public CButton
{
protected:
CImage* m_pImage; //CImage指针
int m_nFrameNum; //按键图片有几帧,最少3帧
BOOL m_bTracking;
public:
int m_nState;
COLORREF m_clrTransparent;
CRect m_rtImageRect; //图片显示大小 MyImageButton();
~MyImageButton(); DECLARE_MESSAGE_MAP()
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnMouseLeave();
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
afx_msg BOOL OnEraseBkgnd(CDC* pDC);public:
virtual BOOL CreateMIB(CWnd * pcwnd, CString strImagePath, int nFrameNum, CRect rtShow, UINT nID); void SetButtonState(int nState);
};
//======================================================================//
//自定义MyImageButton类
//======================================================================//
MyImageButton::MyImageButton()
{
m_pImage = new CImage();
}MyImageButton::~MyImageButton()
{
if (NULL != m_pImage)
{
m_pImage->Destroy();
}
delete m_pImage;
}BEGIN_MESSAGE_MAP(MyImageButton, CButton)
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSELEAVE()
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()BOOL MyImageButton::CreateMIB(CWnd * pcwnd, CString strImagePath, int nFrameNum, CRect rtShow, UINT nID)
{
m_pImage->Load(strImagePath);//载入资源
if (m_pImage->IsNull())
{
AfxMessageBox("加载图片失败\r\n" + strImagePath);
return FALSE;
}
m_nFrameNum = nFrameNum;
m_nState = BTN_STATE_NORMAL;
m_bTracking = FALSE;
m_clrTransparent = RGB(255,0,255);
m_rtImageRect.left = 0;
m_rtImageRect.top = 0;
m_rtImageRect.right= rtShow.right;
m_rtImageRect.bottom = rtShow.bottom; CRect _rt;
_rt.left = rtShow.left;
_rt.right = rtShow.left + rtShow.right;
_rt.top = rtShow.top;
_rt.bottom = rtShow.top + rtShow.bottom; return this->Create("", WS_CHILD|WS_VISIBLE|BS_OWNERDRAW|WS_TABSTOP|BS_PUSHBUTTON, _rt, pcwnd, nID);
}void MyImageButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
CDC* pDC = CDC::FromHandle(lpDIS->hDC);
CRect _rt;
this->GetClientRect(_rt); UINT _nState = lpDIS->itemState; //获取状态
if (_nState&ODS_DISABLED)
{
if (m_nFrameNum >= 4)
{
m_nState = BTN_STATE_UNABLE;
}
}
else
{
if (BTN_STATE_UNABLE == m_nState)
{
m_nState = BTN_STATE_NORMAL;
}
} CDC dcBuffer;//后台缓存
dcBuffer.CreateCompatibleDC(pDC);
CBitmap dfbmp;//设置后台缓存大小
dfbmp.CreateCompatibleBitmap(pDC,_rt.right,_rt.bottom);
dcBuffer.SelectObject(&dfbmp);
dcBuffer.FillRect(&_rt, &CBrush(m_clrTransparent));
dcBuffer.SetBkMode(TRANSPARENT); if (!m_pImage->IsNull())
{
m_pImage->Draw(dcBuffer.m_hDC, _rt.left, _rt.top, _rt.right, _rt.bottom,
m_nState * m_rtImageRect.right, 0, m_rtImageRect.right, m_rtImageRect.bottom);
} pDC->TransparentBlt(0,0,_rt.right,_rt.bottom,&dcBuffer,0,0,_rt.right,_rt.bottom,m_clrTransparent);//将后台缓冲COPY到前台
}void MyImageButton::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default if(!m_bTracking)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE;
tme.dwHoverTime = 0;
m_bTracking = _TrackMouseEvent(&tme);
} if (BTN_STATE_NORMAL == m_nState)
{
m_nState = BTN_STATE_HOVER;
this->Invalidate();
} CButton::OnMouseMove(nFlags, point);
}void MyImageButton::OnMouseLeave()
{
// TODO: Add your message handler code here and/or call default
m_bTracking = FALSE;
m_nState = BTN_STATE_NORMAL;
this->Invalidate();
CButton::OnMouseLeave();
}void MyImageButton::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_nState = BTN_STATE_PRESS;
this->Invalidate();
CWnd *pcwnd = this->GetParent();
pcwnd->PostMessage(WM_MY_MESSAGE_LBUTTON_DOWN,0,this->GetDlgCtrlID());
CButton::OnLButtonDown(nFlags, point);
}void MyImageButton::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (BTN_STATE_PRESS == m_nState)
{
m_nState = BTN_STATE_HOVER;
this->Invalidate();
} CButton::OnLButtonUp(nFlags, point);
}BOOL MyImageButton::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return TRUE;
//return CButton::OnEraseBkgnd(pDC);
}void MyImageButton::SetButtonState(int nState)
{
if (nState != m_nState)
{
m_nState = nState;
this->Invalidate();
}
}
CBitmapButton能不能用路径 加载多个位图啊
MyImageButton m_mibMin;
afx_msg void OnBnClickedMin();
CPP文件
#define IDC_BTN_MIN WM_USER + 5
BEGIN_MESSAGE_MAP(MyLogonDlg, CDialogEx)
ON_BN_CLICKED(IDC_BTN_MIN, &MyLogonDlg::OnBnClickedMin)
END_MESSAGE_MAP()
m_mibMin.CreateMIB(this,theApp.m_strPath + "\\res\\logon_btn_min.png",3,CRect(187,0,23,20),IDC_BTN_MIN);这是使用方法,路径那你自己改吧。
CreateMIB(父窗口指针,图片路径,图片帧数(最少3),CRect前两个值是坐标 后两个是一帧图片的长宽,最后一个是空间ID)