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)


相关推荐

  • mac连上wifi却上不了网「建议收藏」

    mac连上wifi却上不了网「建议收藏」mac连上wifi却上不了网总结起来就是先删干净wifi再重新新建一个wifi选项电脑自动分配一个地址等于是格式化wifi了

  • 网上英语学习资源大整理

    网上英语学习资源大整理 翻译http://www.bilinguist.com/汉英论坛,高手云集[url]http://www.chinatranslate.net/[/url]中国翻译网,号称全国最大的翻译专业网站[url]http://gb.transea.com/[/url]机器即时翻译,适合整体翻译网站及段落,但不够准确。适合一般人[url]http://www.si-chi…

    2022年10月26日
  • C1能力认证训练题解析 _ 第四部分 _ Web进阶「建议收藏」

    C1能力认证训练题解析 _ 第四部分 _ Web进阶「建议收藏」C1见习工程师能力认证训练题_第四部分_Web进阶

    2022年10月20日
  • GridLayout的使用

    GridLayout的使用GridLayout的使用:GridLayout的类层次结构图:java.lang.Object–java.awt.GridLayoutGridLayout比FlowLayout多了行和列的设置,也就是说你要先设置GridLayout共有几行几列,就如同二维平面一般,然后你加进去的组件会先填第一行的格子,然后再从第二行开始填,依此类扒,就像是一个个的格子一般。而

  • 系统测试计划_软件系统测试计划

    系统测试计划_软件系统测试计划系统测试是针对软件产品系统进行的测试(黑盒测试) 功能测试:是否符合需求规格、功能设计、用户满意度 非功能测试:容错性、稳定性、异常处理能力、高强度输入处理能力、可用性、性能 系统测试(系统测试计划包含系统测试的设计、实现和执行的工作): 系统测试计划:完成系统测试计划。软件产品的需求规格确定后编写。 系统测试设计:完成系统方案。软件概要设计文档确定后编写。 系统测试实现…

  • rider 激活码【中文破解版】[通俗易懂]

    (rider 激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.cn/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~S32PGH0SQB-eyJsaWNlbnNlSWQiOi…

发表回复

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

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