现在的位置: 首页 > 综合 > 正文

双缓冲画线示例

2012年09月14日 ⁄ 综合 ⁄ 共 2985字 ⁄ 字号 评论关闭

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
   
    public partial class DrawLine : UserControl
    {
        public delegate void DrawChangeDataDelegate(ref string data);

        [Description("Callback event for the ChangeData window")]
        public event DrawChangeDataDelegate DrawChangeData;
        private BufferedGraphicsContext context;
        private BufferedGraphics grafx;
        public DrawLine()
        {
            InitializeComponent();
            SetStyle(ControlStyles.UserPaint,true );
            SetStyle(ControlStyles.ResizeRedraw,true );
            SetStyle(ControlStyles.OptimizedDoubleBuffer ,true );
            context = BufferedGraphicsManager.Current;
            context.MaximumBuffer = new Size(this.Width + 1, this.Height + 1);
            grafx = context.Allocate(this.CreateGraphics(), new Rectangle(0, 0, this.Width, this.Height));
            DrawToBuffer(grafx.Graphics );
        }
        private void DrawToBuffer(Graphics g)
        {
            string data=string.Empty ;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            g.DrawLine(new Pen (Color.White ),new Point (3,3),new Point (this.Width-3,this.Height-3));
            if (DrawChangeData != null)
                DrawChangeData(ref data);
            using (Font ft = new Font("Arial", 8f, FontStyle.Regular))
                g.DrawString(data,ft,new SolidBrush (Color.White ),new PointF (3,3));
        }
        protected override void OnResize(EventArgs e)
        {
            context.MaximumBuffer = new Size(this.Width +1,this.Height +1);
            if(grafx !=null)
            {
                grafx.Dispose ();
                grafx=null;
            }
            grafx = context.Allocate(this.CreateGraphics(), new Rectangle(0, 0, this.Width, this.Height));
            DrawToBuffer(grafx.Graphics);
            base.OnResize(e);
        }      
        protected override void OnPaint(PaintEventArgs e)
        {
            System.Diagnostics.Debug.WriteLine(string.Format ("MousePosition:{0}", MousePosition ));
            DrawToBuffer(grafx.Graphics);
            grafx.Render(e.Graphics );
        }
        protected override void OnMouseEnter(EventArgs e)
        {
           
            context.MaximumBuffer = new Size(this.Width + 1, this.Height + 1);
            if (grafx != null)
            {
                grafx.Dispose();
                grafx = null;
            }
            grafx = context.Allocate(this.CreateGraphics(), new Rectangle(0, 0, this.Width, this.Height));
            DrawToBuffer(grafx.Graphics);
            base.OnMouseEnter(e);
        }
        protected override void OnMouseLeave(EventArgs e)
        {
         
            context.MaximumBuffer = new Size(this.Width + 1, this.Height + 1);
            if (grafx != null)
            {
                grafx.Dispose();
                grafx = null;
            }
            grafx = context.Allocate(this.CreateGraphics(), new Rectangle(0, 0, this.Width, this.Height));
            DrawToBuffer(grafx.Graphics);
            base.OnMouseLeave(e);
        }

    }
}

抱歉!评论已关闭.