<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    MFC + CxImage 實現自繪半透明按鈕

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    環境:VS2008 + CxImage

    btn.h

    [cpp] view plaincopyprint?
    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

    [cpp] view plaincopyprint?
    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. }  

    調用

    [cpp] view plaincopyprint?
    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);  

    效果圖

    RFID設備管理軟件

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全