VC6.0中GDI+使用

VC 专栏收录该内容
3 篇文章 0 订阅

GDI+可应用于二维向量图象,栅格图象及排版,是为C/C++程序员而设计的表现为C++类而存在的接口,能用于一切基于Windows的应用中。作为GDI的后继者,GDI+在GDI中增加了新功能,如文本的反锯齿,渐变笔刷,Alpha溶合;也优化了GDI许多已有的功能。此外,GDI+改变了编程模式,使其更灵活及易用。

GDI+并不限于在.Net中存在,实际上它由Windows XP或Windows Server 2003操作系统提供。它被打包在一个名为GdiPlus.dll的文件中。此文件位于C:/Windows/WinSxS下的相应文件夹下。以笔者的XP系统为例,共有2个版本,其相应的文件夹分别是:

x86_Microsoft.Windows.GdiPlus_6595b64144ccf1df_1.0.0.0_x-ww_8d353f13
x86_Microsoft.Windows.GdiPlus_6595b64144ccf1df_1.0.2600.2180_x-ww_522f9f82

在应用程序中,我们不需指定版本号,系统自动选择最新的版本。先假设我们已经在VC6中编好一个GDI+应用,在degbug版本中单击菜单Build->Start Debug->Go启动调试,再终止应用,在VC6的Output区域中可以看到以下信息:
Loaded ''C:/WINDOWS/WinSxS/x86_Microsoft.Windows.GdiPlus_6595b64144ccf1df_1.0.2600.2180_x-ww_522f9f82/GdiPlus.dll''
说明系统自动选择了最新的版本。

如同Windows是用C语言编写,GdiPlus.dll是以C函数实现的,并没有封装为C++类,从而给非C程序员带来不便。又如同MFC所为,微软再次将这些C函数打包为C++类的形式,向C++程序员提供了以GdiPlus.h领头的30个头文件及一个GdiPlus.lib。因此,如果您是C程序员,则只需GdiPlus.dll就行了;C++程序员则还需要找到GdiPlus.h等头文件及GdiPlus.lib文件。

Windows XP或Windows Server 2003应使用系统自带的GdiPlus.dll,以免与系统服务冲突。而对于版本低于Windows XP的Windows,如Windows NT 4.0 SP6, Windows 2000, Windows98及Windows Me,则需要此文件。可到微软的官方地址去下载分发包gdiplus_dnld.exe文件,地址为:
http://www.microsoft.com/downloads/details.aspx?FamilyID=6a63ab9c-df12-4d41-933c-be590feaa05a&DisplayLang=en

该文件是一个自解压的文件,应将其解压到应用程序的目录下,但不要安装在系统目录中。

C++程序员还应去找GdiPlus.h及GdiPlus.lib。以下地址所提供的名为gdiplus.zip的文件就包括了这些文件:
http://www.crazy-bit.com/download/gdiplus.zip

而以下的地址则提供了一站式的所有资源,即包含了GdiPlus.h等头文件, GdiPlus.lib及GdiPlus.dll:
http://www.codersource.net/samples/mfcgdiplus.zip

根据解压的不同方式,有不同的引用方法。

第一种方法是直接引用,需要将gdiplus.h, gdiplus.lib分别拷贝至VC相应的include及lib目录下。这两个目录可通过VC6的Toos->Options->Directories标签页中,在Show directories for下拉列表框中分别选择Include files及Library files查询到。如Include,一般包括3个路径:VC98/INCLUDE, VC98/MFC/INCLUDE及VC98/ATL/INCLUDE,分别对应非MFC应用,MFC应用及ATL应用所用的不同路径。

然后在StdAfx.h中加入如下的语句:

#define ULONG_PTR ULONG
#include <gdiplus.h>
using namespace Gdiplus;
#pragma comment(lib, "gdiplus.lib")

GdiPlusInit.h中使用了ULONG_PTR的数据类型,但此类型在VC6中没有定义。因此必须在#include语句之前先进行定义。#pragma comment(lib, "gdiplus.lib")指示在连接时在应用所在目录或系统LIB目录下查找gdiplus.lib。

第二种方法是将其解压到任意一个文件夹,然后在StdAfx.h中明确指明具体路径。

#define ULONG_PTR ULONG
#include "C:/gdiplus/Include/gdiplus.h"
using namespace Gdiplus;
#pragma comment(lib, "C:/gdiplus/lib/gdiplus.lib")

除了用以上的方法连接gdiplus.lib之外,还可以在Project->Settings->Link->Object/library modules中输入gdiplus.lib(若有多个库,可用空格隔开,但GDI+只有一个库)。这种方法,可不用在StdAfx.h中输入#pragma comment。

在使用GDI+之前,您必须通过GdiplusStartup()启动GDI+,而在使用完毕后,调用GdiplusShutdown()来清理现场。 根据MFC的特点,应相应地放在XXXApp类的InitInstance()及ExitInstance()中。

先为XXXApp类添加两私有成员变量:
private:
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;

然后在InitInstance()中,在调用m_pMainWnd->ShowWindow()及m_pMainWnd->UpdateWindow()之前调用GdiplusStartup():

GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

// The one and only window has been initialized, so show and update it.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;

注意,如果GdiplusStartup()放在ShowWindow()及UpdateWindow()之后,则当窗口第一次显示时,由于GDI+还未启动,GDI+所画的图形不会显示出来,直到第二个WM_PAINT的消息传到。

而在ExitInstance()中,如下编写代码:

GdiplusShutdown(gdiplusToken);
return CWinApp::ExitInstance();

现在,GDI+已经准备完毕,可以使用了。

在XXXView类的OnDraw()方法中:

Graphics graphics(pDC->m_hDC);

Pen pen(Color(50, 255, 0, 255), 15);
pen.SetDashStyle(DashStyleDash);
pen.SetStartCap(LineCapRoundAnchor);
pen.SetEndCap(LineCapArrowAnchor);

graphics.DrawLine(&pen, 20, 20, 300, 100);
graphics.DrawLine(&pen, 300, 100, 600, 100);

先使用OnDraw()方法的参数pDC的成员变量m_hDC在堆上构造一个Graphics的实例graphics,创建一个Pen并进行设置,然后通过graphics的DrawLine()方法画出直线来。

与GDI相比较,GDI+不必将Pen, Brush等对象选进DC再画图,而是通过使用DC的句柄来创建一个Graphics实例,之后,直接使用此实例来进行画图。这种风格,确实大大方便了编程人员。

至此,我们可以在VC6 MFC中使用GDI+描绘美好的未来了。:)

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/desow/archive/2009/09/25/4592847.aspx

安装文章2:

VC.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,

(2)、在应用程序项目的应用类中,添加一个成员变量,如下列代码:

ULONG_PTR m_gdiplusToken;其中,ULONG_PTR是一个DWORD数据类型,该成员变量用来保存GDI+被初始化后在应用程序中的GDI+标识,以便能在应用程序退出后,引用该标识来调用Gdiplus:: GdiplusShutdown来关闭GDI+。

(3)、在应用类中添加ExitInstance的重载,并添加下列代码用来关闭GDI+:

int CGDIPlusApp::ExitInstance()
{
 Gdiplus::GdiplusShutdown(m_gdiplusToken);
 return CWinApp::ExitInstance();
}(4)、在应用类的InitInstance函数中添加GDI+的初始化代码:

BOOL CGDIPlusApp::InitInstance()
{
 CWinApp::InitInstance();
 Gdiplus::GdiplusStartupInput gdiplusStartupInput;
 Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
 ...
}(5)、在需要绘图的窗口或视图类中添加GDI+的绘制代码:

void CGDIPlusView::onDraw(CDC *pDC)
{
 Graphics graphics( pDC->m_hDC );

 GraphicsPath path; // 构造一个路径
 path.AddEllipse(50, 50, 200, 100);

 // 使用路径构造一个画刷
 PathGradientBrush pthGrBrush(&path);

 // 将路径中心颜色设为蓝色
 pthGrBrush.SetCenterColor(Color(255, 0, 0, 255));

 // 设置路径周围的颜色为蓝芭,但alpha值为0
 Color colors[] = {Color(0, 0, 0, 255)};
 INT count = 1;
 pthGrBrush.SetSurroundColors(colors, &count);

 graphics.FillRectangle(&pthGrBrush, 50, 50, 200, 100);

 LinearGradientBrush linGrBrush(
  Point(300, 50),
  Point(500, 150),
  Color(255, 255, 0, 0), // 红色
  Color(255, 0, 0, 255)); // 蓝色

 graphics.FillRectangle(&linGrBrush, 300, 50, 200, 100);
}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/scollins/archive/2010/03/24/5413161.aspx

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值