2011-11-29 69 views
0

我正在使用面板绘制圆形等形状,但问题是,当我改变标签或最小化程序&然后最大化程序,然后绘制的每个东西都被删除。任何人都可以告诉我是什么原因?如何在Windows窗体的面板中绘制形状?

+0

在哪个事件中您正在绘制哪个对象? – Nighil

回答

0

原因是控制失效,然后重绘。
您应该捕获Paint事件并重新绘制面板内所需的所有内容。
每次控制必须(部分完全)重新绘制时,会触发此事件。

用户评论后编辑:
当你的用户绘制的东西,你可以在形状(种类和各种coords)使用存储在List和上Paint事件,重绘列表中包含的从上到下的一切。

+0

例如,我的程序的用户画5圈,并最小化程序,然后最大化后他将不得不重绘圈? – Desire

+0

使用公共覆盖OnPaint(...你也应该考虑一个缓冲区,就像绘制一个位图并将其重画到屏幕上(所以当你添加,删除或改变它们时,你只需重绘你的形状)。重写OnPaintBackground以停止闪烁 – James

+0

@Aqib:简单的回答是肯定的如果控制失效(因为你隐藏了它或者其他控件超过了它),它必须重绘,你所做的一切都必须重做!! – Marco

0

您绘制的任何东西(默认情况下)都不具有持久性,并且可能会丢失任何有效的窗口部分(掩盖并揭开,最小化,UAC提示等等) 要解决此问题,您需要记住你需要在Paint事件中绘制并重画它

5

由于你没有发布任何代码,所以你会让所有的读者都猜出来,我的猜测是你很可能使用了CreateGraphics,这可能是一个错误

你的面板的绘画事件应该是这样的:

private void panel1_Paint(object sender, PaintEventArgs e) { 
    e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; 
    e.Graphics.FillEllipse(Brushes.Red, new Rectangle(10, 10, 32, 32)); 
} 

您在绘画事件中完成所有绘图。要强制刷新,请致电panel1.Invalidate()

如果绘制成位图,你可以处理这样的:

Bitmap bmp = new Bitmap(500, 500); 

private void button1_Click(object sender, EventArgs e) { 
    using (Graphics g = Graphics.FromImage(bmp)) { 
    g.SmoothingMode = SmoothingMode.AntiAlias; 
    g.Clear(Color.White); 
    g.FillEllipse(Brushes.Red, new Rectangle(10, 10, 32, 32)); 
    } 
    panel1.Invalidate(); 
} 

private void panel1_Paint(object sender, PaintEventArgs e) { 
    e.Graphics.DrawImage(bmp, new Point(0, 0)); 
} 
0

缓冲这样的: (你可以跳过重画的形式,通过形式负载迫使较大的位图调整。)

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

namespace WindowsFormsApplication10 
{ 
    public partial class Form1 : Form 
    { 
     Bitmap bitmap = null; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      Redraw(); 
     } 

     protected override void OnPaintBackground(PaintEventArgs e) 
     { 
      OnPaint(e); 
     } 

     protected override void OnPaint(PaintEventArgs e) 
     { 
      if (bitmap == null) 
      { 
       base.OnPaint(e); 
      } 
      else 
      { 
       e.Graphics.DrawImageUnscaled(bitmap, 0, 0); 
      } 
     } 

     private void Form1_Resize(object sender, EventArgs e) 
     { 
      Redraw(); 
     } 

     private void Form1_ResizeEnd(object sender, EventArgs e) 
     { 
      Redraw(); 
      this.Invalidate(); 
     } 

     private void Redraw() 
     { 
      if (bitmap != null) 
      { 
       bitmap.Dispose(); 
       bitmap = null; 
      } 
      bitmap = new Bitmap(this.Width, this.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 
      using (Graphics g = Graphics.FromImage(bitmap)) 
      { 
       g.Clear(Color.White); 
       // This is where you could use a List<Shape> etc... 
       g.DrawEllipse(Pens.Black, new Rectangle(10, 10, 20, 20)); 
       g.DrawEllipse(Pens.Black, new Rectangle(20, 30, 20, 20)); 
       g.DrawEllipse(Pens.Black, new Rectangle(50, 90, 30, 20)); 
      } 

     } 



    } 
}