Lis*_*isa 6 c# drawing winforms
嘿,我需要在C#的面板上绘图,但是没有将我的绘图代码放在"panel1_Paint"中,我怎么能这样做?顺便说一下,我正在使用WinForms.
更新:我忘记了清楚,我不需要将绘图代码放在绘图处理程序中,因为我需要根据按钮的事件开始绘图.
Phi*_*ier 13
通常,您在绘图事件处理程序中执行所有绘图.如果要进行任何更新(例如,如果用户单击面板),则必须推迟该操作:存储所需数据(用户单击的坐标)并强制重绘控件.这会导致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();
}
}
Run Code Online (Sandbox Code Playgroud)
现在绘制的图像即使在重绘控件之后也不会丢失,因为它只绘制缓冲区(图像,保存在内存中).此外,只需绘制到缓冲区中,您就可以在事件发生时随时绘制内容.