5-2 绘图工具类
本节学习目标:
n
掌握绘图基本类的使用
n
掌握绘制线条、形状和文本的基本方法
n
灵活使用画刷画笔
n
灵活运用颜色
5-2-1 Pen类
画笔,绘画工具,可以设置笔的颜色,线条的粗细和线条的样式(实线虚线等)。笔是绘画的工具,Graphics对象是绘画的场所,这样,我们就可以在允许的界面上绘制各种图形。
1.案例学习:在窗体上画出各种形状
本次实验目标是使用图形与画笔类直接在窗体上绘制基本形状。
u
实验步骤(1):
新建项目:windows应用程序,添加一个Button控件,单击按钮时,在窗体正中画一条和窗体相同长度的直线。
u
实验步骤(2):
用鼠标双击“直线”按钮,进入按钮单击事件的事件处理程序,画一条与窗体相同宽度的直线,画笔颜色为黑色,线宽默认为1。代码加下:
private void
button1_Click(object sender, EventArgs e)
{
Graphics g = this.CreateGraphics();
Pen p = new Pen(Color.Black);
g.DrawLine(p, 0, this.Height / 2, this.Width, this.Height / 2);
p.Dispose();
g.Dispose();
}
|
u
实验步骤(3):
用鼠标双击“矩形”按钮,进入代码编辑器,画一个宽100高200的矩形(单位:像素)。代码加下:
g.DrawRectangle(p, 50, 50, 200, 100);
|


图
5-1
画基本形状
u
实验步骤(4):
用鼠标双击“圆形”按钮,进入代码编辑器,画一个半径为50像素的圆,代码如下:
g.DrawEllipse(p, 50, 50, 100, 100);
|
画圆的方法为DrawEllipse,参数需指定一个矩形区域,在该范围内画一个椭圆,如果矩形区域为正方形,即参数3=参数4,则画出的是一个圆。
问题讨论:
1
、
DrawXXX()
方法的使用
这里只是一个简单的例子,其中参数中各整数分别代表什么,是否能使用其它类型替换?每种
DrawXXX
方法都有几种重载形式,其中的参数既可以是整数指定的像素单位,也可以是浮点数指定的像素单位。如果不确定具体的像素单位,可以通过矩形(
Rectangle
)或点类型(
Point
)来设置。
2
、图形类的
Dispose()
方法
为什么每画完一个图形都要调用
Dispose
方法?在什么情况下需调用
Dispose
方法?
通过
Create
方法创建了
Graphics
对象,就需要使用
Dispose
方法来释放资源,也可以配合
using
语句使用,
释放资源很重要。使用
using
语句块,例
using
(Graphics g = this.CreateGraphics())
{
g.DrawEllipse();
}
|
2.案例学习:在窗体上画出圆柱体
本次实验目标是使用DrawXXX方法绘制出立体效果。类库中没有直接能够绘制三维图形的方法,因此我们在编程时需利用平面图形方法绘制出三维效果,就像在纸上画出三维图形一样:如果我们画一个圆柱体,那么圆柱体的上底面需绘制为椭圆,下底面的后面被挡住的部分使用虚线或者不画出。
u
实验步骤(1):
本实验的目的是在窗体上画一个圆柱体。在某窗体上放置一个Button按钮,编写代码如下所示:
private
void button4_Click(object sender, EventArgs e)
{
int height = this.ClientSize.Height - 100;
int width = this.ClientSize.Width - 50;
int vHeigth = 200;
int vwidth = 100;
Graphics g = this.CreateGraphics();
g.Clear(Color.White);
Pen pen = new Pen(Color.Gray);
SolidBrush brush = new SolidBrush(Color.Gainsboro);
for (int i = height / 2; i > 0; i--)
{
g.DrawEllipse(pen, width / 2, i, vHeigth, vwidth);
}
g.FillEllipse(brush, width / 2, 0, vHeigth, vwidth);
}
|
使用深灰色画笔连续画若干个大小相等,横坐标相同、纵坐标不同的椭圆,最后使用浅灰色笔刷在最上层覆盖一个椭圆作为圆柱体的上底面。

图5-2 圆柱体
注意:
循环语句的结束位置和最后绘制上底面的位置必须相同,否则图形不能重叠,不能画出圆柱体的效果。
|
5-2-2 Brush类
画刷,填充工具,用于填充图形。该类是一个抽象基类,不能直接实例化,可以通过派生类设置笔刷的样式、颜色,线条的粗细。这里所谓的区域即在什么范围内使用画刷。
名称
|
说明
|
ImageBrush
|
图像绘制区域
|
线性渐变绘制区域
| |
径向渐变绘制区域,焦点定义渐变的开始,椭圆定义渐变的终点
| |
SolidColorBrush
|
单色绘制区域
|
视频内容绘制区域
|
表5-4 Brush类的派生类
1.案例学习:在窗体上给各种形状填充不同的颜色
本次实验目标是使用图形与画刷类给窗体上的基本形状填充颜色。
u
实验步骤(1):
填充矩形,直接使用画笔作为笔刷,红色单色刷。添加功能源代码如下所示:
Pen p = new Pen(Color.Red ,3);//设置笔刷的宽度
Brush b=p.Brush;
Rectangle r = new Rectangle(50,50,200,100);
g.FillRectangle(b,r);
|
u
实验步骤(2):
用线性渐变画刷绘制圆形,修改代码加下:
Rectangle
r = new Rectangle(150, 50, 200, 200);
LinearGradientBrush
brush = new LinearGradientBrush(r, Color.Orange, Color.Purple, 90);
g.FillEllipse(brush, r);
|

图5-3 渐变笔刷
问题讨论:
1
、
创建矩形对象时,构造函数的参数分别代表什么?
前两个参数是指左上角的坐标(横,纵),后两个参数分别是矩形的宽度与高度。
|
在使用绘图工具类是多次用到颜色,颜色的获取可以直接在枚举值中找到相符的颜色,或者从RGB(显示器的颜色系统采用常见的加色法,即所有颜色由红绿蓝三色由不同比例组合而成)数值直接获取,在使用FromArgb方法时,直接设置目标颜色的RGB数值,整数取值范围0-255。
5-2-3 Font类
绘制文本时,可设置字体的样式,字体的大小,以及字体的种类。还可以通过图形对象,在窗体或控件上直接画出,调用Graphics类DrawString方法。在调用方法前需先设置字体的选项。需要注意的是,不同的字体绘制出的文本宽度不同。

图
5-4
在窗体上绘制字体
小实验:在窗体上直接写出“Windows应用程序设计”,使用隶书、斜体,调整汉字显示的位置,修改源代码:
Font f = new Font("隶书",24,FontStyle.Italic);
Pen p = new Pen(Color.Blue);
g.DrawString("Windows应用程序设计",f, p.Brush,50,50);
|
课堂练习:使用线性渐变笔刷在窗体上写出艺术字效果。
5-2-4 坐标平移与缩放
我们看到,前面的例子都是默认以绘图界面的左上角作为原点,坐标值以像素为单位,画图以左上角为参照点,绘制每一点都要重新计算,并不方便。因此可以使用Graphics类中对于坐标系统操作的几个方法进行坐标变换。
1.案例学习:坐标平移
简单改变坐标原点,在不同位置调用相同方法绘制图形。添加功能源代码如下所示:
///
<summary>
/// 新绘制界面时候
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form4_Paint(object sender, PaintEventArgs e)
{
Graphics g = this.CreateGraphics();
g.Clear(Color.White);
Pen myPen = new Pen(Color.Red, 3);
g.DrawRectangle(myPen, 0, 0, 200, 100);
g.DrawEllipse(myPen, 0, 0, 200, 100);
g.Dispose();
myPen.Dispose();
}
///
<summary>
/// 坐标移动
/// </summary>
private void button1_Click(object sender, EventArgs e)
{
Graphics g = this.CreateGraphics();
g.Clear(Color.White);
Pen myPen = new Pen(Color.Red, 3);
g.TranslateTransform(30, 120);
g.DrawRectangle(myPen, 0, 0, 200, 100);
g.DrawEllipse(myPen, 0, 0, 200, 100);
g.Dispose();
myPen.Dispose();
}
|

图
5-5
坐标平移
2. 案例学习:坐标缩放案例
改变两个坐标轴向上的缩放比例,将横轴放大1.5倍,纵轴放大2倍。功能源代码如下所示:
///
<summary>
/// 坐标缩放
/// </summary>
private void button1_Click(object sender, EventArgs e)
{
Graphics g = this.CreateGraphics();
g.Clear(Color.White);
Pen myPen = new Pen(Color.Red, 3);
g.ScaleTransform(1.5, 2);// 将横轴放大1.5倍,纵轴放大2倍
g.DrawRectangle(myPen, 0, 0, 200, 100);
g.DrawEllipse(myPen, 0, 0, 200, 100);
g.Dispose();
myPen.Dispose();
}
|
为了看得清楚,先将坐标轴平移之后进行缩放,相同的绘制图形代码,坐标缩放之后能看到图形也随着缩放。

图
5-6
坐标缩放
本文转自 qianshao 51CTO博客,原文链接:http://blog.51cto.com/qianshao/217431,如需转载请自行联系原作者