zoukankan      html  css  js  c++  java
  • MFC + CxImage 实现自绘半透明按钮

    环境:VS2008 + CxImage

    btn.h

    1. #pragma once  
    2.   
    3.   
    4. // CBtn  
    5. #include "ximage/ximage.h"  
    6.   
    7. class CBtn : public CButton  
    8. {  
    9.     DECLARE_DYNAMIC(CBtn)  
    10. private:  
    11.     CxImage * m_pImgNormal;  
    12.     CxImage * m_pImgOver;  
    13.     CxImage * m_pImgDown;  
    14.     CxImage * m_pImgFocus;  
    15.     CxImage * m_pImgDisable;  
    16.   
    17.     BOOL m_bTracking;  
    18.     BOOL m_bMouseOver;  
    19.     BOOL m_bLBtnDown;  
    20. public:  
    21.     CBtn(UINT imgID_LbtnDown,UINT imgID_Over,UINT imgID_Normal,UINT imgID_Disabled=0,UINT imgID_Focus=0);  
    22.     virtual ~CBtn();  
    23.   
    24. protected:  
    25.     DECLARE_MESSAGE_MAP()  
    26. public:  
    27.     virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);  
    28.     afx_msg void OnDestroy();  
    29.     afx_msg BOOL OnEraseBkgnd(CDC* pDC);  
    30.     afx_msg void OnMouseMove(UINT nFlags, CPoint point);  
    31.     afx_msg void OnMouseLeave();  
    32.     afx_msg void OnMouseHover(UINT nFlags, CPoint point);  
    33. protected:  
    34.     virtual BOOL PreCreateWindow(CREATESTRUCT& cs);  
    35. public:  
    36.     void PaintParent();  
    37.     virtual BOOL Create(LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);  
    38.     afx_msg void OnLButtonDown(UINT nFlags, CPoint point);  
    39.     afx_msg void OnLButtonUp(UINT nFlags, CPoint point);  
    40.     afx_msg void OnBnDoubleclicked();  
    41.     afx_msg void OnKillFocus(CWnd* pNewWnd);  
    42. };  

    btn.cpp

    1. // Btn.cpp : 实现文件  
    2. //  
    3.   
    4. #include "stdafx.h"  
    5. #include "Btn.h"  
    6.   
    7.   
    8. // CBtn  
    9.   
    10. IMPLEMENT_DYNAMIC(CBtn, CButton)  
    11.   
    12. CBtn::CBtn(UINT imgID_LbtnDown,UINT imgID_Over,UINT imgID_Normal,UINT imgID_Disabled,UINT imgID_Focus):  
    13.       m_pImgNormal(NULL)  
    14.     , m_pImgOver(NULL)  
    15.     , m_pImgDown(NULL)  
    16.     , m_pImgFocus(NULL)  
    17.     , m_pImgDisable(NULL)  
    18.     , m_bTracking(FALSE)  
    19.     , m_bMouseOver(FALSE)  
    20.     , m_bLBtnDown(FALSE)  
    21. {  
    22.     if(imgID_Normal > 0)  
    23.     {  
    24.         if(!m_pImgNormal)  
    25.             m_pImgNormal = new CxImage(CXIMAGE_FORMAT_PNG);  
    26.         m_pImgNormal ->LoadResource(FindResource(NULL,MAKEINTRESOURCE(imgID_Normal),L"PNG"),CXIMAGE_FORMAT_PNG);  
    27.     }  
    28.     if(imgID_Focus > 0)  
    29.     {  
    30.         if(!m_pImgFocus)  
    31.             m_pImgFocus = new CxImage(CXIMAGE_FORMAT_PNG);  
    32.         m_pImgFocus ->LoadResource(FindResource(NULL,MAKEINTRESOURCE(imgID_Focus),L"PNG"),CXIMAGE_FORMAT_PNG);  
    33.     }  
    34.     if( imgID_LbtnDown>0 )  
    35.     {  
    36.         if(!m_pImgDown)  
    37.             m_pImgDown = new CxImage(CXIMAGE_FORMAT_PNG);  
    38.         m_pImgDown ->LoadResource(FindResource(NULL,MAKEINTRESOURCE(imgID_LbtnDown),L"PNG"),CXIMAGE_FORMAT_PNG);  
    39.     }  
    40.     if( imgID_Disabled > 0 )  
    41.     {  
    42.         if(!m_pImgDisable)  
    43.             m_pImgDisable = new CxImage(CXIMAGE_FORMAT_PNG);  
    44.         m_pImgDisable ->LoadResource(FindResource(NULL,MAKEINTRESOURCE(imgID_Disabled),L"PNG"),CXIMAGE_FORMAT_PNG);  
    45.     }  
    46.     if( imgID_Over > 0)  
    47.     {  
    48.         if(!m_pImgOver)  
    49.             m_pImgOver = new CxImage(CXIMAGE_FORMAT_PNG);  
    50.         m_pImgOver ->LoadResource(FindResource(NULL,MAKEINTRESOURCE(imgID_Over),L"PNG"),CXIMAGE_FORMAT_PNG);  
    51.     }  
    52. }  
    53.   
    54. CBtn::~CBtn()  
    55. {  
    56. }  
    57.   
    58. BEGIN_MESSAGE_MAP(CBtn, CWnd)  
    59.     ON_WM_DESTROY()  
    60.     ON_WM_ERASEBKGND()  
    61.     ON_WM_MOUSEMOVE()  
    62.     ON_WM_MOUSELEAVE()  
    63.     ON_WM_MOUSEHOVER()  
    64.     ON_WM_LBUTTONDOWN()  
    65.     ON_WM_LBUTTONUP()  
    66.     ON_CONTROL_REFLECT(BN_DOUBLECLICKED, &CBtn::OnBnDoubleclicked)  
    67.     ON_WM_KILLFOCUS()  
    68. END_MESSAGE_MAP()  
    69.   
    70.   
    71. // CBtn 消息处理程序  
    72. void CBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)  
    73. {  
    74.     CDC ButtonDC;   
    75.     CRect rc;  
    76.       
    77.     ButtonDC.Attach(lpDrawItemStruct->hDC); //得到用于绘制按钮的DC   
    78.     rc=lpDrawItemStruct->rcItem; //获取按钮所占的矩形大小  
    79.   
    80.     UINT state = lpDrawItemStruct->itemState; //获取按钮目前所处的状态,根据不同的状态绘制不同的按钮   
    81.   
    82.     if(state&ODS_DISABLED && m_pImgDisable)   
    83.     {   
    84.         m_pImgDisable ->Draw(ButtonDC.GetSafeHdc(),rc);  
    85.     }  
    86.     else  
    87.     {  
    88.   
    89.         if( m_bLBtnDown && m_pImgDown)  
    90.         {  
    91.             m_pImgDown ->Draw(ButtonDC.GetSafeHdc(),rc);  
    92.         }  
    93.         else if(m_bMouseOver && m_pImgOver)  
    94.         {  
    95.             m_pImgOver ->Draw(ButtonDC.GetSafeHdc(),rc);  
    96.         }  
    97.         else if(state&ODS_FOCUS && m_pImgFocus)   
    98.         {   
    99.             m_pImgFocus ->Draw(ButtonDC.GetSafeHdc(),rc);  
    100.         }  
    101.         else if(m_pImgNormal)  
    102.         {  
    103.             m_pImgNormal ->Draw(ButtonDC.GetSafeHdc(),rc);  
    104.         }  
    105.     }  
    106. }  
    107.   
    108. void CBtn::OnDestroy()  
    109. {  
    110.     CButton::OnDestroy();  
    111.   
    112.     // TODO: 在此处添加消息处理程序代码  
    113.     if(m_pImgNormal)  
    114.     {  
    115.         m_pImgNormal ->Destroy();  
    116.         delete m_pImgNormal;  
    117.         m_pImgNormal = NULL;  
    118.     }  
    119.     if(m_pImgOver)  
    120.     {  
    121.         m_pImgOver ->Destroy();  
    122.         delete m_pImgOver;  
    123.         m_pImgOver = NULL;  
    124.     }  
    125.     if(m_pImgDown)  
    126.     {  
    127.         m_pImgDown ->Destroy();  
    128.         delete m_pImgDown;  
    129.         m_pImgDown = NULL;  
    130.     }  
    131.     if(m_pImgFocus)  
    132.     {  
    133.         m_pImgFocus ->Destroy();  
    134.         delete m_pImgFocus;  
    135.         m_pImgFocus = NULL;  
    136.     }  
    137.     if(m_pImgDisable)  
    138.     {  
    139.         m_pImgDisable ->Destroy();  
    140.         delete m_pImgDisable;  
    141.         m_pImgDisable = NULL;  
    142.     }  
    143. }  
    144.   
    145. BOOL CBtn::OnEraseBkgnd(CDC* pDC)  
    146. {  
    147.     // TODO: 在此添加消息处理程序代码和/或调用默认值  
    148.     return TRUE;  
    149.     //return CButton::OnEraseBkgnd(pDC);  
    150. }  
    151.   
    152. BOOL CBtn::PreCreateWindow(CREATESTRUCT& cs)  
    153. {  
    154.     // TODO: 在此添加专用代码和/或调用基类  
    155.     cs.style |= BS_OWNERDRAW;  
    156.   
    157.     return CButton::PreCreateWindow(cs);  
    158. }  
    159.   
    160. void CBtn::OnMouseMove(UINT nFlags, CPoint point)  
    161. {  
    162.     // TODO: 在此添加消息处理程序代码和/或调用默认值  
    163.     m_bMouseOver = TRUE;  
    164.     if (!m_bTracking)  
    165.     {  
    166.         TRACKMOUSEEVENT   tme;   
    167.         tme.cbSize      =   sizeof(TRACKMOUSEEVENT);   
    168.         tme.dwFlags     =   TME_LEAVE|TME_HOVER; //  
    169.         tme.hwndTrack   =   GetSafeHwnd();   
    170.         tme.dwHoverTime =   8;   
    171.         _TrackMouseEvent(&tme);  
    172.         m_bTracking = TRUE;  
    173.     }  
    174.     CButton::OnMouseMove(nFlags, point);  
    175.     ::SetCursor(AfxGetApp() ->LoadCursor(IDC_CURSOR_HAND));  
    176. }  
    177.   
    178. void CBtn::OnMouseLeave()  
    179. {  
    180.     // TODO: 在此添加消息处理程序代码和/或调用默认值  
    181.     m_bMouseOver    =   FALSE;   
    182.     m_bTracking     =   FALSE;    
    183.     m_bLBtnDown     =   FALSE;  
    184.     PaintParent();  
    185.     CButton::OnMouseLeave();  
    186. }  
    187.   
    188. void CBtn::OnMouseHover(UINT nFlags, CPoint point)  
    189. {  
    190.     m_bMouseOver = TRUE;  
    191.     PaintParent();  
    192.     ::SetCursor(AfxGetApp() ->LoadCursor(IDC_CURSOR_HAND));  
    193. }  
    194.   
    195. void CBtn::PaintParent()  
    196. {  
    197.     CRect   rect;   
    198.     GetWindowRect(&rect);   
    199.     GetParent()-> ScreenToClient(&rect);   
    200.     GetParent()-> InvalidateRect(&rect);  
    201. }  
    202.   
    203. BOOL CBtn::Create(LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)  
    204. {  
    205.     BOOL OK=CButton::Create(lpszCaption, dwStyle, rect, pParentWnd, nID);  
    206.     ModifyStyleEx(0, WS_EX_TRANSPARENT);// WS_EX_LAYERED||WS_EX_TRANSPARENT    
    207.     return OK;  
    208. }  
    209.   
    210. void CBtn::OnLButtonDown(UINT nFlags, CPoint point)  
    211. {  
    212.     m_bLBtnDown = TRUE;  
    213.     PaintParent();  
    214.     CButton::OnLButtonDown(nFlags, point);  
    215.     ::SetCursor(AfxGetApp() ->LoadCursor(IDC_CURSOR_HAND));  
    216. }  
    217.   
    218. void CBtn::OnLButtonUp(UINT nFlags, CPoint point)  
    219. {  
    220.     m_bLBtnDown = FALSE;  
    221.     PaintParent();  
    222.     CButton::OnLButtonUp(nFlags, point);  
    223.     ::SetCursor(AfxGetApp() ->LoadCursor(IDC_CURSOR_HAND));  
    224. }  
    225.   
    226. void CBtn::OnBnDoubleclicked()  
    227. {  
    228.     // TODO: 在此添加控件通知处理程序代码  
    229.     ::SetCursor(AfxGetApp() ->LoadCursor(IDC_CURSOR_HAND));  
    230. }  
    231.   
    232. void CBtn::OnKillFocus(CWnd* pNewWnd)  
    233. {  
    234.     CButton::OnKillFocus(pNewWnd);  
    235.   
    236.     // TODO: 在此处添加消息处理程序代码  
    237.     PaintParent();  
    238. }  

    调用

    1. ///头文件中添加  
    2. ...  
    3. #include "Btn.h"  
    4. ...  
    5.         enum {emTestBtnId1=8099,emTestBtnId2,emTestBtnId3};  
    6.     CBtn m_btnTest1,m_btnTest2,m_btnTest3;//test  
    7.   
    8. ///在构造函数初始化列表中初始化变量(IDB_PNG_BTN_TEST_*为Png图片资源ID)     
    9.     , m_btnTest1(IDB_PNG_BTN_TEST_DOWN,  
    10.             IDB_PNG_BTN_TEST_MOUSEOVER,  
    11.             IDB_PNG_BTN_TEST_NORMAL,  
    12.             IDB_PNG_BTN_TEST_DISABLE,  
    13.             IDB_PNG_BTN_TEST_FOCUS)   
    14.     , m_btnTest2(IDB_PNG_BTN_TEST_DOWN,  
    15.             IDB_PNG_BTN_TEST_MOUSEOVER,  
    16.             IDB_PNG_BTN_TEST_NORMAL,  
    17.             IDB_PNG_BTN_TEST_DISABLE/*,IDB_PNG_BTN_TEST_FOCUS*/)   
    18.     , m_btnTest3(IDB_PNG_BTN_TEST_DOWN,  
    19.             IDB_PNG_BTN_TEST_MOUSEOVER,  
    20.             IDB_PNG_BTN_TEST_NORMAL,  
    21.             IDB_PNG_BTN_TEST_DISABLE/*,IDB_PNG_BTN_TEST_FOCUS*/)  
    22.   
    23. ////在OnInitDialog()函数中创建按钮  
    24.     //test   
    25.     m_btnTest1.Create(_T("test"),WS_VISIBLE | WS_CHILD/* |WS_DISABLED*/,CRect(10,10,58,58),this,emTestBtnId1);   
    26.     m_btnTest2.Create(_T("test"),WS_VISIBLE | WS_CHILD/* |WS_DISABLED*/,CRect(10,60,58,108),this,emTestBtnId2);   
    27.     m_btnTest3.Create(_T("test"),WS_VISIBLE | WS_CHILD |WS_DISABLED,CRect(10,110,58,158),this,emTestBtnId2);  

    效果图

  • 相关阅读:
    onSaveInstanceState和onRestoreInstanceState()
    Android TextView中文字通过SpannableString来设置超链接、颜色、字体等属性
    又优化了一下 Android ListView 异步加载图片
    ListView异步加载图片
    SpannableString 设置一段文字中部分字体颜色
    Android Studio apk 打包流程
    svn分支开发与主干合并(branch & merge)
    SVN使用教程之——分支、合并
    XMPP协议实现原理介绍
    监听器
  • 原文地址:https://www.cnblogs.com/lidabo/p/3482758.html
Copyright © 2011-2022 走看看