Gdiplus的使用 gdi+
使用步骤:
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 }
运行效果: