MFC利用GdipButton实现png按钮,并在此基础上实现图片适应按钮尺寸的缩放
2016-02-05 17:38
447 查看
不得不说,codeproject是个好东西,昨天就一直在查这个png按钮怎么用,很多人都在说这个老外写的GdipButton,可惜家里的网登不上,老外的网站下不了。后来又找了个pngbutton,发现不能适应我按钮的大小,就又费劲找到了老外的代码和demo。右键下载——what a nice day,竟然不用注册直接就可以另存为,帅呆了!!!!
然而,并没有那么简单,我先随便搞了一个界面,仿照里面的代码进行设置,初始化什么的- -然而报错,一堆CDC MEMDC重定义之类的问题,想起之前搞gridctrl的时候似曾相识,应该是代码中的类和系统的类重复了,就把代码中MemDC.h文件中的CMemDC全部改成了GCMemDC,当然,Gdipbutton里面的引用也改了,果然成功运行。
然而,这个还是不能实现图片的自适应,只好上手对代码进行修改
核心代码是这样的
从代码开头一句一句开始研究,开头第一句,就是把m_pStdImage之前已经load好的图片画出来,追踪m_pStdImage之前的load,与按钮尺寸无关,写代码得到m_pStdImage的宽高是图片原来的高,故m_pStdImage应该是原图片未做任何手脚。将这个原图片写入DC PDC,然后bitblt入m_dcstd
咦bitblt是只能复制不能缩放的,就改为strechblt试试!!设置好尺寸(源代码删了),果然可以。但是!!!他妈的不知道为啥边上有黑条~!!!!
开始以为是背景刷子的问题,后来以为是尺寸没弄好的问题,设断点追踪rect,仍不得解。
苦思冥想瞎调了一会儿,视线转到在他前面创建的drawimage命令,百度了一下,擦咧可以直接缩放~!!第一句改为
搞定!哇咔咔,开心。
成功测试PNG button条件:
编程环境VS2010
GdipButton.h
GdipButton.cpp
CGdiPlusBitmap.h
MemDC.h
stdafx.h文件添加
#include <gdiplus.h>
#pragma comment(lib, "gdiplus.lib")
using namespace Gdiplus;
Cxx.h中(注意不是CxxDlg.h)
public:
ULONG_PTR m_gdiplusToken;
Cxx.cpp中(注意不是CxxDlg.cpp)
BOOL CTestGdipButtonApp::InitInstance()
{
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
//省略
}
int CTestGdipButtonApp::ExitInstance()
{
Gdiplus::GdiplusShutdown(m_gdiplusToken);
return CWinApp::ExitInstance();
}
给任意一个button添加变量比如m_ButCtl,之后将变量类型改为CGdipButton
在任意位置写
m_ButCtl.LoadStdImage(IDR_PLAY, _T("PNG"));
(其中IDR_PLAY是导入的png资源名字)
附上我改为缩放的源代码
http://download.csdn.net/detail/skyfirelock/9428300
然而,并没有那么简单,我先随便搞了一个界面,仿照里面的代码进行设置,初始化什么的- -然而报错,一堆CDC MEMDC重定义之类的问题,想起之前搞gridctrl的时候似曾相识,应该是代码中的类和系统的类重复了,就把代码中MemDC.h文件中的CMemDC全部改成了GCMemDC,当然,Gdipbutton里面的引用也改了,果然成功运行。
然而,这个还是不能实现图片的自适应,只好上手对代码进行修改
核心代码是这样的
PaintBk(pDC); graphics.DrawImage(*m_pStdImage, 0, 0); m_dcStd.CreateCompatibleDC(pDC); bmp.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()); pOldBitmap = m_dcStd.SelectObject(&bmp); m_dcStd.BitBlt(0, 0, rect.Width(), rect.Height(), pDC, 0, 0, SRCCOPY); bmp.DeleteObject();
从代码开头一句一句开始研究,开头第一句,就是把m_pStdImage之前已经load好的图片画出来,追踪m_pStdImage之前的load,与按钮尺寸无关,写代码得到m_pStdImage的宽高是图片原来的高,故m_pStdImage应该是原图片未做任何手脚。将这个原图片写入DC PDC,然后bitblt入m_dcstd
咦bitblt是只能复制不能缩放的,就改为strechblt试试!!设置好尺寸(源代码删了),果然可以。但是!!!他妈的不知道为啥边上有黑条~!!!!
开始以为是背景刷子的问题,后来以为是尺寸没弄好的问题,设断点追踪rect,仍不得解。
苦思冥想瞎调了一会儿,视线转到在他前面创建的drawimage命令,百度了一下,擦咧可以直接缩放~!!第一句改为
PaintBk(pDC); graphics.DrawImage(*m_pStdImage, 0, 0, rect.Width(), rect.Height()); //缩放 //graphics.DrawImage(*m_pStdImage, 0, 0); m_dcStd.CreateCompatibleDC(pDC); bmp.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()); pOldBitmap = m_dcStd.SelectObject(&bmp); m_dcStd.BitBlt(0, 0, rect.Width(), rect.Height(), pDC, 0, 0, SRCCOPY); bmp.DeleteObject();
搞定!哇咔咔,开心。
成功测试PNG button条件:
编程环境VS2010
GdipButton.h
GdipButton.cpp
CGdiPlusBitmap.h
MemDC.h
stdafx.h文件添加
#include <gdiplus.h>
#pragma comment(lib, "gdiplus.lib")
using namespace Gdiplus;
Cxx.h中(注意不是CxxDlg.h)
public:
ULONG_PTR m_gdiplusToken;
Cxx.cpp中(注意不是CxxDlg.cpp)
BOOL CTestGdipButtonApp::InitInstance()
{
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
//省略
}
int CTestGdipButtonApp::ExitInstance()
{
Gdiplus::GdiplusShutdown(m_gdiplusToken);
return CWinApp::ExitInstance();
}
给任意一个button添加变量比如m_ButCtl,之后将变量类型改为CGdipButton
在任意位置写
m_ButCtl.LoadStdImage(IDR_PLAY, _T("PNG"));
(其中IDR_PLAY是导入的png资源名字)
附上我改为缩放的源代码
http://download.csdn.net/detail/skyfirelock/9428300
相关文章推荐
- C语言scanf容易引发的bug
- WORDPRESS第十三课WORDPRESS源码解读(1)
- mac下使用MyBatis增删改查(mysql,Java)
- 【半平面交】[ZJOI2008][HYSBZ\BZOJ1038]瞭望塔
- MySQL常用的三种备份方法
- cocoapods安装及应用
- codeforces 614 C Peter and Snow Blower
- 学习笔记------数据结构(C语言版)队列链式存储
- 丢失PID的原因
- WORDPRESS教程之WORDPRESS第十二课WP-SETTING.PHP文件详解
- BlockCanary
- phpstorm 配置 babel 支持EcmaScript6
- 关于偏序问题的一些总结
- 51Nod 1049 最大子段和(分治/dp)
- PAT1006.换个格式输出
- 滑雪(百练1088) (dp+dfs)
- WORDPRESS第十一课WORDPRESS源代码研究-插件机制
- 游戏实现多语言版本(国际化)
- WORDPRESS第十课WORDPRESS源代码研究-侧边栏的实现
- 计算字符串相似度算法——Levenshtein