如何从单击事件调用绘制方法
本文关键字:调用 绘制 方法 事件 单击 | 更新日期: 2023-09-27 18:05:08
我遇到的问题是,如果我试图在button1_Click方法中使用它们,我无法获得"e.g graphics"代码行。因此,我构造了"Paint"方法。现在我似乎不能从按钮Click事件调用Paint方法。有办法做到这一点吗?我还没能找到一个方法来解决这个问题。或者,是否有一种方法可以在"button1_Click"方法中执行e.Graphics函数?
谢谢
public void button1_Click(object sender, EventArgs e)
{
CrochetPtrnDesign_Paint(this, ?);
}
private void CrochetPtrnDesign_Paint(object sender, PaintEventArgs e)
{
Rectangle rect = new Rectangle(5, 5,
ClientSize.Width - 10, ClientSize.Height - 10);
e.Graphics.DrawRectangle(Pens.Red, rect);
using (Font font = new Font("Times New Roman", 16, GraphicsUnit.Pixel))
{
using (StringFormat sf = new StringFormat())
{
// Middle.
sf.LineAlignment = StringAlignment.Center; // Middle.
// Middle/Center.
sf.Alignment = StringAlignment.Center; // Center.
e.Graphics.DrawString("Middle/Center", font, Brushes.Black, rect, sf);
}
}
案例一:绘图到Controls
:
如果Paint
事件实际上是连接到,而不仅仅是您复制的一段代码,这将完成工作:
public void button1_Click(object sender, EventArgs e)
{
CrochetPtrnDesign.Invalidate();
}
更新:因为我们现在知道CrochetPtrnDesign
是Form
,所以简单地写:this.Invalidate();
!
如果对勾搭有疑问,请阅读这篇文章!
请注意,创建真正有效的PaintEventArgs
应该只由系统来完成。
情况二:绘制位图:
要绘制Bitmap
,您还需要一个有效的Graphics
对象,但您必须自己创建它:
void DrawStuff(Bitmap bmp)
{
using (Graphics g = Graphics.FromImage(bmp))
{
// draw your stuff
g.DrawRectangle(...);
}
// when done maybe assign it back into a Control..
pictureBox.Image = bmp;
}
更新:
将位图分配给pictureBox.Image
将有效,但有泄漏先前图像的风险。为了避免这种情况,您可以使用故障安全方法,可能像这样:
void SetImage(PictureBox pb, Bitmap bmp)
{
if (pb.Image != null)
{
Bitmap tmp = (Bitmap)pb.Image;
pb.Image = null;
tmp.Dispose();
}
pb.Image = bmp;
}
如果我试图在button1_Click方法
中使用"e.Graphics"行代码,则无法使其工作。
这是故意的。你不应该在处理Click
事件时绘制任何东西。因此,调用Paint
事件处理程序至少是不方便的。
Click
的同时调用Invalidate()
,然后让Windows决定何时调用Paint
事件处理程序。如果由于Click
事件的结果应该绘制不同的东西,那么Click
事件处理程序应该更新您的数据来指示这一点,以便稍后当Paint
事件处理程序被调用时,它确切地知道当时要绘制什么。