我正在使用面板绘制像圆形的形状,但问题是当我更改标签或最小化程序&然后最大化程序,然后删除所有绘制的东西。谁能告诉我是什么原因?
答案 0 :(得分: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));
}
答案 1 :(得分:0)
原因是控制失效然后重新绘制
您应该抓住Paint
事件并重新绘制面板内所需的所有内容
每次必须(部分完全)重绘控件时都会触发此事件。
用户评论后编辑:
当您的用户绘制某些内容时,您可以在List
和Paint
事件中存储形状(类型和各种坐标),从上到下重绘列表中包含的所有内容。
答案 2 :(得分:0)
你绘制的任何东西(默认情况下)都不是持久的,并且可能会丢失任何一个窗口部分无效(覆盖它并发现,最小化,UAC提示等等)。
要解决这个问题,您需要记住在Paint
事件中绘制和重绘的内容。
答案 3 :(得分: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));
}
}
}
}