如何在C#中绘制面板?

嘿,我需要在C#中绘制一个面板,但是没有将我的绘图代码放在“panel1_Paint”中,我该怎么做? 顺便说一下,我正在使用WinForms。

更新 :我忘记了清楚,我不需要将绘图代码放在绘图处理程序中,因为我需要根据按钮的事件开始绘图。

通常,您在绘图事件处理程序中执行所有绘图。 如果要进行任何更新(例如,如果用户单击面板),则必须推迟该操作:存储所需数据(用户单击的坐标)并强制重绘控件。 这会导致paint事件被触发,然后您可以在其中绘制之前存储的内容。

另一种方法是(如果你真的想在’panel1_Paint’事件处理程序之外绘制)在缓冲区图像内绘制,并将图像复制到paint事件处理程序中的控件图形对象。

更新:

一个例子:

public class Form1 : Form { private Bitmap buffer; public Form1() { InitializeComponent(); // Initialize buffer panel1_Resize(this, null); } private void panel1_Resize(object sender, EventArgs e) { // Resize the buffer, if it is growing if (buffer == null || buffer.Width < panel1.Width || buffer.Height < panel1.Height) { Bitmap newBuffer = new Bitmap(panel1.Width, panel1.Height); if (buffer != null) using (Graphics bufferGrph = Graphics.FromImage(newBuffer)) bufferGrph.DrawImageUnscaled(buffer, Point.Empty); buffer = newBuffer; } } private void panel1_Paint(object sender, PaintEventArgs e) { // Draw the buffer into the panel e.Graphics.DrawImageUnscaled(buffer, Point.Empty); } private void button1_Click(object sender, EventArgs e) { // Draw into the buffer when button is clicked PaintBlueRectangle(); } private void PaintBlueRectangle() { // Draw blue rectangle into the buffer using (Graphics bufferGrph = Graphics.FromImage(buffer)) { bufferGrph.DrawRectangle(new Pen(Color.Blue, 1), 1, 1, 100, 100); } // Invalidate the panel. This will lead to a call of 'panel1_Paint' panel1.Invalidate(); } } 

现在绘制的图像即使在重绘控件之后也不会丢失,因为它只绘制缓冲区(图像,保存在内存中)。 此外,只需绘制到缓冲区中,您就可以在事件发生时随时绘制内容。

试试这个:当您使用另一个覆盖部分或全部窗口的应用程序后,当您返回应用程序时会发生什么?

你应该做的是渲染你需要的屏幕外位图,称为缓冲区。 您可以随时渲染图像,以响应任何更改图像应显示的内容。 然后,从面板的绘制事件中,您将从该缓冲区复制到面板。

图形编程很有趣。 看起来似乎有很多细节要考虑,但是一旦你学会了它们就没有多少。 但是这是一个slapdash方法将会显示的领域,并且可以使应用程序感觉非常不可靠和不专业。