zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    void及void指针含义的深刻解析
    对个人站长职业前景的探讨之路在何方?
    Swift编程语言学习4.3—— 控制语句
    二分查找
    分布式文件系统
    常见浏览器兼容性问题与解决方式
    OutputDebugString()
    眼睛的颜色
    SVM-支持向量机算法概述
    Android学习笔记(四十):Preference的使用
  • 原文地址:https://www.cnblogs.com/kekec/p/1845645.html
Copyright © 2011-2022 走看看