MFC 重写Button类

    技术2022-05-11  31

    .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: 在此处添加消息处理程序代码}

     

     


    最新回复(0)