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 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比较好,因为这样可以获得更快的绘制速度;全部绘制完一次性刷新还能避免闪烁啥的问题。
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当中的面向对象部分. 在上一篇文章当中我们一起学习了怎么创建一个结构体,以及怎么 ...
随机推荐
- Apache Commons-pool实现对象池(包括带key对象池)
Commons-pool是一个apache开源组织下的众多项目的一个.其被广泛地整合到众多需要对象池功能的项目中. 官网:http://commons.apache.org/proper/common ...
- HTML 5 Web Sockets应用初探
转载不错的http://developer.51cto.com/art/201008/217874.htm
- Codeforces Round #370 (Div. 2) B
Description Memory is performing a walk on the two-dimensional plane, starting at the origin. He is ...
- js动画 无缝轮播 进度条 文字页面展示 div弹窗遮罩效果
1.无缝轮播 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.a ...
- 阿里巴巴Double分布式服务框架
开发人员梁飞的blog : http://javatar.iteye.com/ 梁飞关于Double框架的专访: http://www.iteye.com/magazines/103 Double项目 ...
- switch语句和for循环
switch语句: 1. switch 后面小括号中表达式的值必须是整型或字符型 2. case后面的值可以是常量数值,如:1.日:也可以是一个常量表达式,如:2+2:但 不能是变量或带有变量的表达式 ...
- python_way day14 HTML
python_way day 14 HTML 一,标签 二.特殊字符 三,css <!DOCTYPE html> <html lang="en"> < ...
- 工程源码github地址
APP APP历史版本地址:https://github.com/Myskety/aps APP最终版地址:https://github.com/dycaly/YHAPP 服务器 历史服务器版本地址: ...
- ssis freach loop container 传入变量给 某些数据源的时候。
ssis freach loop container 传入变量给 某些数据源的时候. 应该选择loop container ,设置delayvalidateion为true. 这样数据源控件就不会报e ...
- SAP FI/CO凭证不一致的解决办法
First, use program RKACOR20 to delete the incorrect CO documents. OKBA - Transfer FI Documents to CO ...