1 . GDI+介绍
引言:鉴于网上关于GDI+的教程都是.Net的,基本上没有VB6.0的,而这方面又很多人有需要,所以我就写一个Visual Basic 6 GDI+ 入门教程。
目标人:所有能够较熟练使用VB的,对GDI+感兴趣或有GDI+编程需要的人。
1.What's GDI+
官方解释:GDI+是Windows XP中的一个子系统,它主要负责在显示屏幕和打印设备输出有关信息,它是一组通过C++类实现的应用程序编程接口。顾名思义,GDI+是以前版本GDI的继承者,出于兼容性考虑,Windows XP仍然支持以前版本的GDI,但是在开发新应用程序的时候,开发人员为了满足图形输出需要应该使用GDI+,因为GDI+对以前的Windows版本中GDI进行了优化,并添加了许多新的功能。
作为图形设备接口的GDI+使得应用程序开发人员在输出屏幕和打印机信息的时候无需考虑具体显示设备的细节,他们只需调用GDI+库输出的类的一些方法即可完成图形操作,真正的绘图工作由这些方法交给特定的设备驱动程序来完成,GDI+使得图形硬件和应用程序相互隔离,
从而使开发人员编写设备无关的应用程序变得非常容易。
我的解释:GDI+其实就是一个绘图模块,用于在屏幕上输出各种需要的内容。
2.GDI+ DLL
GDI+的Dll在Windows XP+中默认存在,如果Windows XP以下系统需要使用GDI+,那么需要从微软网站上下载安装包。
3.使用GDI+
GDI+在 Framework中默认集成,只要添加它的命名空间(System.Drawing.Drawing2D)就能够使用了;而GDI+在其它上面就没有那么容易了,例如VB6就需要添加GDI+的API。对于初学者,写一堆API可能比学GDI+用时还要长,幸好,网上有GDI+的TypeLib。我们只要在VB6中引用这个tlb即可免去写一堆API的麻烦。
Tlb下载地址:vistaswx.blogbus/files/12382508170.rar
Tlb注意说明:如果你结束了GDI+学习并把它应用到实际,那么我认为你最好去搜索下GDI+
的API,因为typelib会加载所有GDI+API导致程序没有达到最快速度。
Tlb使用说明:创建VB6工程,工程菜单>引用。引用中添加这个Tlb (注意:打开对话框中请将过滤器选择为“所有文件”再选择那个Tlb,为什么呢?因为VB有BUG,所以过滤TLB反而没有出现TLB。),类名是“GDI+ Type Library By ………………”
好,现在基础已经就绪。神奇的GDI+之门即将开启……
2. GDI+初始化
现在先让我们了解下GDI+的绘图机制。
1.初始化、关闭GDI+
我们需要对GDI+进行初始化,才能使用它的各种功能。如果没有初始化,那么VB6就会莫名其妙的崩溃。呵呵。
当然程序结束了我们还要关闭GDI+释放内存。
2.Graphics
Graphics是GDI+基础。首先我们需要一个图形对象graphics(可以看作是画板),我们所有的东西都要画在这个上面。那么如何显示呢?不要急,我们可以通过GDI+内置函数从一个对象的DC(设备描述表)上创建graphics。这样我们操作graphics的时候就会显示在对象上。当然我们还可以从对象的hwnd中创建;在中也可以从gdi+的图像(image)中创建(直接操作在图像上)。
3.绘图工具
有了画板,我们还要画笔、画刷才能画画 - -。画笔画刷呢,在gdi+中就叫做pen、brush。画笔pen只能画一个轮廓(画线),而画刷可以对一个东西进行填充(刷子)。这个就是一个基础 呵呵,很简单吧。
4.创建第一个VB6的 GDI+ 程序
首先,我们添加下GDI+的TypeLib;然后我们需要对窗体(以后可以是其它容器)属性进行设置:AutoRedraw=True,开启自动重绘;再把ScaleMode设置成3(Pixel像素),因为GDI+基础单位就是像素(当然可以用别的单位)
好 现在双击窗体,写入下面代码:
Dim token As Long
Dim graphics As Long
Private Sub InitGDIPlus()
'初始化GDI+
Dim uInput As GdiplusStartupInput
uInput.GdiplusVersion = 1
If GdiplusStartup(token, uInput) <> Ok Then
'初始化错误
MsgBox "GDI+ 初始化错误。程序即将关闭。", vbCritical, "InitError"
End
End If
End Sub
Private Sub TerminateGDIPlus()
GdipDeleteGraphics graphics '释放graphics占用的内存
GdiplusShutdown token '关闭GDI+
End Sub
Private Sub Form_Load()
InitGDIPlus
GdipCreateFromHDC Me.hDC, graphics
End Sub
Private Sub Form_Unload(Cancel As Integer)
TerminateGDIPlus
End SubOKhtml矩形框代码怎么写,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什么的呢?你可以在代码里面输入“gdiplusexports.”这样就列出了所有的GDI+函数。通过对象浏览器可以得知pen2是根据brush来创建pen的,现在不用。
&HFFFF0000:这里就是一个16进制的ARGB (Alpha,Red,Green,Blue——透明,红,绿,蓝程度,255(&HFF)是完全,0(&H0)是完全不) 的数据。当然你可以输入10进制,只是16进制很方便,2个位就是一段,如&HFFFF0000就代表一个透明度是255(不透明),颜是红的一种颜。如果你知道点绘图技巧就很容易用这个去写 呵呵~。同时我们还能看到gdi+过程是传址的,把pen传进去。为什么不用函数传出来呢?因为函数要传出一个标识,错误标识。一般如果成功了那么就返回的是0(Ok)。
好,现在已经拿到笔了,接下来就是用这个笔去画线了。通过查询可知有这么个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程序,虽然它只画了一条线:
Dim token As Long
Dim graphics As Long
Dim pen As Long
Private Sub InitGDIPlus()
'初始化GDI+
Dim uInput As GdiplusStartupInput
uInput.GdiplusVersion = 1
If GdiplusStartup(token, uInput) <> Ok Then
'初始化错误
MsgBox "GDI+ 初始化错误。程序即将关闭。", vbCritical, "InitError"
End
End If
End Sub
Private Sub TerminateGDIPlus()
GdipDeletePen pen '删除这个笔(pen)
GdipDeleteGraphics graphics '释放graphics占用的内存
GdiplusShutdown token '关闭GDI+
End Sub
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)
TerminateGDIPlus
End SubOK,F5运行。红线没有出来?^_^……注意了 我们是在Load中绘制的。GDI+绘制与VB自己语句绘制一样。我们需要让他自动重绘(窗体的AutoRedraw=True)或者放到Paint里面:)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论