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

        }
    }

  • 相关阅读:
    shl and shr
    清空和填充內存
    php 中instanceof的使用
    HTTP错误代码大全
    临时关闭Mysql ONLY_FULL_GROUP_BY
    php 中instanceof的使用
    Laravel Eloquent ORM 时如何查询表中指定的字段
    vagrant在windows下的使用
    下载配置python tornado web window7 开发笔记1:环境搭建
    运行确认怎么用vnc访问自己电脑,并且同时又是同一个会话?
  • 原文地址:https://www.cnblogs.com/teyond/p/OptimizedDoubleBuffer.html
Copyright © 2011-2022 走看看