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点、做好5条”!做到了,员工根本不用管
  2. ios-上拉电阻负载许多其他接口
  3. 近期知识图谱顶会论文推荐,另附超详笔记解读
  4. 前端学习(1254):Vue前后端交互方式
  5. 滚屏加载--无刷新动态加载数据技术的应用
  6. TreeView中右击直接获取节点的方法
  7. vue的v-model绑定对象属性时,更新不及时,不能修改
  8. cudaMemset的调用方式
  9. tensorflow 中的 array_ops
  10. MySQL新闻和新闻详情关联_新闻首页实现 -- 5. 新闻详情以及评论功能实现
  11. 模式识别的几种基本算法
  12. 200多个电脑修复工具问你要不要?
  13. PS教程淘宝美工平面设计入门自学课 photoshop软件零基础视频大全
  14. 黑客们很喜欢骇客交锋,虽然本片不被影评人认可
  15. 转:数据之美:迄今 10 佳数据可视化示例
  16. Android6.0风格图标,jQuery仿Android样式扁平风格图标插件
  17. 【Pytorch->ONNX->NCNN->NCNNfp16->vs编译】Windows NCNN部署
  18. Python3.6-Flask:制作一个语音对话问答机器人系统(网页版)
  19. 大数据导论答案_2020高校邦《数据科学与大数据技术导论》课后作业答案
  20. 《社会调查数据管理——基于Stata 14管理CGSS数据》一1.2 数据管理内容不清

热门文章

  1. 优秀的程序员都在关注「沉默王三」公众号
  2. pandoc下载 - 文档格式转换器
  3. 我一个高考英语94的渣渣是怎么通过四六级的(学习方法技巧)
  4. linux mmc驱动框架,Linux mmc framework2:基本组件之mmc
  5. linux系统有什么用
  6. 龙讯|LT9721高性能HDMI/MIPItoTypeC TO DP转换器
  7. 【JMeter】压测工具的使用
  8. 超级玛丽3通关指南+隐藏点整理
  9. 洛谷P5804 [SEERC2019]Absolute Game
  10. 产生大流行潜在病原体的研究为何如此