C# GDI+编程

窗口刷新的时候,会产生Paint事件,那么我们给这个事件添加一个处理函数。然后在这个函数里画图。就能保证所画的图不被刷新掉,

它可以总是显示。Paint事件对应的委托是:public delegate void PaintEventHandler(object sender, PaintEventArgs e);

示例1:在窗口中间画一根线。(创建WindowsForms应用程序)

            Graphics g = this.CreateGraphics();
            Pen p = new Pen(Color.Black);
            //在屏幕中间画一根线
            g.DrawLine(p, 0, this.Height / 2, this.Width, this.Height / 2);
            //画一个矩形
            g.DrawRectangle(p, 50, 50, 200, 100);
            //画一个圆
            g.DrawEllipse(p, 150, 150, 100, 100);
            //手动释放资源
            g.Dispose();
            p.Dispose();        

示例2:一个填充矩形

        private void formPaint(Object sender, PaintEventArgs e)
        {
            Graphics graphics = e.Graphics;
            //蓝色画刷
            SolidBrush brush = new SolidBrush(Color.FromArgb(0, 0, 255));
            //一个矩形
            Rectangle rect = new Rectangle(0, 0, 100, 100);
            //填充一个矩形
            graphics.FillRectangle(brush, rect);
        }

示例3:画一张png图片(用PNG是因为可以显示透明的图片,GIF图片也有这个作用)

        private void formPaint(Object sender, PaintEventArgs e)
        {
            Graphics graphics = e.Graphics;
            //加载图片
            Image img = Image.FromFile(Application.StartupPath+ @"\111.png");
            //图片显示起始位置
            Point strPoint=new Point(50,50);
            //不限制大小绘制
            graphics.DrawImage(img, strPoint);
            //缩小图片绘制,限制在一个矩形内
            Rectangle rect=new Rectangle(50,50,100,100);
            graphics.DrawImage(img, rect);
        }

示例4:用DrawString显示文字

DrawString在Grahpics类里有好几个重载,有的可以让字符串在一个矩形内显示,有的可以使用特定的显示格式。这里就不做详细介绍了。

只讲比较常用的。

看例子吧,处理键盘输入字符事件,在窗口显示输入的字符。如下:

    public partial class Form2 : Form
    {
        public static String strText = "";
        public Form2()
        {
            InitializeComponent();
            this.Paint += formPaint;
        }
        private void formPaint(Object sender, PaintEventArgs e)
        {
            Graphics graphics = e.Graphics;
            //创建画刷
            SolidBrush brush=new SolidBrush(Color.FromArgb(0,255,0));
            //创建字体
            Font font=new Font("宋体",20f);
            //显示字符串,在一个矩形内
            graphics.DrawString(strText, font, brush, this.ClientRectangle);
         
        }
        private void Form2_MouseDown(object sender, MouseEventArgs e)
        {
            strText += e.Button.ToString();
            //刷新整个窗口
            this.Invalidate();
        }
    }

 效果图如下:

示例5:重写OnPaintBackground绘制背景的方法

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //重写OnPaintBackground方法
        protected override void OnPaintBackground(PaintEventArgs e)
        {
            //禁止基类处理,我们自己来绘制背景
            //base.OnPaintBackground(e);
            //透明背景画刷
            SolidBrush brush=new SolidBrush(Color.Transparent);
            //填充整个窗口
            e.Graphics.FillRectangle(brush,this.ClientRectangle);
            //再画一个圆圈
            Pen pen = new Pen(Color.FromArgb(0, 255, 0),3);
            e.Graphics.DrawEllipse(pen, this.ClientRectangle);
        }
    }

示例6:TextureBursh图片画刷

可以用图片来填充一个形状,如矩形,圆形。图片不够大则平铺显示。

private void formPaint(Object sender, PaintEventArgs e)
        {
            Graphics graphics = e.Graphics;
            //创建图片画刷
            Rectangle rect = new Rectangle(10, 10, 70, 70);
            TextureBrush brush = new TextureBrush(Image.FromFile(Application.StartupPath+ @"\111.png"),rect); 
       graphics.FillEllipse(brush,
0, 0, 200, 200);
     }

构造函数最后一个参数,rect表示要用图片的哪部分进行填充,10,10表示图片起始位置(左上角),70,70表示宽度和高度,注意不能超出图片原有范围。整张图片填充的话,则不需要指定rect。构造函数里填一个参数就行了。

posted @ 2017-10-16 22:22  凉城旧巷旧少年  阅读(426)  评论(0编辑  收藏  举报