不得不说,codeproject是个好东西,昨天就一直在查这个png按钮怎么用,很多人都在说这个老外写的GdipButton,可惜家里的网登不上,老外的网站下不了。后来又找了个pngbutton,发现不能适应我按钮的大小,就又费劲找到了老外的代码和demo。右键下载——what a nice day,竟然不用注册直接就可以另存为,帅呆了!!!!
然而,并没有那么简单,我先随便搞了一个界面,仿照里面的代码进行设置,初始化什么的- -然而报错,一堆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