MFC + CxImage 实现自绘半透明按钮

MFC + CxImage 实现自绘半透明按钮

环境:VS2008 + CxImage

btn.h

[cpp]
 
view plain
copy
print
?

  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 plain
copy
print
?

  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 plain
copy
print
?

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


效果图

MFC + CxImage 实现自绘半透明按钮

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/109953.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • matlab破解版安装教程2016a(中兴盒子adb二维码怎么破解)

    Matlab-Matlab2016a安装破解教程本方法只是研究破解技术所用。如果要使用软件还是要用正版的。Matlab2016a安装包及破解教程百度云分享链接: 链接:https://pan.baidu.com/s/1i6BgD8p    密码:17gg Matlab安装教程: 1、下载文件,得到R2016a_win64.part1.rar、R2016a_…

  • django pycharm_pycharm调试django

    django pycharm_pycharm调试django前言:主要是在开发过程中一些采坑和记录,整理一下资料以防自己以后忘了,也为正在初学或者还未特别熟练使用django的同学能够避开这些,且能够系统性的学习django的使用,这里就不写目录了按照我自己的开发顺序来,大家看到专栏里面的文章顺序就是我的目录了,在本专栏里的代码争取让大家拿到就能用,做一个伸手党,网上好多代码不知道是版本原因还是其他简直是无语,不能用还一堆bug。…

  • Android 多个Activity bindService的使用及Service生命周期

    Android 多个Activity bindService的使用及Service生命周期原文:https://blog.csdn.net/iispring/article/details/48169339 Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法,本文只探讨纯bindService的使用,不涉及任何startService方法调用的情况。如果想了解startService…

  • 非常详细的sift算法原理解析

    非常详细的sift算法原理解析转非常详细的sift算法原理解析<divclass="article-info-box"><divclass="article-bar-topd-flex"><

  • 教授就是大学[通俗易懂]

    教授就是大学[通俗易懂]教授就是大学有一则广为流传的关于艾森豪威尔将军的故事。话说家喻户晓的二战英雄艾森豪威尔将军在1952年接受了哥伦比亚大学的聘请,担任这家著名常青藤大学的校长。上任伊始,将军在下属的陪同下巡视校园,会见校董会、行政人员和学生,最后参加了学校教授为他举行的欢迎大家。在一阵热烈的掌声之后,将军致辞。他首先谦恭地对有机会会见在场的全体哥伦比亚大学的“雇员”们表示万分的荣幸。这时,只见哥大德高望重的物理

  • goland激活码 2022【2022最新】

    (goland激活码 2022)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html4KDDGND3CI-eyJsa…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号