vb.net GDI+入门——画笔、画刷和颜色

GDI是Graphics Device Interface的缩写,含义是图形设备接口,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。顾名思义,GDI+就是GDI得增强版本,在.net构架中,我们可以通过GDI+来实现图形图像的编程。

在绘画的时候,画家需要使用画笔或者画刷来把不同的颜色涂抹到画布上,而我们在对图形图像进行编程的时候,也是通过画笔和画刷把不同的颜色输出到屏幕上。

画笔是 Pen 类的实例,用于绘制线条和空心形状;画刷是从 MustInherit(抽象)Brush 类派生的任何类的实例,可用于填充形状或绘制文本;Color(颜色) 对象是表示特定颜色的类的实例,画笔和画刷可使用这些对象来指示所呈现图形的颜色。

一、颜色

在图像绘制中,最重要的就是颜色,.NET Framework 的 Color 结构用于表示不同的颜色。

1、系统定义的颜色

我们可以通过 Color 结构访问vb.net中枚举的若干系统定义的颜色,例如我们可以通过如下方式获取系统颜色

Dim myColor as Color

myColor = Color.Red

myColor = Color.Aquamarine

myColor = Color.LightGoldenrodYellow

myColor = Color.PapayaWhip

myColor = Color.Tomato

2、用户定义的颜色

我们除了可以访问系统定义好的颜色外,还可以使用 Color.FromArgb 方法来实现用户定义的颜色,使用 Color.FromArgb 方法时,我们按顺序指定颜色中红色、蓝色和绿色各部分的强度,如下所示:

Dim myColor as Color

myColor = Color.FromArgb(20,58,77)

色值中的每个数字均必须是从0到255之间的一个整数,其中0表示没有该颜色,而255则为所指定颜色的完整饱和度;因此,Color.FromArgb(0,0) 为黑色,而 Color.FromArgb(255,255,255) 为白色。

3、Alpha 混合处理(透明度)

Color.FromArgb 方法除了可以指定RGB(红、绿、蓝)三色,还有一个Alpha参数,Alpha 表示所呈现图形后面的对象的透明度,对于各种底纹和透明度效果很有用。

在 Color.FromArgb 方法中四个参数的第一个参数即是Alpha参数,取值范围是从 0 到 255 之间的任一整数。如下两例:

Dim myColor as Color

myColor = Color.FromArgb(127,20,77)

创建自定义颜色,且大致为 50% 透明度。

Dim myColor as Color

myColor = Color.FromArgb(128,Color.Tomato)

创建系统定义的颜色 Tomato 的颜色,且约为 50% 透明度。
上面我们理解了如何在vb.net中实现我们需要的颜色,就如学画画的时候知道了怎么调配色彩,那么作画的时候还需要使用工具来把这些颜色涂抹在画布上构成我们需要的图案,这个工具就是画笔和画刷。

二、画笔

我们使用画笔来绘制线条、曲线以及勾勒形状轮廓。它是 Pen 类的实例,下面的示例说明如何创建一支红色的笔:

Dim myPen as New Pen(Color.Red)

一个实例化后的画笔就具有了宽度、样式、颜色三种属性,我们可以在创建画笔之后对它的这三种属性进行调整:

宽度(Width):使用该画笔时所绘线条的宽度,认的画笔宽度是一个像素单位;

样式(DashStyle):画笔绘制图形时的线型,包括实线、虚线、点线以及由点线与虚线组成的点划线、双点划线等多种样式;

颜色(Color):画笔绘制的线条的颜色,一般情况下我们是在创建画笔的时候就指定了画笔的颜色,但是也可以通过画笔的Color属性来改变。

下面示例演示如何创建并调整一个画笔的属性,然后绘制一条点划线。

首先在窗体上放置一个PictureBox 控件,一个按钮,把以下代码放到按钮的Click事件中:

Dim g As Graphics = Me.PictureBox1.CreateGraphics

Dim myColor As Color

myColor = Color.FromArgb(128,Color.Tomato)

Dim mPen As New Pen(myColor)

mPen.Color = Color.Red

mPen.Width = 3

mPen.DashCap = DashCap.Triangle

'指定划线的样式为点划线

mPen.DashStyle = DashStyle.DashDot

g.DrawLine(mPen,100,100)

运行后,单击按钮,我们可以看到如下的效果

三、画刷

画刷用于与 Graphics 对象一起创建实心形状和呈现文本的对象,有几种不同类型的画刷,如下所示:

Brush 说明
SolidBrush 画刷的最简单形式,它用纯色进行绘制。
HatchBrush 类似于 SolidBrush,但是该类使您可以从大量预设的图案中选择绘制时要使用的图案,而不是纯色。
TextureBrush 使用纹理(如图像)进行绘制。
LinearGradientBrush 使用沿渐变混合的两种颜色进行绘制。
PathGradientBrush 基于开发人员定义的唯一路径,使用复杂的混合色渐变进行绘制

1、使用纯色画刷

纯色画刷SolidBrush是指使用单一的颜色作为画刷的颜色,下面的示例说明如何在窗体上绘制一个纯红色的椭圆:

Dim g as Graphics = Me.CreateGraphics

Dim myBrush as New SolidBrush(Color.Red)

g.FillEllipse(myBrush,New RectangleF(0,150))

运行效果如下图所示:

2、简单图案

HatchBrush 使您可以从大量预设的图案中选择绘制时要使用的图案,而不是纯色。下面的示例说明如何创建一个 HatchBrush,它使用方格呢图案进行绘制,并使用红色作为前景色,蓝色作为背景色。

Dim g As Graphics = Me.PictureBox1.CreateGraphics

Dim myBrush As New System.Drawing.drawing2d.HatchBrush(System.Drawing.drawing2d.HatchStyle.Plaid,Color.Red,Color.Blue)

g.FillEllipse(myBrush,150,150))

运行后效果图如下:

3、复杂图案

纹理画笔 TextureBrush 通过使用图像作为图案来填充形状或文本。

下面的示例说明如何创建一个 TextureBrush,它使用名为 qqread.bmp 位于C盘下的图像进行绘制。

Dim g As Graphics = Me.PictureBox1.CreateGraphics

Dim myBrush As New TextureBrush(New Bitmap("C:\qqread.bmp"))

g.FillEllipse(myBrush,150))

运行后效果如下所示:

4、复杂底纹

渐变画笔支持复杂底纹。使用 LinearGradientBrush,可以创建沿线性渐变的两种颜色平滑、渐进式的混合。PathGradientBrush 支持许多更复杂的底纹和着色选项。下面的示例说明如何使用 LinearGradientBrush 笔刷实现由红色逐渐向黄色混合而形成的渐变。

Dim g As Graphics = Me.PictureBox1.CreateGraphics

Dim myBrush As New System.Drawing.drawing2d.LinearGradientBrush(ClientRectangle,Color.Yellow,System.Drawing.drawing2d.LinearGradientMode.Vertical)

g.FillEllipse(myBrush,150))

运行后效果如下图所示:

本文是针对GDI+编程的入门知识,我们绘制更复杂的图形都是在熟练运用这些知识的基础上的,下一步我们就去了解如何使用GDI+绘制线图。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr
今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBirthday, SecEmail, UserMob, UserSex, RealNameFirst, RealName, CheckCardID, CheckCardType, Contactemail
在VB6.0中,数据访问接口有三种: 1、ActiveX数据对象(ADO) 2、远程数据对象(RDO) 3、数据访问对象(DAO) 1.使用ADO(ActiveX Data Objec,ActiveX数据对象)连接SQL Server 1)使用ADO控件连接 使用ADO控件的ConnectionString属性就可以连接SQL Server,该属性包含一个由分号分隔的argument=value语
注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用。   特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如果电脑上有这些软件的话),因为现如今的360杀毒软件直接会对VB6.0软件误报,这样的话就可能会在安装过程中被误报阻止而导致安装失败,或者是安装后缺乏很多必须的组件(其它的杀毒软件或安全卫士之类的
Private Sub Form_Load() Call conndb End Sub Private Function conndb() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strCn, sql As String Dim db_host As String Dim db_user As String
  PPSM06S70:  Add  moddate  EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, ‘yyyy/mm/dd/HH24:MI AM‘)) ACTUAL_SHIPDATE   4.Test Scenario (1) :Query SQL Test DN:8016578337 SELECT CTRN.TKCTID TRUCK_ID,        
  沒有出現CrystalReportViewer時,須安裝CRforVS_13_0. 新增1個數據集,新增1個數據表,添加二列,列名要和資料庫名一樣. 修改目標Framework 修改app.config, <startup >改成<startup useLegacyV2RuntimeActivationPolicy ="true">  CrystalReport1.rpt增加數據庫專家 在表單
Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1() Dim i As Integer For i = 1 To 100 If Me.Label1.BackColor =
Friend Const PROCESS_ALL_ACCESS = &H1F0FFF = 2035711 Friend Const PROCESS_VM_READ = &H10 Friend Const PROCESS_VM_WRITE = &H20 Friend Const PAGE_READONLY = &H2 Friend Const PAGE_READWRITE = &H4 Friend
以下代码随手写的 并没有大量测试 效率也有待提升 如果需要C#的请自行转换 Function SplitBytes(Data As Byte(), Delimiter As Byte()) As List(Of Byte()) Dim i = 0 Dim List As New List(Of Byte()) Dim bytes As New
Imports System.Data.SqlClient Public Class Form1 REM Public conn1 As SqlConnection = New SqlConnection("server=.; Integrated Security=False;Initial Catalog= mydatabase1; User ID= sa;password")