说明:开发中难免会用到GDI和GDI+,用的时候都是到处找代码看资料,即使以前做过隔断时间又忘记了,干脆总结下以后也方便。
一、GDI+在程序中的引用
1、stdafx.h
// 引用GDI+
#include <GdiPlus.h>
using namespace Gdiplus;
//该函数用来加载资源中的各种格式的图片(我写到这里也可以放到自己的类中)
BOOL ImageFromIDResource(UINT nID, LPCTSTR sTR, Image * & pImg);
1.1.staafx.cpp
/************************************************************************\
* 函数说明:加载指定格式的图片
* 参数说明 nID:资源ID, sTr:图片格式 pImg:Imag变量
* 返 回 值:成功(TRUE)与失败(TRUE)
* 注意事项:无
* 编辑日期:2014-08-29
* 作 者:XQ
\************************************************************************/
BOOL ImageFromIDResource( UINT nID, LPCTSTR sTR, Image * & pImg )
{
HINSTANCE hInst = AfxGetResourceHandle();
HRSRC hRsrc = ::FindResource (hInst,MAKEINTRESOURCE(nID),sTR); // type
if (!hRsrc)
{
AfxMessageBox(_T("加载资源ID错误"));
return FALSE;
}
// load resource into memory
DWORD len = SizeofResource(hInst, hRsrc);
BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);
if (!lpRsrc)
{
AfxMessageBox(_T("加载资源错误"));
return FALSE;
}
// Allocate global memory on which to create stream
HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);
BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
memcpy(pmem,lpRsrc,len);
IStream* pstm;
CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);
// load from stream
pImg=Gdiplus::Image::FromStream(pstm);
// free/release stuff
GlobalUnlock(m_hMem);
pstm->Release();
FreeResource(lpRsrc);
return TRUE;
}
2.初始化GDI+内部变量
//一般放到程序APP头文件中(我这里封装的DLL,放到了我的窗口作为类成员变量)
ULONG_PTR m_gdiplusToken;
//这两个一般也是放到程序APP的InitInstance()里面
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
//这个一般就放在程序APP的ExitInstance()函数里面
Gdiplus::GdiplusShutdown(m_gdiplusToken);
二、使用
1、加载资源
// 首先我在类中声明一个Image指针变量
Image *m_LogoImg;
// 构造函数中初始化变量
m_LogoImg = NULL;
//OnInitDialog()中加载图片
BOOL bRe = ImageFromIDResource(IDB_PNG_LOGO, _T("PNG"), m_LogoImg);
if (!bRe)
{
AfxMessageBox(_T("加载图像失败!"));
}
2.显示图片
2.1在OnPaint()中显示(这个看情况)
// GDI+ logo
HDC hdc = GetDC()->m_hDC;
Graphics graphics(hdc);
graphics.DrawImage(m_LogoImg, 0, 5, 110, 30);
3.释放Image变量
if(m_LogoImg != NULL)
{
delete m_LogoImg;
m_LogoImg = NULL;
}
//给段GDI双缓冲的
CRect rect;
GetClientRect(&rect);
// Title
CDC dcMemTitle ;
dcMemTitle.CreateCompatibleDC(&dc);
CBitmap bmpBackgroundTitle;
bmpBackgroundTitle.LoadBitmap(IDB_TITLE);
BITMAP bitmapTitle;
bmpBackgroundTitle.GetBitmap(&bitmapTitle);
CBitmap *pbmpOldTitle=dcMemTitle.SelectObject(&bmpBackgroundTitle);
dc.StretchBlt(0, 0, rect.Width(), 40, &dcMemTitle, 0, 0, bitmapTitle.bmWidth, bitmapTitle.bmHeight, SRCCOPY);