VB6 GDI+ 入门教程[2] GDI+初始化
现在先让我们了解下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 ExplicitDim graphics As LongPrivate Sub Form_Load() InitGDIPlus GdipCreateFromHDC Me.hDC, graphicsEnd SubPrivate Sub Form_Unload(Cancel As Integer) GdipDeleteGraphics graphics '释放graphics占用的内存 TerminateGDIPlusEnd Sub |
OK,F5运行。如果没有问题的话我们第一个最基础的GDI+程序已经完成了。这个基本的程序创建了一个graphics对象,当然什么还没有画呢。
通过这个程序,我们就大致了解VB6中GDI+如何初始化、关闭了。首先呢要启动GDI+,然后要创建一个graphics;关闭的时候也要做好扫地工作。
5.画线
线嘛,又不是填充,根据前面说的,我们需要一个pen。那么如何创建pen呢?呵呵,下面的代码就能创建一个pen(追加在Form_Load过程中的末尾):
Dim pen As LongGdipCreatePen1 &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 ExplicitDim graphics As LongDim pen As LongPrivate Sub Form_Load() InitGDIPlus GdipCreateFromHDC Me.hDC, graphics GdipCreatePen1 &HFFFF0000, 1, UnitPixel, pen GdipDrawLineI graphics, pen, 10, 10, 200, 100End SubPrivate Sub Form_Unload(Cancel As Integer) GdipDeletePen pen '删除这个笔(pen) GdipDeleteGraphics graphics '释放graphics占用的内存 TerminateGDIPlusEnd Sub |

OK,F5运行。红线没有出来?^_^……注意了 我们是在Load中绘制的。GDI+绘制与VB自己语句绘制一样。我们需要让他自动重绘(窗体的AutoRedraw=True)或者放到Paint里面:)
注:如果你不是在Load事件中绘制的东西,并且Form的AutoRedraw是True,那么别忘记全部画完后Refresh(例如 Me.Refresh)一下。因为VB的AutoRedraw的机制就是这样。但是开启AutoRedraw比较好,因为这样可以获得更快的绘制速度;全部绘制完一次性刷新还能避免闪烁啥的问题。
VB6 GDI+ 入门教程[2] GDI+初始化的更多相关文章
- VB6 GDI+ 入门教程[1] GDI+介绍
http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[1] GDI+介绍 2009 年 6 月 18 日 17 ...
- VB6 GDI+ 入门教程[3] 笔、刷子、矩形、椭圆绘制
http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[3] 笔.刷子.矩形.椭圆绘制 2009 年 6 月 1 ...
- VB6 GDI+ 入门教程[4] 文字绘制
http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[4] 文字绘制 2009 年 6 月 18 日 7条评论 ...
- VB6 GDI+ 入门教程[5] 基础绘图小结
http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[5] 基础绘图小结 2009 年 6 月 18 日 4条 ...
- VB6 GDI+ 入门教程[6] 图片
http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[6] 图片 2009 年 6 月 19 日 15条评论 ...
- VB6 GDI+ 入门教程[7] Graphics 其他内容
http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[7] Graphics 其他内容 2009 年 9 月 ...
- VB6 GDI+ 入门教程[8] Bitmap魔法(1):创建
http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[8] Bitmap魔法(1):创建 2009 年 9 月 ...
- VB6 GDI+ 入门教程[9] Bitmap魔法(2):数据读写
本文转自 http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[9] Bitmap魔法(2):数据读写 200 ...
- golang | Go语言入门教程——结构体初始化与继承
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题第10篇文章,我们继续来看golang当中的面向对象部分. 在上一篇文章当中我们一起学习了怎么创建一个结构体,以及怎么 ...
随机推荐
- Java中的内部类与匿名内部类总结
内部类 内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类 如同一个人是由大脑.肢体.器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液.跳动) ...
- c语言中函数调用的本质从汇编角度分析
今天下午写篇博客吧,分析分析c语言中函数调用的本质,首先我们知道c语言中函数的本质就是一段代码,但是给这段代码起了一个名字,这个名字就是他的的这段代码的开始地址 这也是函数名的本质,其实也就是汇编中的 ...
- STM32 NVIC
在stm32中是要配置nvic的.何为nvic,对于我这样的初学者来说,直观感受就是在设置为中断后 还需要配置 中断的优先级nvic就是搞这个的. 那么具体的需要配置些什么那? void NVIC_C ...
- 第二课 android项目结构
- C++实现链式栈,运用模板,界面友好,操作方便,运行流畅
//.h文件 #ifndef STACK_H #define STACK_H #include<iostream> #include<iomanip> using namesp ...
- Python串口编程
python的串口网上有很多例子,这里了只是把认为好的整理到一起. 首先,应该安装serial模块,还能开始后续的操作.我用的python2.6,serial模块可以在这里下载安装serial模块下载 ...
- mimikatz2.0抓取WINDOWS密码
看吾爱的,刚好问同事说这个也用过,以后内网渗透的话比较方便 http://www.52pojie.cn/thread-264895-1-1.html ========================= ...
- C# 十进制与十六进制互转
1.从十六进制转换为十进制 /// <summary> /// 十六进制转换到十进制 /// </summary> /// <param name="hex&q ...
- STL区间成员函数及区间算法总结
STL区间成员函数及区间算法总结 在这里总结下可替代循环的区间成员函数和区间算法: 相比单元素遍历操作,使用区间成员函数的优势在于: 1)更少的函数调用 2)更少的元素移动 3)更少的内存分配 在区间 ...
- HDU5869树状数组+gcd预处理
比赛的时候知道用树状数组,但有点乱不知道怎么处理. 统计不同的gcd的个数其实就是用树状数组统计区间内不同的数的模板题啊... 复杂度O(nlogn) #include <bits/stdc++ ...