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

        }
    }

  • 相关阅读:
    9天C#转Java学习过程,自己记录一下
    【分享】我们用了不到200行代码实现的文件日志系统,极佳的IO性能和高并发支持,附压力测试数据
    微信公众号第三方平台开发坑
    分享我们团队最近开发的微信公众号运营助手,可以在手机上回复粉丝留言
    分享一波会眨眼的壁纸
    idea连接服务器上传jar并运行
    ngnix简单使用
    IntelliJ IDEA简介及简单操作
    eclipse开发创建web项目
    myeclipse/eclipse 配置SSM框架错误之一解决方法
  • 原文地址:https://www.cnblogs.com/teyond/p/OptimizedDoubleBuffer.html
Copyright © 2011-2022 走看看