现在先让我们了解下GDI+的绘图机制。
1.初始化、关闭GDI+
我们需要对GDI+进行初始化,才能使用它的各种功能。如果没有初始化,那么VB6就会莫名其妙的崩溃。呵呵。
当然程序结束了我们还要关闭GDI+释放内存。
2.Graphics
Graphics是GDI+基础。首先我们需要一个图形对象graphics(可以看作是画板),我们所有的东西都要画在这个上面。那么如何显示呢?不要急,我们可以通过GDI+内置函数从一个对象的DC(设备描述表)上创建graphics。这样我们操作graphics的时候就会显示在对象上。当然我们还可以从对象的hwnd中创建;在.net中也可以从gdi+的图像(image)中创建(直接操作在图像上)。
3.绘图工具
有了画板,我们还要画笔、画刷才能画画 – -。画笔画刷呢,在gdi+中就叫做pen、brush。画笔pen只能画一个轮廓(画线),而画刷可以对一个东西进行填充(刷子)。这个就是一个基础 呵呵,很简单吧。
4.创建第一个VB6的 GDI+ 程序
首先,我们添加下GDI+模块;然后我们需要对窗体(以后可以是其它容器)属性进行设置:AutoRedraw=True,开启自动重绘;再把ScaleMode设置成3(Pixel像素)(注:这么做是为了UI时候的统一,这一步是否执行对于GDI+直接绘制的结果不会有影响),因为GDI+基础单位就是像素(当然可以用别的单位)
好 现在双击窗体,写入下面代码:
Option Explicit
Dim graphics As Long
Private Sub Form_Load()
InitGDIPlus
GdipCreateFromHDC Me .hDC, graphics
End Sub
Private Sub Form_Unload(Cancel As Integer )
GdipDeleteGraphics graphics '释放graphics占用的内存
TerminateGDIPlus
End Sub
|
OK,F5运行。如果没有问题的话我们第一个最基础的GDI+程序已经完成了。这个基本的程序创建了一个graphics对象,当然什么还没有画呢。
通过这个程序,我们就大致了解VB6中GDI+如何初始化、关闭了。首先呢要启动GDI+,然后要创建一个graphics;关闭的时候也要做好扫地工作。
5.画线
线嘛,又不是填充,根据前面说的,我们需要一个pen。那么如何创建pen呢?呵呵,下面的代码就能创建一个pen(追加在Form_Load过程中的末尾):
Dim pen As Long
GdipCreatePen1 &HFFFF0000, 1, UnitPixel, pen |
这里已经新建了一个pen。为什么是GdipCreatePen1而不是GdipCreatePen2什么的呢?你可以在代码里面输入“mgdip.”这样就列出了所有的GDI+函数。通过对象浏览器可以得知pen2是根据brush来创建pen的,现在不用。
&HFFFF0000:这里就是一个16进制的ARGB (Alpha,Red,Green,Blue——透明,红色,绿色,蓝色程度,255(&HFF)是完全,0(&H0)是完全不) 的数据。当然你可以输入10进制,只是16进制很方便,2个16进制位就是一个字节,如&HFFFF0000就代表一个透明度是255(不透明),颜色是红色的一种颜色。如果你知道一些绘图技巧就很容易用这个去写 呵呵~。同时我们还能看到gdi+过程是传址的,把pen传进去。为什么不用函数返回值传出来呢?因为函数返回值要传出一个状态,执行结果的标志。一般如果成功了那么就返回的是0(Ok)。
好,现在已经拿到笔了,接下来就是用这个笔去画线了。通过查询mGdip的声明(请学会自主探索)可知有这么个API:GdipDrawLine,它的X1Y1,X2Y2是single型,继续找又发现GdipDrawLineI,它的坐标值都是Long型(我们一般用不到single,因此我们一般用GdipDrawLineI就行了)。根据它的参数名字 乱猜都能猜出来哪个参数代表什么了,于是我随便写了一句:GdipDrawLineI graphics, pen, 10, 10, 200, 100。注意:你需要把graphics和pen传进去,否则怎么画呢?不告诉它画在哪里~~,后面4个参数分别对应:起始点X、起始点Y、终点X、终点Y的坐标。当然扫地工作也要做好,删除pen的语句是GdipDeletePen;参数很简单,传pen进去即可。
综合起来,于是我们有了第一段真正绘制的GDI+ VB6程序,虽然它只画了一条线:
Option Explicit
Dim graphics As Long
Dim pen As Long
Private Sub Form_Load()
InitGDIPlus
GdipCreateFromHDC Me .hDC, graphics
GdipCreatePen1 &HFFFF0000, 1, UnitPixel, pen
GdipDrawLineI graphics, pen, 10, 10, 200, 100
End Sub
Private Sub Form_Unload(Cancel As Integer )
GdipDeletePen pen '删除这个笔(pen)
GdipDeleteGraphics graphics '释放graphics占用的内存
TerminateGDIPlus
End Sub
|
OK,F5运行。红线没有出来?^_^……注意了 我们是在Load中绘制的。GDI+绘制与VB自己语句绘制一样。我们需要让他自动重绘(窗体的AutoRedraw=True)或者放到Paint里面:)
注:如果你不是在Load事件中绘制的东西,并且Form的AutoRedraw是True,那么别忘记全部画完后Refresh(例如 Me.Refresh)一下。因为VB的AutoRedraw的机制就是这样。但是开启AutoRedraw比较好,因为这样可以获得更快的绘制速度;全部绘制完一次性刷新还能避免闪烁啥的问题。