5-2  绘图工具类<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

本节学习目标:

n 掌握绘图基本类的使用
n 掌握绘制线条、形状和文本的基本方法
n 灵活使用画刷画笔
n 灵活运用颜色

<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />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):

用鼠标双击“矩形”按钮,进入代码编辑器,画一个宽100200的矩形(单位:像素)。代码加下:
    g.DrawRectangle(p, 50, 50, 200, 100);                 

    

5-1 画基本形状

u       实验步骤(4):

用鼠标双击“圆形”按钮,进入代码编辑器,画一个半径为50像素的圆,代码如下:

            g.DrawEllipse(p, 50, 50, 100, 100);

画圆的方法为DrawEllipse,参数需指定一个矩形区域,在该范围内画一个椭圆,如果矩形区域为正方形,即参数3=参数4,则画出的是一个圆。
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /> 问题讨论:

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

绘制文本时,可设置字体的样式,字体的大小,以及字体的种类。还可以通过图形对象,在窗体或控件上直接画出,调用GraphicsDrawString方法。在调用方法前需先设置字体的选项。需要注意的是,不同的字体绘制出的文本宽度不同。

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  坐标缩放