MFC的PNG图片按钮
#pragma once
#include "afxwin.h"/
// 工程: YF_GCM -> ButtonDemo
// 作者: **
// 描述: 自绘制位图按钮
// 主要函数:
// SetButtonUpBitmapEx()设置鼠标放置在按钮上的图片
// SetButtonDownBitmapEx()设置按钮按下的图片
// SetButtonNormalBitmapEx()设置鼠标不在按钮是的图片
// 日期: 2013.12.16
// 版本: 1.0
// 修改:
/
// CBitmapButtonExclass CPngButton : public CBitmapButton
{DECLARE_DYNAMIC(CPngButton)public:CPngButton();virtual ~CPngButton();protected:DECLARE_MESSAGE_MAP()protected:virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);public:// 设置按钮抬起图片BOOL SetButtonUpBitmapEx(const CString& szFilePath);// 设置按钮按下图片BOOL SetButtonDownBitmapEx(const CString& szFilePath);// 普通按钮图片BOOL SetButtonNormalBitmapEx(const CString& szFilePath);
protected:virtual void PreSubclassWindow();
public:virtual BOOL PreTranslateMessage(MSG* pMsg);afx_msg void OnMouseMove(UINT nFlags, CPoint point);afx_msg void OnLButtonDown(UINT nFlags, CPoint point);afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
protected:BOOL m_lButtonDown;// 按钮有效区域
// CRgn m_btRgn;// 绘制按钮图片区域
// CRect m_rectDrawButton;
private:// 图片CImage m_imageButtonUp;CImage m_imageButtonDown;CImage m_imageBitmapNormal;CDC m_bkDc; // 记录背景bool m_first;
public:protected:BOOL m_bMouseOver;BOOL m_bTrack;
public:
};
pngbutton.cpp
/
// 工程: YF_GCM -> ButtonDemo
// 作者: **
// 描述: 自绘制位图按钮
// 主要函数:
// SetButtonUpBitmapEx()设置鼠标放置在按钮上的图片
// SetButtonDownBitmapEx()设置按钮按下的图片
// SetButtonNormalBitmapEx()设置鼠标不在按钮是的图片
// 日期: 2013.12.16
// 版本: 1.0
// 修改:
/ #include "stdafx.h"
#include "pngbutton.h"
#include "TransparentPNG.h"
// #include "LogToFile.h"// CBitmapButtonExIMPLEMENT_DYNAMIC(CPngButton, CBitmapButton)CPngButton::CPngButton(): CBitmapButton(), m_lButtonDown(FALSE), m_bMouseOver(FALSE), m_bTrack(FALSE), m_first(true)
{
}CPngButton::~CPngButton()
{if (NULL != m_imageButtonUp){::DeleteObject(m_imageButtonUp);}if (NULL != m_imageButtonDown){::DeleteObject(m_imageButtonDown);}if (NULL != m_imageBitmapNormal){::DeleteObject(m_imageButtonDown);}
}BEGIN_MESSAGE_MAP(CPngButton, CBitmapButton)ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()// CBitmapButtonEx 消息处理程序BOOL CPngButton::SetButtonUpBitmapEx(const CString& szFilePath)
{if (!m_imageButtonUp.IsNull()){m_imageButtonUp.Destroy();}m_imageButtonUp.Load(szFilePath);if (!m_imageButtonUp.IsNull()){CTransparentPNG tran;tran(&m_imageButtonUp);}return !m_imageButtonUp.IsNull();
}BOOL CPngButton::SetButtonNormalBitmapEx(const CString& szFilePath)
{if (!m_imageBitmapNormal.IsNull()){m_imageBitmapNormal.Destroy();}m_imageBitmapNormal.Load(szFilePath);if (!m_imageBitmapNormal.IsNull()){CTransparentPNG tran;tran(&m_imageBitmapNormal);}return !m_imageBitmapNormal.IsNull();
}// BOOL CPngButton::SetRedPointImage(const CString& szFilePath)
// {
// if (!m_imageRedPoint.IsNull())
// {
// m_imageRedPoint.Destroy();
// }
// m_imageRedPoint.Load(szFilePath);
// if (!m_imageRedPoint.IsNull())
// {
// CTransparentPNG tran;
// tran(&m_imageRedPoint);
// }
// return !m_imageRedPoint.IsNull();
// }
BOOL CPngButton::SetButtonDownBitmapEx(const CString& szFilePath)
{if (!m_imageButtonDown.IsNull()){m_imageButtonDown.Destroy();}m_imageButtonDown.Load(szFilePath);if (!m_imageButtonDown.IsNull()){CTransparentPNG tran;tran(&m_imageButtonDown);}return !m_imageButtonDown.IsNull();
}void CPngButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{// TODO: 添加您的代码以绘制指定项CRect rect = lpDrawItemStruct->rcItem;if (m_first){// 复制背景CDialog* pParent=(CDialog*)GetParent(); CPoint pt(0,0); MapWindowPoints(pParent,&pt,1); CDC * pdc = GetParent ()->GetDC ();m_bkDc.CreateCompatibleDC (pdc);CBitmap memBmp;memBmp.CreateCompatibleBitmap(pdc, rect.right, rect.bottom);m_bkDc.SelectObject(&memBmp);m_bkDc.BitBlt (0, 0, rect.right, rect.bottom, pdc, pt.x, pt.y, SRCCOPY);ReleaseDC (pdc);m_first = false;}
// CClientDC dc(this);
// dc.Rectangle (rect);// 背景CDC* thisdc = NULL;thisdc = GetDC();thisdc->BitBlt (0, 0, rect.right, rect.bottom, &m_bkDc, 0/*rect.right*/, 0/*rect.bottom*/, SRCCOPY);if (m_lButtonDown){if (m_imageButtonDown.IsNull()){
// CString szLog;
// szLog.Format(_T("m_imageButtonDown 未加载背景图片!"));
// AppLog(szLog);}else{m_imageButtonDown.Draw(thisdc->m_hDC, rect/*m_rectDrawButton*/);}}else{if (m_bMouseOver){if (m_imageButtonUp.IsNull()){
// CString szLog;
// szLog.Format(_T("m_imageButtonUp 未加载背景图片!"));
// AppLog(szLog);}else{m_imageButtonUp.Draw(thisdc->m_hDC, rect/*m_rectDrawButton*/);}}else{if (m_imageBitmapNormal.IsNull()){
// CString szLog;
// szLog.Format(_T("m_imageBitmapNormal 未加载背景图片!"));
// AppLog(szLog);}else{m_imageBitmapNormal.Draw(thisdc->m_hDC, rect/*m_rectDrawButton*/);}}}if (0 == this->ReleaseDC(thisdc)){
// CString szLog;
// szLog.Format(_T("ReleaseDC error!"));
// AppLog(szLog);}
}void CPngButton::PreSubclassWindow()
{// TODO: 在此添加专用代码和/或调用基类ModifyStyle(0, WS_CLIPCHILDREN | BS_OWNERDRAW ); //设置按钮的有效区域 // CRect rect;
// GetClientRect(&rect);
// CDialog* pParent=(CDialog*)GetParent();
// CPoint pt(rect.left, rect.top);
// MapWindowPoints(pParent, &pt, 1);
// CDC * pdc = GetParent ()->GetDC ();
// // 复制背景
// m_bkDc.CreateCompatibleDC (pdc);
// CBitmap memBmp;
// memBmp.CreateCompatibleBitmap(pdc, rect.right, rect.bottom);
// m_bkDc.SelectObject(&memBmp);
// m_bkDc.BitBlt (0, 0, rect.right, rect.bottom, pdc, 0, 0, SRCCOPY);
// ReleaseDC (pdc); // m_btRgn.CreateRectRgnIndirect (rc);
// SetWindowRgn(m_btRgn, TRUE); CBitmapButton::PreSubclassWindow();
}void CPngButton::OnLButtonDown(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值m_lButtonDown = TRUE;CBitmapButton::OnLButtonDown(nFlags, point);
}void CPngButton::OnLButtonUp(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值m_lButtonDown = FALSE;CBitmapButton::OnLButtonUp(nFlags, point);
}BOOL CPngButton::PreTranslateMessage(MSG* pMsg)
{// TODO: 在此添加专用代码和/或调用基类if(pMsg->message==WM_MOUSELEAVE) {m_bTrack=FALSE;m_bMouseOver = FALSE;InvalidateRect(NULL);}else if (pMsg->message==WM_MOUSEHOVER){m_bMouseOver = TRUE;InvalidateRect(NULL);}return CBitmapButton::PreTranslateMessage(pMsg);
}void CPngButton::OnMouseMove(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值if(!m_bTrack){TRACKMOUSEEVENT tme;tme.cbSize=sizeof(TRACKMOUSEEVENT);tme.dwFlags=TME_HOVER | TME_LEAVE;tme.dwHoverTime=HOVER_DEFAULT;tme.hwndTrack=m_hWnd;m_bTrack=_TrackMouseEvent(&tme);}CBitmapButton::OnMouseMove(nFlags, point);
}
CTransparentPNG 地址
点击打开链接https://gitee.com/user.zt/codes/rni2jtabfxcykzu7lvo3067
因gitee.com代码段公共访问功能关闭导致上述链接失效,现将代码贴出。
CTransparentPNG
/
// 工程:
// 作者:
// 描述: 处理png图片,使背景变白
// 主要函数:
// 日期: 2014.11.28
// 版本: 1.0
// 修改:
/
#pragma once
class CTransparentPNG
{public:CTransparentPNG() {}~CTransparentPNG() {}bool operator()(CImage* image) {if (!image)return false;if (image->GetBPP() != 32)return false;for (int i = 0; i < image->GetWidth(); ++i){for (int j = 0; j < image->GetHeight(); ++j){unsigned char* pucColor = reinterpret_cast<unsigned char*>(image->GetPixelAddress(i, j));pucColor[0] = pucColor[0] * pucColor[3] / 255;pucColor[1] = pucColor[1] * pucColor[3] / 255;pucColor[2] = pucColor[2] * pucColor[3] / 255;}}return true;}static bool TransPng(CImage* image){if (!image)return false;if (image->GetBPP() != 32)return false;for (int i = 0; i < image->GetWidth(); ++i){for (int j = 0; j < image->GetHeight(); ++j){unsigned char* pucColor = reinterpret_cast<unsigned char*>(image->GetPixelAddress(i, j));pucColor[0] = pucColor[0] * pucColor[3] / 255;pucColor[1] = pucColor[1] * pucColor[3] / 255;pucColor[2] = pucColor[2] * pucColor[3] / 255;}}return true;}};
MFC的PNG图片按钮相关推荐
- MFC 图片按钮的实现
1.CBitmapButton 方式实现 在MFC工具栏,添加按钮到界面,然后会修改按钮的属性,设置Owner draw为true; CBitmapButton只用于添加bmp位图,其他图片会有一些兼 ...
- 【MFC】可调整按钮位置的工具栏
00. 目录 文章目录 00. 目录 01. 案例概述 02. 开发环境 03. 关键技术 04. 程序设计 05. 秘笈心法 06. 源码下载 07. 附录 01. 案例概述 本实例实现了工具栏上两 ...
- MFC显示Mat图片
Opencv在1.0时代,在MFC框架上显示图片可以通过Cvvimage类里的DrawPicToHDC( IplImage *img, UINT ID)方法方便的显示出来,当然当时使用的还是IpIIm ...
- 用MFC制作一个图片浏览器
使用基于对话框的MFC应用 一.准备部分 准备如下控件 一个图片控件(picture control),四个按钮,一个文本编辑框(属性设为只读) 为对话框类添加如下成员变量 二.选择图片按钮 在对话框 ...
- 自己写一个图片按钮(XAML)
有时需要用三张图片(正常状态,鼠标移上,鼠标按下)来作为一个按钮的样式,虽然这种做法不好,应该用矢量的方式制作样式,但有的时候还是需要这样做的. 每次都修改按钮的样式来实现这个做法,既麻烦又会生成大段 ...
- 图片按钮ImageButton
//按钮上放图片,图片按钮JButton enterButton = new JButton("");//由.png图片获得URL对象URL url = getClass().ge ...
- js layui跳转页面_layui自己添加图片按钮并点击跳转页面的例子
1.按钮样式 2.定义按钮 layui.use('table', function(){ var table = layui.table; table.render({ elem: '#test' , ...
- 漂亮的自适应宽度的多色彩CSS图片按钮
一.素材 二.效果 三.CSS *{padding:0;margin:0}/*----------------------------------- 自适应宽度图片按钮 - ...
- [安卓] 2、使用2中方法做按钮监听和图片按钮使用
第一种方法是使用点击监听器来实现(代码中注释掉的部分):这种方法要在初始化的函数中将按钮绑定在点击监听器上(23,24)btn_ok.setOnClickListener(this);.然后处理统 ...
最新文章
- 年货买了没?大数据告诉你年货买什么!
- 大摩亚太区打造4万人团队 主攻区块链和大数据
- php while循环次数,php while循环得到循环次数
- PCM设备在电网系统中的应用介绍
- BP神经网络算法学习
- Mysql 里的约束
- oracle 修改子分区,Oracle子分区(sub partition)操作
- 外部PLC触发VisionMaster多流程运行PLC部分特殊说明
- 【信息论】信息论基础知识
- QCon上海2015精彩回顾和总结
- 怎么样才能防御dos攻击
- 阿里云服务器遭到攻击怎么办?
- linux字符驱动愚见
- 如何定义和使用一个 Lambda 表达式
- MySql只能用localhsot或者127.0.0.1连接
- 安卓进度条自动增加从1到100完整代码
- WWN,WWNN,WWPN区别
- python 日志框架_python pytest测试框架介绍五---日志实时输出
- C++ Primer Plus(第六版)第4章 编程练习答案详解
- anaconda启动 (base)环境问题
热门文章
- Android N App分屏模式完全解析
- 第二章 第六课 Scratch作品:摇摇晃晃的虫子(随机数和碰到边缘就反弹)
- ThingsBoard 二次开发之源码分析 5-如何接收 MQTT 连接
- 微信公众号与微信小程序相辅相成
- CSS line-height 三种赋值方式有何区别 (琐碎知识点整理)
- SVM-支持向量机理解(拉格朗日乘子法(Lagrange multiplier))
- 航天信息a3连接不上服务器,航天信息睿财A3使用说明
- QT5.6 安装 过程,实践经历……
- 列车信息系统Java+MySQL(没完全实现)
- easyExcel的复杂表头多级表头导入