zoukankan      html  css  js  c++  java
  • 双缓冲画线示例

    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);
            }

        }
    }

  • 相关阅读:
    今天是全面开发的第一天,特此纪念
    Linux 进程管理 (ZZ)
    骑车上班
    VSFTPD配置小结(一)
    Flash Builder 4 在Chrome的调试
    测试一下Windows Live Writer
    转:C++强大的背后
    转:Flex中的Image屬性 (width, contentWidth, content.width)的差異
    Flash Builder 4 安装提示“安装程序检测到计算机重新启动操作可能处于挂起状态“的解决
    使用简单工厂和State模式替换冗余的 switchcase 语句
  • 原文地址:https://www.cnblogs.com/teyond/p/OptimizedDoubleBuffer.html
Copyright © 2011-2022 走看看