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);  

    效果图

  • 相关阅读:
    外校培训前三节课知识集合纲要(我才不会告诉你我前两节只是单纯的忘了)
    floyd算法----牛栏
    bfs开始--马的遍历
    (DP 线性DP 递推) leetcode 64. Minimum Path Sum
    (DP 线性DP 递推) leetcode 63. Unique Paths II
    (DP 线性DP 递推) leetcode 62. Unique Paths
    (DP 背包) leetcode 198. House Robber
    (贪心 复习) leetcode 1007. Minimum Domino Rotations For Equal Row
    (贪心) leetcode 452. Minimum Number of Arrows to Burst Balloons
    (字符串 栈) leetcode 921. Minimum Add to Make Parentheses Valid
  • 原文地址:https://www.cnblogs.com/lidabo/p/3482758.html
Copyright © 2011-2022 走看看