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 实现自绘半透明按钮

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

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • BigDecimal详解 BigDecimal加减乘除运算 BigDecimal比较大小 BigDecimal保留两位小数

    BigDecimal详解 BigDecimal加减乘除运算 BigDecimal比较大小 BigDecimal保留两位小数文章目录1、为什么要用BigDecimal?2、BigDecimal初始化赋值3、BigDecimal的加减乘除运算4、BigDecimal比较大小5、BigDecimal保留两位小数及舍入模式6、BigDecimal其他方法及常量1、为什么要用BigDecimal?工作中我们通过浮点数进行运算时,好像时不时的会出现一些小误差。例如:publicstaticvoidmain(String[]args){System.out.println(1.9-1.2);Sys

    2022年6月2日
  • 编程中的卫语句

    什么是卫语句在《阿里巴巴Java开发手册》中提到,多层条件语句建议使用卫语句、策略模式、状态模式等方式重构。那么,什么是卫语句呢?在中文维基百科中是这样介绍的在计算机程序设计中,卫(guard)是布尔表达式,其结果必须为真,程序才能执行下去。卫语句(guardcode或guardclause)用于检查先决条件。卫语句的用途,例如:引用(reference)使用前检查是否为空引用;处置模式使用一个布尔域,使得释放资源操作成为幂等运算,即多次释放资源等效于只释放一次。卫语句可用于子进程的提前

    2022年4月7日
  • mybatis oracle分页查询sql语句(oracle查询分页)

    java实现mysql分页查询1.前言1.mysql中分页用limit,但是limit后面不能跟表达式,错误表达式:limit(1-1)*10,10。2.对象中提供分页数据的方法。备注:limita,b表示从第a+1条开始取,本次一共取b条如limit0,10:取第1-10条数据,如limit25,8:去第26-33条数据。application.properties数据库Mysql配置#数据库配置spring.datasource.url=jdbc:mysql://loc

    2022年4月15日
  • 什么叫结构化数据半结构化数据和非结构化数据(xml是非结构化数据)

    计算机信息化系统中的数据分为结构化数据和非结构化数据、半结构化数据。结构化数据结构化数据,是指由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理。也称作行数据,一般特点是:数据以行为单位,一行数据表示一个实体的信息,每一行数据的属性是相同的。比如: id name gen…

    2022年4月17日
  • 1+X 云计算平台运维与开发认证(初级)样卷A——附答案

    传送门教育部:职业教育将启动“1+X”证书制度改革职业教育改革1+X证书制度试点启动1+X成绩/证书查询入口文章目录一、单选题(每题10分,共200分)二、多选题(每题15分,共300分)三、实操题(共500分)网络管理(70分)yum源管理(60分)数据库管理(70分)Linux存储LVM管理(60分)OpenStack管理(80分)Docker管理(80分)WordPress应用系…

    2022年4月8日
  • 【闲聊产品】之四:代码的万劫不复

    【闲聊产品】之四:代码的万劫不复

    2021年11月16日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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