• 1359阅读
  • 3回复

GDI+使用小记 [复制链接]

上一主题 下一主题
离线啊冲
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2016-02-16


1.初始化:

[html] view plain copy

  1. #include <GdiPlus.h>  
  2. using namespace Gdiplus;  
  3. #pragma comment(lib,"gdiplus.lib")  



[cpp] view plain copy

  1. GdiplusStartupInput gdiplusStartupInput;  
  2. GdiplusStartup(&Gdi_token, &gdiplusStartupInput, NULL) ;  



[cpp] view plain copy

  1. GdiplusShutdown(Gdi_token);  


2.使用:
先贴几个简单的例子:

绝对路径:


[cpp] view plain copy

  1.    Image image(TEXT("D:\\Program Files\\vs2005_Project\\test\\test\\res\\未标题-1.png"));  
  2. CPaintDC dc(this);  
  3. Graphics g(dc) ;  
  4. g.DrawImage(&image,0,0,image.GetWidth(),image.GetHeight());  


不要写Image img;这样会报错:error C2248: “Gdiplus::Image::Image”: 无法访问 protected 成员(在“Gdiplus::Image”类中声明)

相对路径:
  


[cpp] view plain copy

  1. BOOL LoadResImage(int nResID,Image * &lpImage,LPCTSTR lpType = TEXT("PNG"));  
  2. BOOL LoadResImage(int nResID,Image * &lpImage, LPCTSTR lpType)  
  3. {  
  4.     HINSTANCE hIns=AfxGetInstanceHandle();  
  5.     HRSRC hRsrc = ::FindResource (hIns,MAKEINTRESOURCE(nResID),lpType); // type   
  6.     if (!hRsrc)  
  7.         return FALSE;  
  8.     // load resource into memory   
  9.     DWORD len = SizeofResource(hIns, hRsrc);  
  10.     BYTE* lpRsrc = (BYTE*)LoadResource(hIns, hRsrc);  
  11.     if (!lpRsrc)  
  12.         return FALSE;  
  13.     // Allocate global memory on which to create stream   
  14.     HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);  
  15.     //HGLOBAL m_hMem = GlobalAlloc(GHND, len);   
  16. //=======================================================  
  17. //GMEM_FIXED:分配固定的内存  
  18. //GMEM_MOVEABLE:分配可移动的内存,不能与 GMEM_FIXED 组合使用  
  19. //GMEM_ZEROINIT:将所申请内存初始化为0.  
  20. //=======================================================  
  21.     BYTE* pmem = (BYTE*)GlobalLock(m_hMem);  
  22.     memcpy(pmem,lpRsrc,len);  
  23.     IStream* pstm;  
  24.     HRESULT ht =  CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);  
  25.     if (ht != S_OK)  
  26.     {  
  27.         GlobalFree(m_hMem);  
  28.         return FALSE ;  
  29.     }  
  30.     // load from stream   
  31.     lpImage=Gdiplus::Image::FromStream(pstm);  
  32.     // free/release stuff   
  33.     GlobalUnlock(m_hMem);  
  34.     pstm->Release();  
  35.     FreeResource(lpRsrc);  
  36.          GlobalFree(m_hMem);return TRUE ;  
  37. }  


调用:

[cpp] view plain copy

  1. Image *pimage;  
  2.             //BOOL result  = LoadResImage(IDR_JPG1,pimage,TEXT("JPG")) ;  
  3.             BOOL result  = LoadResImage(IDB_PNG1,pimage,TEXT("PNG")) ;  
  4.             if (result)  
  5.             {  
  6.                 CPaintDC dc(this);  
  7.                 Graphics g(dc) ;  
  8.                 g.DrawImage(pimage,0,0,pimage->GetWidth(),pimage->GetHeight());  
  9.             }  


小知识:要用PS创建背景透明的PNG,直接把背景删了,保存。同样,上面例子画出来的PNG透明部分会把底色透出来




3.判断Image对象的类型:
简单说明例子:


[cpp] view plain copy

  1.                      GUID formatID;  
  2. pimage->GetRawFormat(&formatID);  
  3. int m_nImgFormat;  
  4. enum IMGFORMAT { if_bmp, if_jpg, if_png, if_gif, if_tiff, if_error };  
  5. if (formatID == Gdiplus::ImageFormatBMP)  
  6. {  
  7.     m_nImgFormat = if_bmp;  
  8. }  
  9. if (formatID == Gdiplus::ImageFormatJPEG)  
  10. {  
  11.     m_nImgFormat = if_jpg;  
  12. }  
  13. if (formatID == Gdiplus::ImageFormatPNG)  
  14. {  
  15.     m_nImgFormat = if_png;  
  16. }  
  17. if (formatID == Gdiplus::ImageFormatGIF)  
  18. {  
  19.     m_nImgFormat = if_gif;  
  20. }  
  21. if (formatID == Gdiplus::ImageFormatTIFF)  
  22. {  
  23.     m_nImgFormat = if_tiff;  
  24. }  


善者 慈悲心常在 无怨无恨 以苦为乐
默认压缩密码www.hifyl.com
文件分享密码问题:http://www.hifyl.com/read-htm-tid-4444.html
离线im86165507

只看该作者 沙发  发表于: 2016-02-16
离线v2680267313

只看该作者 板凳  发表于: 2016-04-30
用户被禁言,该主题自动屏蔽!
离线浅若清风

只看该作者 地板  发表于: 2016-05-22
用户被禁言,该主题自动屏蔽!
快速回复
限100 字节
如果您在写长篇帖子又不马上发表,建议存为草稿
 
上一个 下一个