|
楼主 |
发表于 2007-2-6 14:32:55
|
显示全部楼层
6、用Visual C++.NET使用GDI+的一般方法
在Visual C++.NET使用GDI+一般遵循下列步骤:
(1) 在应用程序中添加GDI+的包含文件gdiplus.h以及附加的类库gdiplus.lib。通常gdiplus.h包含文件添加在应用程序的stdafx.h文件中,而gdiplus.lib可用两种进行添加:第一种是直接在stdafx.h文件中添加下列语句:
#pragma comment( lib, "gdiplus.lib" ) |
另一种方法是:选择"项目"ò"属性"菜单命令,在弹出的对话框中选中左侧的"链接器"ò"输入"选项,在右侧的"附加依赖项"框中键入gdiplus.lib,结果如图1所示。
图1
(2) 在应用程序项目的应用类中,添加一个成员变量,如下列代码:
ULONG_PTR m_gdiplusToken; |
其中,ULONG_PTR是一个DWORD数据类型,该成员变量用来保存GDI+被初始化后在应用程序中的GDI+标识,以便能在应用程序退出后,引用该标识来调用Gdiplus:: GdiplusShutdown来关闭GDI+。
(3) 在应用类中添加ExitInstance的重载,并添加下列代码用来关闭GDI+:
int CEx_GDIPlusApp::ExitInstance() { Gdiplus::GdiplusShutdown(m_gdiplusToken); return CWinApp::ExitInstance(); } |
(4) 在应用类的InitInstance函数中添加GDI+的初始化代码:
BOOL CEx_GDIPlusApp::InitInstance() { CWinApp::InitInstance(); Gdiplus::GdiplusStartupInput gdiplusStartupInput; Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL); ... } |
(5) 在需要绘图的窗口或视图类中添加GDI+的绘制代码。
下面分别就单文档和基于对话框应用程序为例,说明使用GDI+的一般过程和方法。
1. 在单文档应用程序中使用GDI+
在上面的过程中,我们就是以一个单文档应用程序Ex_GDIPlus作为示例的。下面列出第5步所涉及的代码:
void CEx_GDIPlusView::OnDraw(CDC* pDC) { CEx_GDIPlusDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); using namespace Gdiplus; Graphics graphics( pDC->m_hDC ); Pen newPen( Color( 255, 0, 0 ), 3 ); HatchBrush newBrush( HatchStyleCross, Color(255, 0, 255, 0), Color(255, 0, 0, 255)); // 创建一个填充画刷,前景色为绿色,背景色为蓝色
graphics.DrawRectangle( &newPen, 50, 50, 100, 60); // 在(50,50)处绘制一个长为100,高为60的矩形
graphics.FillRectangle( &newBrush, 50, 50, 100, 60); // 在(50,50)处填充一个长为100,高为60的矩形区域 } |
编译并运行,结果如图2所示。
图2
2. 在基于对话框应用程序中使用GDI+
步骤如下:
(1) 创建一个默认的基于对话框的应用程序Ex_GDIPlusDlg。
(2) 打开stdafx.h文件添加下列代码:
#include <gdiplus.h> #pragma comment( lib, "gdiplus.lib" ) |
(3) 打开Ex_GDIPlusDlg.h文件,添加下列代码:
class CEx_GDIPlusDlgApp : public CWinApp { ... public: virtual BOOL InitInstance(); ULONG_PTR m_gdiplusToken; ... }; |
(4) 在 CEx_GDIPlusDlgApp类的属性窗口中,单击"重写"工具按钮,为该添加ExitInstance的重载:
int CEx_GDIPlusDlgApp::ExitInstance() { Gdiplus::GdiplusShutdown(m_gdiplusToken); return CWinApp::ExitInstance(); } |
(5) 定位到CEx_GDIPlusDlgApp::InitInstance函数处,添加下列GDI+初始化代码:
BOOL CEx_GDIPlusDlgApp::InitInstance() { CWinApp::InitInstance(); Gdiplus::GdiplusStartupInput gdiplusStartupInput; Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL); ... } |
(6) 定位到CEx_GDIPlusDlgDlg::OnPaint函数处,添加下列GDI+代码:
void CEx_GDIPlusDlgDlg::OnPaint() { if (IsIconic()) { ... } else { CPaintDC dc(this); // 用于绘制的设备上下文 using namespace Gdiplus; Graphics graphics( dc.m_hDC ); Pen newPen( Color( 255, 0, 0 ), 3 ); HatchBrush newBrush( HatchStyleCross, Color(255, 0, 255, 0), Color(255, 0, 0, 255)); graphics.DrawRectangle( &newPen, 50, 50, 100, 60); graphics.FillRectangle( &newBrush, 50, 50, 100, 60); CDialog::OnPaint(); } } |
(7) 编译并运行,结果如图3所示。
图3
从上述例子可以看出,只要能获得一个窗口的设备环境指针,就可构造一个Graphics对象,从而可以在其窗口中进行绘图,我们不必在像以往那样使用Invalidate/UpdateWindow来防止Windows对对话框窗口进行重绘。 |
|