摘 要 本文依绘上证指数K线图、条形图为例,讲解Windows图形系统的结构体系、使用GDI+进行VC++.NET图形编程的基本方法及实现过程。
关键词 VC++.NET;图形编程;GDI+;自动重绘;K线图;条形图
图形编程简单地说,就是从应用程序中将图形画到图形设备上。图形设备诸如显示器、打印机和绘图仪。
本讲将紧接第一讲采用的应用程序实例,通过绘制上证指数K线图和成交量条形图讲解VC++.NET图形编程的基本方法及实现过程。
一、Windows图形系统结构体系
众所周知,不仅图形设备千差万别,每一种图形设备的型号也名目繁多。过去,在DOS下应用程序要为图形界面付出许多代价,包括编写大量不同的代码以适应不同图形设备、不同设备的不同型号。最令人无法忍受的是,在DOS程序之间无法共享这些代码,每编写一次就意味着大量的重复劳动。
Windows是支持图形用户界面(GUI)的操作系统。其应用程序具有类似的界面、类似的操作,它以图形代替DOS下的字符命令,使用户容易操作、触类旁通。
为了简化编程,微软在于应用程序与图形设备之间增加了一个统一的接口——图形设备接口(Graphics Device Interface,GDI),如图1所示。GDI屏蔽了图形设备的差异,将应用程序与不同输出设备特性相隔离,使Windows应用程序能够毫无障碍地在Windows支持的任何图形输出设备上运行。
程序员在编写图形程序时,可以不必考虑图形设备的特性,而只专注于与GDI打交道。程序编好以后,即使图形输出设备变换了,程序编码也无需改变。例如,能在Epson点式打印机上工作的程序,在不改变程序的前提下,也能在激光打印机上工作。

图1 Windows图形系统结构体系
不仅如此,Windows图形系统结构体系提供的GDI接口,适用于所有Windows应用程序,是Windows应用程序图形编程的统一接口。
二、GDI+速览
GDI的.NET版本叫做GDI+。GDI+对GDI进行了很好的改进,并且易用性更好。
在VC++.NET中编写图形程序时,直接与应用程序打交道的接洽者就是GDI+。
⒈ GDI+
GDI+是 API 通过一组部署为托管代码并向程序员公开的类。托管类接口由以下命名空间组成:
System.Drawing
System.Drawing.Drawing2D
System.Drawing.Imaging
System.Drawing.Text
System.Drawing.Printing
GDI+包含大约 60 个类、50 个枚举和 8 个结构。Graphics 类是 GDI+ 的核心功能,它是实际绘制直线、曲线、图形、图像和文本的类。
许多类与 Graphics 类一起使用。例如:
(1)Pen 类 用于绘制线条、勾勒形状轮廓或绘制其他几何形式。
(2)Brush 类 用于填充图形区域,如实心形状、图像或文本。
(3)Font 类 在绘制文本时要使用的形状。
(4)Color 结构 表示要显示的不同颜色。
⒉确定图形的位置
GDI+图形的位置是通过坐标系来确定的。默认坐标系统的原点是在左上角,并且 x 轴指向右边,y 轴指向下边,如图2所示,默认坐标系统的度量单位是像素。

图 2 默认坐标系统
⒊创建图形对象
所有图形都是通过GDI+图形对象Graphics的有关方法来绘制的。Graphics 对象表示 GDI+ 绘图表面,是用于创建图形图像的对象。要绘制图形,需要先创建 Graphics 对象。
可以用各种方法创建Graphics对象。
⑴ 从 Paint 事件中的 PaintEventArgs 引用 Graphics 对象
在窗体或控件的 Paint 事件中,接收对图形对象(作为PaintEventArgs 的一部分)的引用:
1) 声明 Graphics 对象。
2) 分配变量来引用作为 PaintEventArgs 的一部分传递的 Graphics 对象。
3) 编写代码在窗体或控件上绘图。
下面的示例演示了如何从 Paint 事件中的 PaintEventArgs 引用 Graphics 对象。
private:
void Form1_Paint(System::Object ^ sender,
System::Windows::Forms::PaintEventArgs ^ pe)
{
// 声明一个 Graphics 对象g,并且引用作为 PaintEventArgs
// 的一部分传递的 Graphics 对象。
Graphics ^ g = pe->Graphics;
// 在这里插入绘图代码。
}
在为控件编写绘图代码时,通常会使用此方法来获取对图形对象的引用。
⑵ 用CreateGraphics 方法获取对 Graphics 对象的引用
调用某控件或窗体的 CreateGraphics 方法以获取对 Graphics 对象的引用,该对象表示该控件或窗体的绘图图面。
用 CreateGraphics 方法创建 Graphics 对象的示例代码:
Graphics ^ g;
// 让 g 获取对 Graphics 对象的引用,
// 该对象表示该控件或窗体的绘图图面。
g = this->CreateGraphics();
如果想在已存在的窗体或控件上绘图,使用此方法。
⑶ 从 Image 对象创建Graphics 对象
可以从 Image 类派生的任何对象创建Graphics对象。
调用 System.Drawing.Graphics.FromImage(System.Drawing.Image) 方法,提供要从其创建 Graphics 对象的 Image 变量的名称。
下面的示例演示如何使用 Bitmap 对象:
Bitmap ^ myBitmap = gcnew
Bitmap("D:\\Documents and Settings\\Joe\\Pics\\myPic.bmp");
Graphics ^ g = Graphics::FromImage(myBitmap);
此方法在需要更改已存在的图像时十分有用。
|