VC编程之MFC + CxImage 实现自绘半透明按钮
小标 2019-03-20 来源 : 阅读 1592 评论 0

摘要:本文主要向大家介绍了VC编程之MFC + CxImage 实现自绘半透明按钮,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程之MFC + CxImage 实现自绘半透明按钮,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

VC编程之MFC + CxImage 实现自绘半透明按钮

[cpp] view plain copy
 
1.#pragma once  
2.  
3.// CBtn  
4.#include "ximage/ximage.h"  
5.  
6.class CBtn : public CButton  
7.{  
8.    DECLARE_DYNAMIC(CBtn)  
9.private:  
10.    CxImage * m_pImgNormal;  
11.    CxImage * m_pImgOver;  
12.    CxImage * m_pImgDown;  
13.    CxImage * m_pImgFocus;  
14.    CxImage * m_pImgDisable;  
15.  
16.    BOOL m_bTracking;  
17.    BOOL m_bMouseOver;  
18.    BOOL m_bLBtnDown;  
19.public:  
20.    CBtn(UINT imgID_LbtnDown,UINT imgID_Over,UINT imgID_Normal,UINT imgID_Disabled=0,UINT imgID_Focus=0);  
21.    virtual ~CBtn();  
22.  
23.protected:  
24.    DECLARE_MESSAGE_MAP()  
25.public:  
26.    virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);  
27.    afx_msg void OnDestroy();  
28.    afx_msg BOOL OnEraseBkgnd(CDC* pDC);  
29.    afx_msg void OnMouseMove(UINT nFlags, CPoint point);  
30.    afx_msg void OnMouseLeave();  
31.    afx_msg void OnMouseHover(UINT nFlags, CPoint point);  
32.protected:  
33.    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);  
34.public:  
35.    void PaintParent();  
36.    virtual BOOL Create(LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);  
37.    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);  
38.    afx_msg void OnLButtonUp(UINT nFlags, CPoint point);  
39.    afx_msg void OnBnDoubleclicked();  
40.    afx_msg void OnKillFocus(CWnd* pNewWnd);  
41.};  

btn.cpp
 
 
 
[cpp] view plain copy
 
1.// Btn.cpp : 实现文件     
2.//     
3.    
4.#include "stdafx.h"     
5.#include "Btn.h"     
6.    
7.    
8.// CBtn  
9.IMPLEMENT_DYNAMIC(CBtn, CButton)    
10.    
11.CBtn::CBtn(UINT imgID_LbtnDown,UINT imgID_Over,UINT imgID_Normal,UINT imgID_Disabled,UINT imgID_Focus):    
12.      m_pImgNormal(NULL)    
13.    , m_pImgOver(NULL)    
14.    , m_pImgDown(NULL)    
15.    , m_pImgFocus(NULL)    
16.    , m_pImgDisable(NULL)    
17.    , m_bTracking(FALSE)    
18.    , m_bMouseOver(FALSE)    
19.    , m_bLBtnDown(FALSE)    
20.{    
21.    if(imgID_Normal > 0)    
22.    {    
23.        if(!m_pImgNormal)    
24.            m_pImgNormal = new CxImage(CXIMAGE_FORMAT_PNG);    
25.        m_pImgNormal ->LoadResource(FindResource(NULL,MAKEINTRESOURCE(imgID_Normal),L"PNG"),CXIMAGE_FORMAT_PNG);    
26.    }    
27.    if(imgID_Focus > 0)    
28.    {    
29.        if(!m_pImgFocus)    
30.            m_pImgFocus = new CxImage(CXIMAGE_FORMAT_PNG);    
31.        m_pImgFocus ->LoadResource(FindResource(NULL,MAKEINTRESOURCE(imgID_Focus),L"PNG"),CXIMAGE_FORMAT_PNG);    
32.    }    
33.    if( imgID_LbtnDown>0 )    
34.    {    
35.        if(!m_pImgDown)    
36.            m_pImgDown = new CxImage(CXIMAGE_FORMAT_PNG);    
37.        m_pImgDown ->LoadResource(FindResource(NULL,MAKEINTRESOURCE(imgID_LbtnDown),L"PNG"),CXIMAGE_FORMAT_PNG);    
38.    }    
39.    if( imgID_Disabled > 0 )    
40.    {    
41.        if(!m_pImgDisable)    
42.            m_pImgDisable = new CxImage(CXIMAGE_FORMAT_PNG);    
43.        m_pImgDisable ->LoadResource(FindResource(NULL,MAKEINTRESOURCE(imgID_Disabled),L"PNG"),CXIMAGE_FORMAT_PNG);    
44.    }    
45.    if( imgID_Over > 0)    
46.    {    
47.        if(!m_pImgOver)    
48.            m_pImgOver = new CxImage(CXIMAGE_FORMAT_PNG);    
49.        m_pImgOver ->LoadResource(FindResource(NULL,MAKEINTRESOURCE(imgID_Over),L"PNG"),CXIMAGE_FORMAT_PNG);    
50.    }    
51.}    
52.    
53.CBtn::~CBtn()    
54.{    
55.}    
56.    
57.BEGIN_MESSAGE_MAP(CBtn, CWnd)    
58.    ON_WM_DESTROY()    
59.    ON_WM_ERASEBKGND()    
60.    ON_WM_MOUSEMOVE()    
61.    ON_WM_MOUSELEAVE()    
62.    ON_WM_MOUSEHOVER()    
63.    ON_WM_LBUTTONDOWN()    
64.    ON_WM_LBUTTONUP()    
65.    ON_CONTROL_REFLECT(BN_DOUBLECLICKED, &CBtn::OnBnDoubleclicked)    
66.    ON_WM_KILLFOCUS()    
67.END_MESSAGE_MAP()    
68.    
69.    
70.// CBtn 消息处理程序     
71.void CBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)    
72.{    
73.    CDC ButtonDC;     
74.    CRect rc;    
75.        
76.    ButtonDC.Attach(lpDrawItemStruct->hDC); //得到用于绘制按钮的DC      
77.    rc=lpDrawItemStruct->rcItem; //获取按钮所占的矩形大小     
78.    
79.    UINT state = lpDrawItemStruct->itemState; //获取按钮目前所处的状态,根据不同的状态绘制不同的按钮      
80.    
81.    if(state&ODS_DISABLED && m_pImgDisable)     
82.    {     
83.        m_pImgDisable ->Draw(ButtonDC.GetSafeHdc(),rc);    
84.    }    
85.    else    
86.    {    
87.    
88.        if( m_bLBtnDown && m_pImgDown)    
89.        {    
90.            m_pImgDown ->Draw(ButtonDC.GetSafeHdc(),rc);    
91.        }    
92.        else if(m_bMouseOver && m_pImgOver)    
93.        {    
94.            m_pImgOver ->Draw(ButtonDC.GetSafeHdc(),rc);    
95.        }    
96.        else if(state&ODS_FOCUS && m_pImgFocus)     
97.        {     
98.            m_pImgFocus ->Draw(ButtonDC.GetSafeHdc(),rc);    
99.        }    
100.        else if(m_pImgNormal)    
101.        {    
102.            m_pImgNormal ->Draw(ButtonDC.GetSafeHdc(),rc);    
103.        }    
104.    }    
105.}    
106.    
107.void CBtn::OnDestroy()    
108.{    
109.    CButton::OnDestroy();    
110.    
111.    // TODO: 在此处添加消息处理程序代码     
112.    if(m_pImgNormal)    
113.    {    
114.        m_pImgNormal ->Destroy();    
115.        delete m_pImgNormal;    
116.        m_pImgNormal = NULL;    
117.    }    
118.    if(m_pImgOver)    
119.    {    
120.        m_pImgOver ->Destroy();    
121.        delete m_pImgOver;    
122.        m_pImgOver = NULL;    
123.    }    
124.    if(m_pImgDown)    
125.    {    
126.        m_pImgDown ->Destroy();    
127.        delete m_pImgDown;    
128.        m_pImgDown = NULL;    
129.    }    
130.    if(m_pImgFocus)    
131.    {    
132.        m_pImgFocus ->Destroy();    
133.        delete m_pImgFocus;    
134.        m_pImgFocus = NULL;    
135.    }    
136.    if(m_pImgDisable)    
137.    {    
138.        m_pImgDisable ->Destroy();    
139.        delete m_pImgDisable;    
140.        m_pImgDisable = NULL;    
141.    }    
142.}    
143.    
144.BOOL CBtn::OnEraseBkgnd(CDC* pDC)    
145.{    
146.    // TODO: 在此添加消息处理程序代码和/或调用默认值     
147.    return TRUE;    
148.    //return CButton::OnEraseBkgnd(pDC);     
149.}    
150.    
151.BOOL CBtn::PreCreateWindow(CREATESTRUCT& cs)    
152.{    
153.    // TODO: 在此添加专用代码和/或调用基类     
154.    cs.style |= BS_OWNERDRAW;    
155.    
156.    return CButton::PreCreateWindow(cs);    
157.}    
158.    
159.void CBtn::OnMouseMove(UINT nFlags, CPoint point)    
160.{    
161.    // TODO: 在此添加消息处理程序代码和/或调用默认值     
162.    m_bMouseOver = TRUE;    
163.    if (!m_bTracking)    
164.    {    
165.        TRACKMOUSEEVENT   tme;     
166.        tme.cbSize      =   sizeof(TRACKMOUSEEVENT);     
167.        tme.dwFlags     =   TME_LEAVE|TME_HOVER; //     
168.        tme.hwndTrack   =   GetSafeHwnd();     
169.        tme.dwHoverTime =   8;     
170.        _TrackMouseEvent(&tme);    
171.        m_bTracking = TRUE;    
172.    }    
173.    CButton::OnMouseMove(nFlags, point);    
174.    ::SetCursor(AfxGetApp() ->LoadCursor(IDC_CURSOR_HAND));    
175.}    
176.    
177.void CBtn::OnMouseLeave()    
178.{    
179.    // TODO: 在此添加消息处理程序代码和/或调用默认值     
180.    m_bMouseOver    =   FALSE;     
181.    m_bTracking     =   FALSE;      
182.    m_bLBtnDown     =   FALSE;    
183.    PaintParent();    
184.    CButton::OnMouseLeave();    
185.}    
186.    
187.void CBtn::OnMouseHover(UINT nFlags, CPoint point)    
188.{    
189.    m_bMouseOver = TRUE;    
190.    PaintParent();    
191.    ::SetCursor(AfxGetApp() ->LoadCursor(IDC_CURSOR_HAND));    
192.}    
193.    
194.void CBtn::PaintParent()    
195.{    
196.    CRect   rect;     
197.    GetWindowRect(&rect);     
198.    GetParent()-> ScreenToClient(&rect);     
199.    GetParent()-> InvalidateRect(&rect);    
200.}    
201.    
202.BOOL CBtn::Create(LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)    
203.{    
204.    BOOL OK=CButton::Create(lpszCaption, dwStyle, rect, pParentWnd, nID);    
205.    ModifyStyleEx(0, WS_EX_TRANSPARENT);// WS_EX_LAYERED||WS_EX_TRANSPARENT       
206.    return OK;    
207.}    
208.    
209.void CBtn::OnLButtonDown(UINT nFlags, CPoint point)    
210.{    
211.    m_bLBtnDown = TRUE;    
212.    PaintParent();    
213.    CButton::OnLButtonDown(nFlags, point);    
214.    ::SetCursor(AfxGetApp() ->LoadCursor(IDC_CURSOR_HAND));    
215.}    
216.    
217.void CBtn::OnLButtonUp(UINT nFlags, CPoint point)    
218.{    
219.    m_bLBtnDown = FALSE;    
220.    PaintParent();    
221.    CButton::OnLButtonUp(nFlags, point);    
222.    ::SetCursor(AfxGetApp() ->LoadCursor(IDC_CURSOR_HAND));    
223.}    
224.    
225.void CBtn::OnBnDoubleclicked()    
226.{    
227.    // TODO: 在此添加控件通知处理程序代码     
228.    ::SetCursor(AfxGetApp() ->LoadCursor(IDC_CURSOR_HAND));    
229.}    
230.    
231.void CBtn::OnKillFocus(CWnd* pNewWnd)    
232.{    
233.    CButton::OnKillFocus(pNewWnd);    
234.    
235.    // TODO: 在此处添加消息处理程序代码     
236.    PaintParent();    
237.}    
 
 
 
调用
[cpp] view plain copy
 
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); 

以上就介绍了VC/MFC的学习,希望对VC/MFC有兴趣的朋友有所帮助。了解更多内容,请关注职坐标编程语言VC/MFC频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程