5-2 绘图工具类

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):
用鼠标双击“矩形”按钮,进入代码编辑器,画一个宽100200的矩形(单位:像素)。代码加下:
    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

绘制文本时,可设置字体的样式,字体的大小,以及字体的种类。还可以通过图形对象,在窗体或控件上直接画出,调用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   坐标缩放




本文转自 qianshao 51CTO博客,原文链接:http://blog.51cto.com/qianshao/217431,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值