http://vistaswx.com/blog/article/category/tutorial/page/2
2009 年 6 月 18 日 3条评论
标签: AntiAlias,GdiPlus,vb 分类: Tutorial,VB6 GDI+

好,我们已经学会如何画线了,那么后面的事情只要变通下都可以解决。不过变通前我还是得说几个基本的东西。

1.绘制,填充一个矩形

绘制一个整型长度的矩形,我们要用到GdipDrawRectangleI和GdipFillRectangleI。前者用pen画一个轮廓边框,后者用brush刷出一个填充区域。当然接下来就是如何创建刷子的问题了。GDI+中有多种刷子,有纯色刷子(创建:GdipCreateSolidFill),有渐变刷子(创建:GdipCreateLineBrush),还有纹理刷子,贴图刷子,路径刷子等等…………它们用于不同的方面。

(1)绘制一个矩形边框

首先,我们需要一个pen。

第一步,Dim!当然,我这样写了:Dim pen As Long;

第二步,创建一个红色的pen(线的粗细是1px):GdipCreatePen1 &HFFFF0000, 1, UnitPixel, pen。

pen创好了,接下来画矩形。这里我们用GdipDrawRectangleI来画矩形。画矩形跟画线可不一样,虽然指定坐标的都是4个参数,但是矩形里面四个参数分别是:X,Y,长,宽。OK,综合一下,代码如下:

 
Option Explicit
 
Dim graphics As Long
Dim pen As Long
 
Private Sub Form_Load()
    InitGDIPlus
 
    GdipCreateFromHDC Me.hDC, graphics
 
    GdipCreatePen1 &HFFFF0000, 1, UnitPixel, pen
    GdipDrawRectangleI graphics, pen, 30, 30, 100, 100
End Sub
 
Private Sub Form_Unload(Cancel As Integer)
    GdipDeletePen pen
    GdipDeleteGraphics graphics '释放graphics占用的内存
    TerminateGDIPlus
End Sub

现在我们就绘制了一个100*100的红色矩形边框。很简单吧,变通就是这样的。

(2)创建纯色刷子

任何刷子包括其它的GDI+元素基本上都是一个思路:我们首先要Dim一个long型变量储存刷子/其它元素的地址,然后再调用GDI+相关函数去创建出指定刷子/其它元素。现在来创建一个蓝色,透明度为&HAA的刷子,那么代码就是这样:

 
Dim brush As Long
GdipCreateSolidFill &HAA0000FF, brush

刷子就这样拿到了。当然不要忘记扫地工作:GdipDeleteBrush brush。

(3)用刷子填充一个矩形

很明显,函数里面找一下就会发现我们要的函数:GdipFillRectangleI。它与DrawRectangleI很类似,只不过把pen变成了brush,因为现在要刷上去嘛- -。这一步也是很好变通的。把前面的一翻整理之后我们得到了一个绘制矩形并填充(不如说先填充再画边框,至于原因你可以自己颠倒一下顺序看下结果)的代码(注意 填充色是有透明度的):

 
Option Explicit
 
Dim graphics As Long
Dim pen As Long, brush As Long
 
Private Sub Form_Load()
    InitGDIPlus
 
    GdipCreateFromHDC Me.hDC, graphics
 
    GdipCreatePen1 &HFFFF0000, 1, UnitPixel, pen
    GdipCreateSolidFill &HAA0000FF, brush
 
    GdipFillRectangleI graphics, brush, 30, 30, 100, 100
    GdipDrawRectangleI graphics, pen, 30, 30, 100, 100
End Sub
 
Private Sub Form_Unload(Cancel As Integer)
    GdipDeletePen pen
    GdipDeleteBrush brush
    GdipDeleteGraphics graphics '释放graphics占用的内存
    TerminateGDIPlus
End Sub

一样很简单吧!GDI+就是那么简单,只要懂了它的“工作机制”~!

(4)渐变刷子

渐变色很Cool,纯VB代码却要很多,还好,GDI+有一个方便的渐变刷子函数——GdipCreateLineBrush。看参数,发现不一样:

 
Function GdipCreateLineBrush(Point1 As POINTF, Point2 As POINTF, Color1 As Long, Color2 As Long, WrapMode As WrapMode, LineGradient As Long) As GpStatus

虽然复杂。。不过又很容易理解:Point1是一个PointF结构,它储存了坐标的X,Y,代表起始位置——这是渐变的起始、中止位置。一般情况下我们的起始中止位置是和绘制的图形一致的。Point2一样,代表了终点。渐变就在这两个点中“展开”。注意,现在是坐标点,而不是长宽值。Color1自然就是起始颜色,Color2则是第二颜色。WrapMode就是填充方向,最后一个参数自然就是传回建立好的brush。

于是我们又开始写程序了,这次是创建一个蓝色->红色,纵向的刷子。绘制图形免去,如果想看效果请自己添加drawrectangle(如果还要使用point画矩形请注意啦,rectangle里面 后面参数是接受长宽,而刷子里面接受的是点……知道区别和解决方法了么?减呗!)。

 
Dim brush As Long
Dim p1 As POINTF, p2 As POINTF
p1.X = 0
p1.Y = 0
p2.X = 0
p2.Y = 100
GdipCreateLineBrush p1, p2, &HFF0000FF, &HFFFF0000, WrapModeTileFlipy, brush

2.绘制椭圆

椭圆,想想也不会跟rectangle画法相差到哪里去。事实的确如此。下面就是一个绘制渐变椭圆的代码,解释免了吧,应该是很容易理解的。

 
Option Explicit
 
Dim graphics As Long
Dim brush As Long
 
Private Sub Form_Load()
    InitGDIPlus
 
    GdipCreateFromHDC Me.hDC, graphics
 
    Dim p1 As POINTF, p2 As POINTF
    p1.X = 10
    p1.Y = 10
    p2.X = 100
    p2.Y = 50
 
    GdipCreateLineBrush p1, p2, &H8AFF00FF, &HFFFF0000, WrapModeTileFlipXY, brush
    GdipFillEllipseI graphics, brush, p1.X, p1.Y, p2.X - p1.X, p2.Y - p1.X '注意:类似的,绘制椭圆边框的语句是GdipDrawEllipseI
End Sub
 
Private Sub Form_Unload(Cancel As Integer)
    GdipDeleteBrush brush
    GdipDeleteGraphics graphics '释放graphics占用的内存
 
    TerminateGDIPlus
End Sub

3.反锯齿功能

不知你有没有发现,画出来的椭圆是很不圆滑的(虽然用VB自己绘制也是如此)。如此强大的GDI+怎么可能没有圆滑的功能呢?有!函数是GdipSetSmoothingMode。我们需要把它加在绘制内容之前。一般我们把它加在创建好graphics之后(注意:它是作用于graphics的,因此请不要还没初始化graphics就设置graphics的光滑属性- -)。经过一翻调整,我们得出了一个设置圆滑的语句:

 
GdipSetSmoothingMode graphics,SmoothingModeAntiAlias

模式自然要设置成AntiAlias,AntiAlias顾名思义就是反锯齿(消除锯齿)。现在我们把这句话加到前面的椭圆程序中去,运行,如何,椭圆很光滑吧!同样,前面任何一个程序都可以这样加使gdi+画出来的东西看上去很平滑(为什么有人说是变模糊了呢= =、百思不得其解中…)。

VB6 GDI+ 入门教程[3] 笔、刷子、矩形、椭圆绘制的更多相关文章

  1. VB6 GDI+ 入门教程[2] GDI+初始化

    http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[2] GDI+初始化 2009 年 6 月 18 日 7 ...

  2. VB6 GDI+ 入门教程[5] 基础绘图小结

    http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[5] 基础绘图小结 2009 年 6 月 18 日 4条 ...

  3. VB6 GDI+ 入门教程[6] 图片

    http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[6] 图片 2009 年 6 月 19 日 15条评论 ...

  4. VB6 GDI+ 入门教程[9] Bitmap魔法(2):数据读写

    本文转自 http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[9] Bitmap魔法(2):数据读写 200 ...

  5. VB6 GDI+ 入门教程[1] GDI+介绍

    http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[1] GDI+介绍 2009 年 6 月 18 日 17 ...

  6. VB6 GDI+ 入门教程[4] 文字绘制

    http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[4] 文字绘制 2009 年 6 月 18 日 7条评论 ...

  7. VB6 GDI+ 入门教程[7] Graphics 其他内容

    http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[7] Graphics 其他内容 2009 年 9 月 ...

  8. VB6 GDI+ 入门教程[8] Bitmap魔法(1):创建

    http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[8] Bitmap魔法(1):创建 2009 年 9 月 ...

  9. CAD制图初学入门教程:怎么在CAD中绘制箭头

    在接触CAD的时候大家有没有和小编一样感觉无所适从,所以下面就来和大家分享一个CAD制图初学入门教程,在CAD中绘制箭头.在CAD图形上进行标注内容的时候一般都会使用箭头来进行指示,那具体怎么在CAD ...

随机推荐

  1. JAVA获取密钥公钥的keytool的使用

    一.keytool的概念 keytool 是个密钥和证书管理工具.它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务.在 ...

  2. 2016 Al-Baath University Training Camp Contest-1 I

    Description It is raining again! Youssef really forgot that there is a chance of rain in March, so h ...

  3. 2016年6月25日 星期六 --出埃及记 Exodus 14:22

    2016年6月25日 星期六 --出埃及记 Exodus 14:22 and the Israelites went through the sea on dry ground, with a wal ...

  4. java-以月为单位,得到一年中某一个月份的范围

    简单说:得到某一月份的第一天,第一小时,第一分钟,第一秒和某一月份的最后一天,最后一小时,最后一分钟,最后一秒. 实现: //月初 private Date getBeginTimeOfMonth(i ...

  5. python学习笔记四 迭代器,生成器,装饰器(基础篇)

    迭代器 __iter__方法返回一个迭代器,它是具有__next__方法的对象.在调用__next__方法时,迭代器会返回它的下一个值,若__next__方法调用迭代器 没有值返回,就会引发一个Sto ...

  6. (6)redis 事务

    redis对事务的支持目前还比较简单.redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令. 由于redis是单线程来处理所有client的请求的所 ...

  7. MySql使用show processlist查看正在执行的Sql语句

    今天上班例行的查看了下服务器的运行状况,发现服务器特卡,是mysqld这个进程占用CPU到了99%导致的. 比较好奇是那个程序在使用mysql导致cpu这么高的,通过show processlist命 ...

  8. [转老马的文章]MODI中的OCR模块

    作者:马健邮箱:stronghorse_mj@hotmail.com发布:2012.07.02更新:2012.07.09补充非简体中文版内容 自从基于MODI的DjVuToy.FreePic2Pdf. ...

  9. 序列化、反序列化(实体类或要序列化的对象类必须实现Serializable接口)

    package com.phone.shuyinghengxie; import java.io.Serializable; /* 一个类的对象要想序列化成功,必须满足两个条件: 该类必须实现 jav ...

  10. [Effective Java]第二章 创建和销毁对象

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...