Gdiplus的使用

Posted 香瓣依生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gdiplus的使用相关的知识,希望对你有一定的参考价值。

使用步骤:

1.包括相应的头文件及引入相应的lib

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

 

2.初始化Gdiplus

1 Gdiplus::GdiplusStartupInput m_gdiplusStartupInput; 
2 ULONG_PTR m_gdiplusToken;   
3 
4 GdiplusStartup( &m_gdiplusToken, &m_gdiplusStartupInput, NULL ); 

 

3.加载相应的资源(此处为图片)

 1 Image* m_pImage;  //图片对象
 2 m_pImage=Image::FromFile(_T("Test03.jpg"));
 3 
 4 //错误判断
 5 if ((m_pImage==NULL)||(m_pImage->GetLastStatus()!=Ok))
 6 {
 7     if ( m_pImage )
 8     {
 9         delete m_pImage;
10         m_pImage = NULL;
11     }
12     return FALSE;
13 }

 

4.绘制图片

1 Graphics graphics( GetDC()->GetSafeHdc() );
2 graphics.DrawImage(m_pImage, 0,0,m_pImage->GetWidth(),m_pImage->GetWidth());

 

5.关闭Gdiplus

1 GdiplusShutdown( m_gdiplusToken ); 

 

 

完整示例: 

  1 // GdiplusTestDlg.cpp : 实现文件
  2 //
  3 
  4 #include "stdafx.h"
  5 #include "GdiplusTest.h"
  6 #include "GdiplusTestDlg.h"
  7 #include "afxdialogex.h"
  8 #include <GdiPlus.h> 
  9 
 10 #ifdef _DEBUG
 11 #define new DEBUG_NEW
 12 #endif
 13 
 14 #pragma comment(lib, "gdiplus.lib") 
 15 
 16 using namespace Gdiplus;
 17 
 18 
 19 //变量声明 
 20 Gdiplus::GdiplusStartupInput m_gdiplusStartupInput; 
 21 ULONG_PTR m_gdiplusToken; 
 22 Image* m_pImage;  //图片对象
 23 
 24 // CGdiplusTestDlg 对话框
 25 
 26 
 27 CGdiplusTestDlg::CGdiplusTestDlg(CWnd* pParent /*=NULL*/)
 28     : CDialogEx(CGdiplusTestDlg::IDD, pParent)
 29 {
 30     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
 31 }
 32 
 33 void CGdiplusTestDlg::DoDataExchange(CDataExchange* pDX)
 34 {
 35     CDialogEx::DoDataExchange(pDX);
 36 }
 37 
 38 BEGIN_MESSAGE_MAP(CGdiplusTestDlg, CDialogEx)
 39     ON_WM_PAINT()
 40     ON_WM_QUERYDRAGICON()
 41     ON_WM_DESTROY()
 42 END_MESSAGE_MAP()
 43 
 44 
 45 // CGdiplusTestDlg 消息处理程序
 46 
 47 BOOL CGdiplusTestDlg::OnInitDialog()
 48 {
 49     CDialogEx::OnInitDialog();
 50 
 51     // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
 52     //  执行此操作
 53     SetIcon(m_hIcon, TRUE);         // 设置大图标
 54     SetIcon(m_hIcon, FALSE);        // 设置小图标
 55 
 56     // TODO: 在此添加额外的初始化代码
 57         //初始化GDI+
 58     GdiplusStartup( &m_gdiplusToken, &m_gdiplusStartupInput, NULL );
 59 
 60         //加载文件
 61     m_pImage=Image::FromFile(_T("E:\\\\Workspace\\\\Resource\\\\Chrysanthemum.jpg")); 
 62 
 63         //错误判断 
 64     if ((m_pImage==NULL)||(m_pImage->GetLastStatus()!=Ok))   
 65     { 
 66         if ( m_pImage ) 
 67         { 
 68             delete m_pImage; 
 69             m_pImage = NULL; 
 70         } 
 71         return FALSE; 
 72     }
 73 
 74     MoveWindow( 0, 0, 1024, 768 ); 
 75 
 76     //设置按钮位置 
 77     CWnd* pBtn = GetDlgItem( IDOK ); 
 78     if ( pBtn ) 
 79     { 
 80         pBtn->MoveWindow( 1024-160, 700, 60, 30 ); 
 81     } 
 82     pBtn = GetDlgItem( IDCANCEL ); 
 83     if( pBtn ) 
 84     { 
 85         pBtn->MoveWindow( 1024-80, 700, 60, 30 ); 
 86     } 
 87     CenterWindow(); 
 88 
 89     return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
 90 }
 91 
 92 // 如果向对话框添加最小化按钮,则需要下面的代码
 93 //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
 94 //  这将由框架自动完成。
 95 
 96 void CGdiplusTestDlg::OnPaint()
 97 {
 98     if (IsIconic())
 99     {
100         CPaintDC dc(this); // 用于绘制的设备上下文
101 
102         SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
103 
104         // 使图标在工作区矩形中居中
105         int cxIcon = GetSystemMetrics(SM_CXICON);
106         int cyIcon = GetSystemMetrics(SM_CYICON);
107         CRect rect;
108         GetClientRect(&rect);
109         int x = (rect.Width() - cxIcon + 1) / 2;
110         int y = (rect.Height() - cyIcon + 1) / 2;
111 
112         // 绘制图标
113         dc.DrawIcon(x, y, m_hIcon);
114     }
115     else
116     {
117         CDialogEx::OnPaint();
118     }
119 
120     Graphics graphics( GetDC()->GetSafeHdc() );   
121     graphics.DrawImage(m_pImage, 0,0,m_pImage->GetWidth(),m_pImage->GetWidth()); 
122 }
123 
124 //当用户拖动最小化窗口时系统调用此函数取得光标
125 //显示。
126 HCURSOR CGdiplusTestDlg::OnQueryDragIcon()
127 {
128     return static_cast<HCURSOR>(m_hIcon);
129 }
130 
131 
132 
133 void CGdiplusTestDlg::OnDestroy()
134 {
135     CDialogEx::OnDestroy();
136 
137     // TODO: 在此处添加消息处理程序代码
138     if( m_pImage ) 
139     { 
140         try 
141         { 
142             delete m_pImage; 
143         } 
144         catch (...) 
145         { 
146 
147         } 
148         m_pImage = NULL; 
149     } 
150 
151     GdiplusShutdown( m_gdiplusToken );
152 }

 

 

运行效果:

 

 

以上是关于Gdiplus的使用的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中使用 Gdiplus 创建透明位图

我应该使用哪个 Gdiplus::Graphics::DrawImage 函数?

如何处理从 Gdiplus::DrawArc 返回的零星 OutOfMemory 错误代码?

为啥我的 Gdiplus::Bitmap 不能保存文件

Gdiplus的使用

Gdiplus::屏幕上的图像 (C++)