.h
class CZPButton : public CButton{
public: CZPButton(); virtual ~CZPButton();
protected: CBitmap m_bmp1; CBitmap m_bmp2; CBitmap m_bmp3; CBitmap m_bmp4;
//按钮的状态 BOOL m_bOver; //鼠标位于按钮之上时该值为true,反之为flase BOOL m_bTracking; //在鼠标按下没有释放时该值为true BOOL m_bSelected; //按钮被按下是该值为true BOOL m_bFocus; //按钮为当前焦点所在时该值为true
UINT m_nColor;
public:
//{{AFX_VIRTUAL(CXPButton)protected: virtual void PreSubclassWindow(); //}}AFX_VIRTUAL
public: ///绘制按钮纹理 virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); ///加载按钮各个状态的纹理图 void CreateBmpFile(LPCSTR str1,LPCSTR str2,LPCSTR str3,LPCSTR str4,UINT nColor); void SetEnabled( BOOL bEnabled );
protected: //{{AFX_MSG(CXPButton) afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnMouseHover(WPARAM wParam, LPARAM lParam);
afx_msg BOOL OnEraseBkgnd(CDC* pDC); afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); afx_msg void OnEnable(BOOL bEnable); //}}AFX_MSG
DECLARE_MESSAGE_MAP() };
/
.cpp
CZPButton::CZPButton(){ m_bOver = m_bSelected = m_bTracking = m_bFocus = FALSE; m_nColor=0; m_bmp1.Attach(NULL); m_bmp2.Attach(NULL); m_bmp3.Attach(NULL); m_bmp4.Attach(NULL);}
CZPButton::~CZPButton(){ m_bmp1.DeleteObject(); m_bmp2.DeleteObject(); m_bmp3.DeleteObject(); m_bmp4.DeleteObject();}
///消息映射BEGIN_MESSAGE_MAP(CXPButton, CButton) //{{AFX_MSG_MAP(CXPButton) ON_WM_MOUSEMOVE() ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave) ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
ON_WM_CTLCOLOR() ON_WM_ERASEBKGND() //}}AFX_MSG_MAP ON_WM_ENABLE()END_MESSAGE_MAP()
void CZPButton::CreateBmpFile(LPCSTR str1,LPCSTR str2,LPCSTR str3,LPCSTR str4,UINT nColor){ m_nColor = nColor; if( m_bmp1.m_hObject != NULL )//判断 m_bmp1.DeleteObject(); /载入图片1 HBITMAP hbmp1 = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), str1, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE); m_bmp1.Attach( hbmp1 );
if( m_bmp2.m_hObject != NULL )//判断 m_bmp2.DeleteObject(); /载入图片2 HBITMAP hbmp2 = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), str2, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE); m_bmp2.Attach( hbmp2 );
if( m_bmp3.m_hObject != NULL )//判断 m_bmp3.DeleteObject(); /载入图片3 HBITMAP hbmp3 = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), str3, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE); m_bmp3.Attach( hbmp3 );
if( m_bmp4.m_hObject != NULL )//判断 m_bmp4.DeleteObject(); /载入图片4 HBITMAP hbmp4 = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), str4, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE); m_bmp4.Attach( hbmp4 );}
void CZPButton::SetEnabled( BOOL bEnabled ){ EnableWindow(bEnabled); InvalidateRect(NULL, FALSE);}//添加Owner Draw属性void CZPButton::PreSubclassWindow() { ModifyStyle(0, BS_OWNERDRAW); CButton::PreSubclassWindow();}
void CZPButton::OnMouseMove(UINT nFlags, CPoint point) { if (!m_bTracking) { TRACKMOUSEEVENT tme; tme.cbSize = sizeof(tme); tme.hwndTrack = m_hWnd; tme.dwFlags = TME_LEAVE | TME_HOVER; tme.dwHoverTime = 1; m_bTracking = _TrackMouseEvent(&tme); }
CButton::OnMouseMove(nFlags, point);}
LRESULT CZPButton::OnMouseLeave(WPARAM wParam, LPARAM lParam){ m_bOver = FALSE; m_bTracking = FALSE; InvalidateRect(NULL, FALSE); return 0;}
LRESULT CZPButton::OnMouseHover(WPARAM wParam, LPARAM lParam){ m_bOver = TRUE; InvalidateRect(NULL); return 0;}
void CZPButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){ //从lpDrawItemStruct获取控件的相关信息 CRect rect = lpDrawItemStruct->rcItem; UINT state = lpDrawItemStruct->itemState;
//获取按钮的状态 if (m_bOver) { CClientDC dc(this);
CDC memdc; memdc.CreateCompatibleDC(&dc); CBitmap *pOldImageBMP = memdc.SelectObject(&m_bmp2); TransparentBlt(dc.m_hDC, rect.left, rect.top, rect.Width(), rect.Height(), memdc.m_hDC, 0, 0, rect.Width(), rect.Height(), m_nColor); memdc.SelectObject(pOldImageBMP); memdc.DeleteDC(); if(pOldImageBMP) pOldImageBMP->DeleteObject(); } else { CClientDC dc(this);
CDC memdc; memdc.CreateCompatibleDC(&dc); CBitmap *pOldImageBMP = memdc.SelectObject(&m_bmp1); TransparentBlt(dc.m_hDC, rect.left, rect.top, rect.Width(), rect.Height(), memdc.m_hDC, 0, 0, rect.Width(), rect.Height(), m_nColor); memdc.SelectObject(pOldImageBMP); memdc.DeleteDC(); if(pOldImageBMP) pOldImageBMP->DeleteObject(); }
if (state & ODS_SELECTED) { CClientDC dc(this);
CDC memdc; memdc.CreateCompatibleDC(&dc); CBitmap *pOldImageBMP = memdc.SelectObject(&m_bmp3); TransparentBlt(dc.m_hDC, rect.left, rect.top, rect.Width(), rect.Height(), memdc.m_hDC, 0, 0, rect.Width(), rect.Height(), m_nColor); memdc.SelectObject(pOldImageBMP); memdc.DeleteDC(); if(pOldImageBMP) pOldImageBMP->DeleteObject(); } else if(state & ODS_DISABLED) { CClientDC dc(this);
CDC memdc; memdc.CreateCompatibleDC(&dc); CBitmap *pOldImageBMP = memdc.SelectObject(&m_bmp4); TransparentBlt(dc.m_hDC, rect.left, rect.top, rect.Width(), rect.Height(), memdc.m_hDC, 0, 0, rect.Width(), rect.Height(), m_nColor); memdc.SelectObject(pOldImageBMP); memdc.DeleteDC(); if(pOldImageBMP) pOldImageBMP->DeleteObject(); }}
BOOL CZPButton::OnEraseBkgnd(CDC* pDC){ //获取窗口大小 CRect rt; GetClientRect(&rt); ///把按钮的背景绘制好 CDC memdc; memdc.CreateCompatibleDC(pDC); CBitmap *pOldImageBMP = memdc.SelectObject(&m_bmp4); TransparentBlt(pDC->m_hDC, rt.left, rt.top, rt.Width(), rt.Height(), memdc.m_hDC, 0, 0, rt.Width(), rt.Height(), m_nColor); memdc.SelectObject(pOldImageBMP); memdc.DeleteDC(); if(pOldImageBMP) pOldImageBMP->DeleteObject();
return TRUE;}HBRUSH CZPButton::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){ //设置透明背景模式 pDC->SetBkMode( TRANSPARENT ); //设置背景刷子为空 return FALSE;}void CZPButton::OnEnable(BOOL bEnable){ CButton::OnEnable(bEnable);
// TODO: 在此处添加消息处理程序代码}
