• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

游戏开发

vc6.0运用gdi+在内存中绘图并将其保管

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2019/1119/698.html

vc6.0运用gdi+在内存中绘图并将其保管为bmp,jpg,gif,png等格式的图片
 
一,添加gdi相关文件
 
      1,从网络上下载gdi头文件和库文件  http://www.codeguru.com/code/legacy/gdi/GDIPlus.zip
 
2,解压之后将将其中的Includes和Lib中的文件拷到vc目录下的Includes和Lib文件夹中;
 
3,将以下代码参加StdAfx.h头文件中:
 
#ifndef   ULONG_PTR
 
#define   ULONG_PTR   unsigned   long*
 
#include   "GdiPlus.h "
 
using   namespace   Gdiplus;
 
#pragma   comment(lib,   "gdiplus.lib ")
 
#endif
 
4,将gdiplus.dll考到debug和release目录下
 
二,在程序中加载库
 
   1,在C*APP头文件中添加两个变量
    GdiplusStartupInput m_gdiplusStartupInput;
    ULONG_PTR m_pGdiToken;
 
  2,在C*APP文件  的InitInstance函数中参加初始化GDI+的函数: 
GdiplusStartup(&m_pGdiToken,   &m_gdiplusStartupInput,   NULL); 
 
  3,在C*APP文件 中添加ExitInstance()虚函数
 
在ExitInstance()虚函数中添加
 
GdiplusShutdown(m_pGdiToken);
 
三运用GDI+          GDI+的运用很便当代码如下
 
CDC* pdc  =  GetDC();
 
                 CDC   MemDC;   //首先定义一个显现设备对象
 
  MemDC.CreateCompatibleDC(pdc);         
 
                  CBitmap   MemBitmap;//定义一个位图对象
 
                  MemBitmap.CreateCompatibleBitmap(pdc,nWidth,nHeight);
 
                
 
                  //将位图选入到内存显现设备中
 
                  //只要选入了位图的内存显现设备才有中央绘图,画到指定的位图上
 
                  CBitmap   *pOldBit=MemDC.SelectObject(&MemBitmap);
 
                 //先用常州软件技术培训背风光将位图肃清洁净,这里用的是白色作为背景               
 
                  MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));
 
        
 
                   CString filename;//名字  eg: xxx.jpg / xxx.bmp  。。。。。
 
                  这里用MemDC绘图//
 
                  MemDC.move(0,0);      MemDC.lineto(100,100);
 
                ......................................
 
                    USES_CONVERSION;      //将cstring转化为const wchar*
 
                   WCHAR* pBuf = T2W((LPCTSTR)filename);              
 
 
 
                   //这里就是将内存中的绘图转化成图片了
 
                          Bitmap bm((HBITMAP)MemBitmap, NULL);//定义bitmap
 
                          CLSID pngClsid; 
 
                          GetEncoderClsid(L"image/jpeg", &pngClsid); 
 
                         bm.Save(pBuf, &pngClsid, NULL);
 
                          MemDC.DeleteDC();
 
其中GetEncoderClsid(const WCHAR* format, CLSID* pClsid)代码如下
 
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
 UINT num= 0;
 UINT size= 0;
 
 ImageCodecInfo* pImageCodecInfo= NULL;
 
 GetImageEncodersSize(&num, &size);
 if(size== 0)
 {
  return -1;
 }
 pImageCodecInfo= (ImageCodecInfo*)(malloc(size));
 if(pImageCodecInfo== NULL)
 {
  return -1;
 }
 
 GetImageEncoders(num, size, pImageCodecInfo);
 
 for(UINT j=0; j< num; ++j)
 {
  if(wcscmp(pImageCodecInfo[j].MimeType, format)== 0)
  {
   *pClsid= pImageCodecInfo[j].Clsid;
   free(pImageCodecInfo);
   return j;
  }
 }
 
 free(pImageCodecInfo);
 return -1;
}
 
该函数运用办法很便当,如下面常州平台运营的代码就分别取得5中图像编码器的CLSID
 
CLSID encoderClsid
 
    GetEncoderClsid(L"image/png", &encoderClsid);    //png
 
    GetEncoderClsid(L"image/bmp", &encoderClsid);
 
    GetEncoderClsid(L"image/gif", &encoderClsid);
 
    GetEncoderClsid(L"image/jpeg", &encoderClsid);
 
    GetEncoderClsid(L"image/tiff", &encoderClsid);

上篇:上一篇:VS2013,Cocos2d-x v3.4.0与vld检测内存宣泄
下篇:下一篇:没有了