【发布时间】:2011-11-29 14:27:54
【问题描述】:
我正在使用面板绘制圆形等形状,但问题是当我更改选项卡或最小化程序然后最大化程序时,所有绘制的东西都会被删除。谁能告诉我是什么原因?
【问题讨论】:
-
你在画哪个对象的哪个事件?
标签: c# winforms visual-studio-2010
我正在使用面板绘制圆形等形状,但问题是当我更改选项卡或最小化程序然后最大化程序时,所有绘制的东西都会被删除。谁能告诉我是什么原因?
【问题讨论】:
标签: c# winforms visual-studio-2010
由于您没有发布任何代码,因此您让所有读者都在猜测。我的猜测是您最有可能使用 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));
}
【讨论】:
您绘制的任何内容(默认情况下)都不是持久的,并且可能会丢失任何使窗口的一部分无效(将其覆盖并发现、最小化、UAC 提示等)。
为了解决这个问题,您需要记住在Paint 事件中需要绘制和重绘的内容。
【讨论】:
原因是控件失效,然后重绘。
您应该捕获 Paint 事件并在面板内重绘您需要的所有内容。
每次必须(部分或完全)重绘控件时都会触发此事件。
用户评论后编辑:
当您的用户绘制某些东西时,您可以将形状(类型和各种坐标)存储在 List 中,并在 Paint 事件中从上到下重绘列表中包含的所有内容。
【讨论】:
像这样缓冲: (您可以通过在表单加载中强制使用更大的位图来跳过表单调整大小的重绘。)
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));
}
}
}
}
【讨论】: