总结GDI+使用方法

说明:开发中难免会用到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);

你可能感兴趣的:(图片,GDI+,gdi)