MFC + CxImage 实现自绘半透明按钮
环境:VS2008 + CxImage
btn.h
- #pragma once
- // CBtn
- #include "ximage/ximage.h"
- class CBtn : public CButton
- {
- DECLARE_DYNAMIC(CBtn)
- private:
- CxImage * m_pImgNormal;
- CxImage * m_pImgOver;
- CxImage * m_pImgDown;
- CxImage * m_pImgFocus;
- CxImage * m_pImgDisable;
- BOOL m_bTracking;
- BOOL m_bMouseOver;
- BOOL m_bLBtnDown;
- public:
- CBtn(UINT imgID_LbtnDown,UINT imgID_Over,UINT imgID_Normal,UINT imgID_Disabled=0,UINT imgID_Focus=0);
- virtual ~CBtn();
- protected:
- DECLARE_MESSAGE_MAP()
- public:
- virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);
- afx_msg void OnDestroy();
- afx_msg BOOL OnEraseBkgnd(CDC* pDC);
- afx_msg void OnMouseMove(UINT nFlags, CPoint point);
- afx_msg void OnMouseLeave();
- afx_msg void OnMouseHover(UINT nFlags, CPoint point);
- protected:
- virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
- public:
- void PaintParent();
- virtual BOOL Create(LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
- afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
- afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
- afx_msg void OnBnDoubleclicked();
- afx_msg void OnKillFocus(CWnd* pNewWnd);
- };
btn.cpp
- // Btn.cpp : 实现文件
- //
- #include "stdafx.h"
- #include "Btn.h"
- // CBtn
- IMPLEMENT_DYNAMIC(CBtn, CButton)
- CBtn::CBtn(UINT imgID_LbtnDown,UINT imgID_Over,UINT imgID_Normal,UINT imgID_Disabled,UINT imgID_Focus):
- m_pImgNormal(NULL)
- , m_pImgOver(NULL)
- , m_pImgDown(NULL)
- , m_pImgFocus(NULL)
- , m_pImgDisable(NULL)
- , m_bTracking(FALSE)
- , m_bMouseOver(FALSE)
- , m_bLBtnDown(FALSE)
- {
- if(imgID_Normal > 0)
- {
- if(!m_pImgNormal)
- m_pImgNormal = new CxImage(CXIMAGE_FORMAT_PNG);
- m_pImgNormal ->LoadResource(FindResource(NULL,MAKEINTRESOURCE(imgID_Normal),L"PNG"),CXIMAGE_FORMAT_PNG);
- }
- if(imgID_Focus > 0)
- {
- if(!m_pImgFocus)
- m_pImgFocus = new CxImage(CXIMAGE_FORMAT_PNG);
- m_pImgFocus ->LoadResource(FindResource(NULL,MAKEINTRESOURCE(imgID_Focus),L"PNG"),CXIMAGE_FORMAT_PNG);
- }
- if( imgID_LbtnDown>0 )
- {
- if(!m_pImgDown)
- m_pImgDown = new CxImage(CXIMAGE_FORMAT_PNG);
- m_pImgDown ->LoadResource(FindResource(NULL,MAKEINTRESOURCE(imgID_LbtnDown),L"PNG"),CXIMAGE_FORMAT_PNG);
- }
- if( imgID_Disabled > 0 )
- {
- if(!m_pImgDisable)
- m_pImgDisable = new CxImage(CXIMAGE_FORMAT_PNG);
- m_pImgDisable ->LoadResource(FindResource(NULL,MAKEINTRESOURCE(imgID_Disabled),L"PNG"),CXIMAGE_FORMAT_PNG);
- }
- if( imgID_Over > 0)
- {
- if(!m_pImgOver)
- m_pImgOver = new CxImage(CXIMAGE_FORMAT_PNG);
- m_pImgOver ->LoadResource(FindResource(NULL,MAKEINTRESOURCE(imgID_Over),L"PNG"),CXIMAGE_FORMAT_PNG);
- }
- }
- CBtn::~CBtn()
- {
- }
- BEGIN_MESSAGE_MAP(CBtn, CWnd)
- ON_WM_DESTROY()
- ON_WM_ERASEBKGND()
- ON_WM_MOUSEMOVE()
- ON_WM_MOUSELEAVE()
- ON_WM_MOUSEHOVER()
- ON_WM_LBUTTONDOWN()
- ON_WM_LBUTTONUP()
- ON_CONTROL_REFLECT(BN_DOUBLECLICKED, &CBtn::OnBnDoubleclicked)
- ON_WM_KILLFOCUS()
- END_MESSAGE_MAP()
- // CBtn 消息处理程序
- void CBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
- {
- CDC ButtonDC;
- CRect rc;
- ButtonDC.Attach(lpDrawItemStruct->hDC); //得到用于绘制按钮的DC
- rc=lpDrawItemStruct->rcItem; //获取按钮所占的矩形大小
- UINT state = lpDrawItemStruct->itemState; //获取按钮目前所处的状态,根据不同的状态绘制不同的按钮
- if(state&ODS_DISABLED && m_pImgDisable)
- {
- m_pImgDisable ->Draw(ButtonDC.GetSafeHdc(),rc);
- }
- else
- {
- if( m_bLBtnDown && m_pImgDown)
- {
- m_pImgDown ->Draw(ButtonDC.GetSafeHdc(),rc);
- }
- else if(m_bMouseOver && m_pImgOver)
- {
- m_pImgOver ->Draw(ButtonDC.GetSafeHdc(),rc);
- }
- else if(state&ODS_FOCUS && m_pImgFocus)
- {
- m_pImgFocus ->Draw(ButtonDC.GetSafeHdc(),rc);
- }
- else if(m_pImgNormal)
- {
- m_pImgNormal ->Draw(ButtonDC.GetSafeHdc(),rc);
- }
- }
- }
- void CBtn::OnDestroy()
- {
- CButton::OnDestroy();
- // TODO: 在此处添加消息处理程序代码
- if(m_pImgNormal)
- {
- m_pImgNormal ->Destroy();
- delete m_pImgNormal;
- m_pImgNormal = NULL;
- }
- if(m_pImgOver)
- {
- m_pImgOver ->Destroy();
- delete m_pImgOver;
- m_pImgOver = NULL;
- }
- if(m_pImgDown)
- {
- m_pImgDown ->Destroy();
- delete m_pImgDown;
- m_pImgDown = NULL;
- }
- if(m_pImgFocus)
- {
- m_pImgFocus ->Destroy();
- delete m_pImgFocus;
- m_pImgFocus = NULL;
- }
- if(m_pImgDisable)
- {
- m_pImgDisable ->Destroy();
- delete m_pImgDisable;
- m_pImgDisable = NULL;
- }
- }
- BOOL CBtn::OnEraseBkgnd(CDC* pDC)
- {
- // TODO: 在此添加消息处理程序代码和/或调用默认值
- return TRUE;
- //return CButton::OnEraseBkgnd(pDC);
- }
- BOOL CBtn::PreCreateWindow(CREATESTRUCT& cs)
- {
- // TODO: 在此添加专用代码和/或调用基类
- cs.style |= BS_OWNERDRAW;
- return CButton::PreCreateWindow(cs);
- }
- void CBtn::OnMouseMove(UINT nFlags, CPoint point)
- {
- // TODO: 在此添加消息处理程序代码和/或调用默认值
- m_bMouseOver = TRUE;
- if (!m_bTracking)
- {
- TRACKMOUSEEVENT tme;
- tme.cbSize = sizeof(TRACKMOUSEEVENT);
- tme.dwFlags = TME_LEAVE|TME_HOVER; //
- tme.hwndTrack = GetSafeHwnd();
- tme.dwHoverTime = 8;
- _TrackMouseEvent(&tme);
- m_bTracking = TRUE;
- }
- CButton::OnMouseMove(nFlags, point);
- ::SetCursor(AfxGetApp() ->LoadCursor(IDC_CURSOR_HAND));
- }
- void CBtn::OnMouseLeave()
- {
- // TODO: 在此添加消息处理程序代码和/或调用默认值
- m_bMouseOver = FALSE;
- m_bTracking = FALSE;
- m_bLBtnDown = FALSE;
- PaintParent();
- CButton::OnMouseLeave();
- }
- void CBtn::OnMouseHover(UINT nFlags, CPoint point)
- {
- m_bMouseOver = TRUE;
- PaintParent();
- ::SetCursor(AfxGetApp() ->LoadCursor(IDC_CURSOR_HAND));
- }
- void CBtn::PaintParent()
- {
- CRect rect;
- GetWindowRect(&rect);
- GetParent()-> ScreenToClient(&rect);
- GetParent()-> InvalidateRect(&rect);
- }
- BOOL CBtn::Create(LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
- {
- BOOL OK=CButton::Create(lpszCaption, dwStyle, rect, pParentWnd, nID);
- ModifyStyleEx(0, WS_EX_TRANSPARENT);// WS_EX_LAYERED||WS_EX_TRANSPARENT
- return OK;
- }
- void CBtn::OnLButtonDown(UINT nFlags, CPoint point)
- {
- m_bLBtnDown = TRUE;
- PaintParent();
- CButton::OnLButtonDown(nFlags, point);
- ::SetCursor(AfxGetApp() ->LoadCursor(IDC_CURSOR_HAND));
- }
- void CBtn::OnLButtonUp(UINT nFlags, CPoint point)
- {
- m_bLBtnDown = FALSE;
- PaintParent();
- CButton::OnLButtonUp(nFlags, point);
- ::SetCursor(AfxGetApp() ->LoadCursor(IDC_CURSOR_HAND));
- }
- void CBtn::OnBnDoubleclicked()
- {
- // TODO: 在此添加控件通知处理程序代码
- ::SetCursor(AfxGetApp() ->LoadCursor(IDC_CURSOR_HAND));
- }
- void CBtn::OnKillFocus(CWnd* pNewWnd)
- {
- CButton::OnKillFocus(pNewWnd);
- // TODO: 在此处添加消息处理程序代码
- PaintParent();
- }
调用
- ///头文件中添加
- ...
- #include "Btn.h"
- ...
- enum {emTestBtnId1=8099,emTestBtnId2,emTestBtnId3};
- CBtn m_btnTest1,m_btnTest2,m_btnTest3;//test
- ///在构造函数初始化列表中初始化变量(IDB_PNG_BTN_TEST_*为Png图片资源ID)
- , m_btnTest1(IDB_PNG_BTN_TEST_DOWN,
- IDB_PNG_BTN_TEST_MOUSEOVER,
- IDB_PNG_BTN_TEST_NORMAL,
- IDB_PNG_BTN_TEST_DISABLE,
- IDB_PNG_BTN_TEST_FOCUS)
- , m_btnTest2(IDB_PNG_BTN_TEST_DOWN,
- IDB_PNG_BTN_TEST_MOUSEOVER,
- IDB_PNG_BTN_TEST_NORMAL,
- IDB_PNG_BTN_TEST_DISABLE/*,IDB_PNG_BTN_TEST_FOCUS*/)
- , m_btnTest3(IDB_PNG_BTN_TEST_DOWN,
- IDB_PNG_BTN_TEST_MOUSEOVER,
- IDB_PNG_BTN_TEST_NORMAL,
- IDB_PNG_BTN_TEST_DISABLE/*,IDB_PNG_BTN_TEST_FOCUS*/)
- ////在OnInitDialog()函数中创建按钮
- //test
- m_btnTest1.Create(_T("test"),WS_VISIBLE | WS_CHILD/* |WS_DISABLED*/,CRect(10,10,58,58),this,emTestBtnId1);
- m_btnTest2.Create(_T("test"),WS_VISIBLE | WS_CHILD/* |WS_DISABLED*/,CRect(10,60,58,108),this,emTestBtnId2);
- m_btnTest3.Create(_T("test"),WS_VISIBLE | WS_CHILD |WS_DISABLED,CRect(10,110,58,158),this,emTestBtnId2);
效果图
MFC + CxImage 实现自绘半透明按钮的更多相关文章
- 【MFC】MFC中窗口重绘
MFC中窗口重绘 摘自:http://blog.csdn.net/shuilan0066/article/details/5859057 在刷新窗口时经常要调用重绘函数 MFC提供了三个函数用于窗口重 ...
- 用C++实现半透明按钮控件(PNG,GDI+)
使用MFC实现上面的按钮半透明效果能看到父窗口中的内容,上面是效果图(一个是带背景图片的.另一个是不带的). 控件继承自CWnd类(彩色的部分是窗口的背景图片.按钮是PNG图片,第二个图标是鼠 ...
- MFC动态创建对话框中的按钮控件并创建其响应消息
转自:http://www.cnblogs.com/huhu0013/p/4626686.html 动态按钮(多个)的创建: 1.在类中声明并定义按钮控件的ID #define IDC_D_BTN 1 ...
- 【MFC】 点击不同的按钮后在界面同一位置显示不同的对话框内容(转)
原文转自 http://bbs.csdn.net/topics/391039432 如图类似Tab控件的功能 但Tab控件按钮是固定的上下左右 不方便 所以想自己重新做个这种 我M ...
- MFC中窗口重绘
搬家于CSDN 2015-05-14 MFC提供了三个函数用于窗口重绘 InvalidateRect(&Rect) Invalidate() UpdateWindow() 当需要更新或者重绘窗 ...
- 如何在MFC界面开发中响应Button按钮的Down和Up事件
通过尝试有两种方案可以解决这个问题,第一种方案是通过PreTranslateMessage函数在调度消息之前对消息类型进行筛选,第二种方案是重载CButton类,在重载后的类CForTestButto ...
- VS2010 MFC对话框程序用CButtonST给按钮添加图标
也许是VS版本的关系,CButtonST中的BCMenu两个文件是无法编译通过的. 1.拷贝下载的CButtonST(我下载的v3.9)中的BtnST.h和BtnST.cpp文件到自己项目目录下. ...
- MFC 颜色选择对话框、颜色按钮
COLORREF color=RGB(0,255,0); unsigned char r=GetRValue(color); unsigned char g=GetGValue(color); uns ...
- C++实现半透明按钮控件(PNG,GDI+)
http://blog.csdn.net/witch_soya/article/details/6889904
随机推荐
- SQL中distinct的用法(转)
原文:http://www.cnblogs.com/rainman/archive/2013/05/03/3058451.html 在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出 ...
- 【转】Nginx+Tomcat搭建高性能负载均衡集群
最近对负载均衡比较感兴趣,研究了公司的负载均衡的配置,用的是阿里的SLB,相当于不用运维,只需要在后台进行简单的配置就能完成Tomcat的负载均衡,索性在网上找了几篇文章去尝试搭建一个集群,然而很多都 ...
- JavaSE学习总结第03天_Java基础语法2
03.01 数据类型中补充的几个小问题 1:在定义Long或者Float类型变量的时候,要加L或者f. 整数默认是int类型,浮点数默认是double. byte,short在定义的时候, ...
- 杭电ACM 汉字统计
汉字统计 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- python2.7_2.2_在套接字服务器上使用ForkingMixIn
Linux系统下才能用本程序.因为有Frok新的进程.... 代码如下: # -*- coding: utf-8 -*- import os import socket import threadin ...
- Linux内存分析
Linux命令----分析内存的瓶颈 为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cac ...
- Qt SQL Programming 部分翻译
简介: Qt SQL 是 Qt 的重要模块之一,为了方便,Qt 对 SQL 进行了一系列的封装,并将 SQL API 分为如下三层: (1)驱动层 (2)SQL API ...
- 用Xamarin 实现园友的 :Android浮动小球与开机自启动
原文:用Xamarin 实现园友的 :Android浮动小球与开机自启动 前两天看园子里有筒子写了个 Android浮动小球与开机自启动 , 感觉这种被 360 玩烂的功能原来是如此的简单啊... ...
- [WPF疑难]避免窗口最大化时遮盖任务栏
原文 [WPF疑难]避免窗口最大化时遮盖任务栏 [WPF疑难]避免窗口最大化时遮盖任务栏 周银辉 WPF窗口最大化时有个很不好的现象是:如果窗口的WindowStyle被直接或间接地设置为None后( ...
- veridata实验例(5)在更改主键列值,update操作将被分成两个语句
veridata实验例(5)更改主键列值,update操作将被分成两个语句 续接"veridata实验举例(4)验证veridata查找出updata.delete操作导致的不同步现象&qu ...