閒着沒事,準備作一個相似於TeeChart的自定義控件,結果第一步的繪圖就把我給難倒了,雖然早就知道GDI繪圖的閃爍問題很坑,可是卻沒有想到如此之坑,折騰了兩天,才找到解決方法。緩存
首先在窗體加載的時候,加入雙緩存,說實話之前一直沒以爲這個雙緩存有什麼用,不過此次總算是有了點兒效果。ide
DoubleBuffered = true; SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint, true);
下面是一個例子,我準備畫一個簡單的座標系。這個方法會得到一個自定義的位圖,將這個位圖直接賦值給窗體的背景圖片,或者PictureBox控件也能夠。spa
/// <summary> /// 繪製界面 /// </summary> private Bitmap DrawGDI() { var bmp = new Bitmap(Width, Height); var pen = new Pen(Color.Black, 1.0f); Graphics g = Graphics.FromImage(bmp); var p1 = new Point(20, 10); var p2 = new Point(20, Height - 25); var p3 = new Point(Width - 10, Height - 25); g.DrawLines(pen, new[] { p1, p2, p3 }); g.DrawString("0", Font, Brushes.Black, 10, Height - 20); return bmp; }
我這裏是直接在重繪方法裏面給背景圖片直接賦值了。code
/// <summary> /// 重繪 /// </summary> protected override void OnPaint(PaintEventArgs e) { BackgroundImage = DrawGDI(); base.OnPaint(e); }
作完這些以後,我驚訝的發現GDI繪製出的圖竟然不閃了。固然了,這個方法的可移植性還不太清楚,歡迎你們討論。blog