MFC的PNG图片按钮 | 火苗999℃的博客
pngbutton.h
#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图片按钮相关推荐

  1. MFC 图片按钮的实现

    1.CBitmapButton 方式实现 在MFC工具栏,添加按钮到界面,然后会修改按钮的属性,设置Owner draw为true; CBitmapButton只用于添加bmp位图,其他图片会有一些兼 ...

  2. 【MFC】可调整按钮位置的工具栏

    00. 目录 文章目录 00. 目录 01. 案例概述 02. 开发环境 03. 关键技术 04. 程序设计 05. 秘笈心法 06. 源码下载 07. 附录 01. 案例概述 本实例实现了工具栏上两 ...

  3. MFC显示Mat图片

    Opencv在1.0时代,在MFC框架上显示图片可以通过Cvvimage类里的DrawPicToHDC( IplImage *img, UINT ID)方法方便的显示出来,当然当时使用的还是IpIIm ...

  4. 用MFC制作一个图片浏览器

    使用基于对话框的MFC应用 一.准备部分 准备如下控件 一个图片控件(picture control),四个按钮,一个文本编辑框(属性设为只读) 为对话框类添加如下成员变量 二.选择图片按钮 在对话框 ...

  5. 自己写一个图片按钮(XAML)

    有时需要用三张图片(正常状态,鼠标移上,鼠标按下)来作为一个按钮的样式,虽然这种做法不好,应该用矢量的方式制作样式,但有的时候还是需要这样做的. 每次都修改按钮的样式来实现这个做法,既麻烦又会生成大段 ...

  6. 图片按钮ImageButton

    //按钮上放图片,图片按钮JButton enterButton = new JButton("");//由.png图片获得URL对象URL url = getClass().ge ...

  7. js layui跳转页面_layui自己添加图片按钮并点击跳转页面的例子

    1.按钮样式 2.定义按钮 layui.use('table', function(){ var table = layui.table; table.render({ elem: '#test' , ...

  8. 漂亮的自适应宽度的多色彩CSS图片按钮

    一.素材               二.效果 三.CSS *{padding:0;margin:0}/*----------------------------------- 自适应宽度图片按钮 - ...

  9. [安卓] 2、使用2中方法做按钮监听和图片按钮使用

      第一种方法是使用点击监听器来实现(代码中注释掉的部分):这种方法要在初始化的函数中将按钮绑定在点击监听器上(23,24)btn_ok.setOnClickListener(this);.然后处理统 ...

最新文章

  1. 年货买了没?大数据告诉你年货买什么!
  2. 大摩亚太区打造4万人团队 主攻区块链和大数据
  3. php while循环次数,php while循环得到循环次数
  4. PCM设备在电网系统中的应用介绍
  5. BP神经网络算法学习
  6. Mysql 里的约束
  7. oracle 修改子分区,Oracle子分区(sub partition)操作
  8. 外部PLC触发VisionMaster多流程运行PLC部分特殊说明
  9. 【信息论】信息论基础知识
  10. QCon上海2015精彩回顾和总结
  11. 怎么样才能防御dos攻击
  12. 阿里云服务器遭到攻击怎么办?
  13. linux字符驱动愚见
  14. 如何定义和使用一个 Lambda 表达式
  15. MySql只能用localhsot或者127.0.0.1连接
  16. 安卓进度条自动增加从1到100完整代码
  17. WWN,WWNN,WWPN区别
  18. python 日志框架_python pytest测试框架介绍五---日志实时输出
  19. C++ Primer Plus(第六版)第4章 编程练习答案详解
  20. anaconda启动 (base)环境问题

热门文章

  1. Android N App分屏模式完全解析
  2. 第二章 第六课 Scratch作品:摇摇晃晃的虫子(随机数和碰到边缘就反弹)
  3. ThingsBoard 二次开发之源码分析 5-如何接收 MQTT 连接
  4. 微信公众号与微信小程序相辅相成
  5. CSS line-height 三种赋值方式有何区别 (琐碎知识点整理)
  6. SVM-支持向量机理解(拉格朗日乘子法(Lagrange multiplier))
  7. 航天信息a3连接不上服务器,航天信息睿财A3使用说明
  8. QT5.6 安装 过程,实践经历……
  9. 列车信息系统Java+MySQL(没完全实现)
  10. easyExcel的复杂表头多级表头导入