可可西

GDI+编程入门(C++)

使用C++进行GDI+编程,首先要看系统中是否已经安装好了GDI+,目前大部分XP(SP3)中已安装好了GDI+

【在system32中包含Gdiplus.dll文件】。

开发环境为:Windows XP(SP3)+ VS2008

 

(1)使用GdiPlus

       a.包含头文件 #include <Gdiplus.h>

                         using namespace Gdiplus;

       b.链接导入库 #pragma comment(lib, "Gdiplus.lib")

       c.初始化      Gdiplus::GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL);

                        Gdiplus::GdiplusStartupInput m_gdiplusStartupInput;

                        ULONG_PTR m_pGdiToken;

                       /* 该句代码一般放在主窗体的构造函数中。*/

       d.卸载         Gdiplus::GdiplusShutdown(m_pGdiToken);

                       /* 该句代码一般放在主窗体的析构函数中。*/

 

(2)读取png资源到image指针对象

1 Gdiplus::Image* CSupriseDlg::ImageFromIDResource(UINT resID, LPCTSTR resType)
2 {
3 HINSTANCE hInst = AfxGetResourceHandle();
4 HRSRC hRsrc = ::FindResource (hInst,MAKEINTRESOURCE(resID),resType);
5 if (!hRsrc)
6 return NULL;
7 // load resource into memory
8   DWORD len = SizeofResource(hInst, hRsrc);
9 BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);
10 if (!lpRsrc)
11 return NULL;
12 // Allocate global memory on which to create stream
13   HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);
14 BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
15 memcpy(pmem,lpRsrc,len);
16 IStream* pstm;
17 CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);
18 // load from stream
19   Gdiplus::Image* ima=Gdiplus::Image::FromStream(pstm, TRUE);
20 // free/release stuff
21   GlobalUnlock(m_hMem);
22 pstm->Release();
23 FreeResource(lpRsrc);
24
25 return ima;
26 }

 

// 调用该函数获取Image指针对象

1 // IDB_PNG2为资源ID "PNG"为资源类型
2  Gdiplus::Image* ima = ImageFromIDResource(IDB_PNG2,_T("PNG"));

 

(3)使用Graphics::DrawImage(Image*,INT,INT,INT,INT)

       而不使用Graphics::DrawImage(Image*,INT,INT)

       绘制PNG图片

 

      原因是:图片的DPI可能和屏幕的DPI不一致。

                 一般png是96DPI  而屏幕设备是76DPI

 

      Graphics::DrawImage(Image*,INT,INT,INT,INT)

      参数1: 绘制的目标图片

      参数2: 图片左上角相对绘制窗体上的x坐标

      参数3: 图片左上角相对绘制窗体上的y坐标

      参数4: 图片宽度

      参数5: 图片长度

 

     Graphics::DrawImage(Image*,INT,INT)

      参数1: 绘制的目标图片

      参数2: 图片左上角相对绘制窗体上的x坐标

      参数3: 图片左上角相对绘制窗体上的y坐标

 

     如下图所示:

     使用Graphics::DrawImage(Image*,INT,INT,INT,INT) 绘制png图片【与其他图片查看软件效果一致

     m_graphics->DrawImage(ima, 0, 0,picWidth,picHeight);

     

 

     使用Graphics::DrawImage(Image*,INT,INT) 绘制png图片【显得大一些

     m_graphics->DrawImage(ima, 0, 0);

(4)防止闪烁

 

1 BOOL CGdiTestDlg::OnEraseBkgnd(CDC* pDC)
2 {
3 // TODO: Add your message handler code here and/or call default
4
5 //return CDialog::OnEraseBkgnd(pDC);
6   return TRUE;
7 }

posted on 2010-10-08 11:15  可可西  阅读(16343)  评论(0编辑  收藏  举报

导航