您的位置:首页 > 其它

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里面的引用也改了,果然成功运行。

然而,这个还是不能实现图片的自适应,只好上手对代码进行修改

核心代码是这样的

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: