我正在组合一个在 GUI 上使用多个图片框的应用程序。我已经为每个在绘画事件上调用的图片框编写了自定义事件。
不幸的是,当应用程序运行时,恰好一个图片框正确显示。其他的只是显示为白框。无论哪个 opicturebox 恰好首先添加到 form.designer 中,都是正确显示的图片框,对于其他图片框,它们的绘制事件永远不会触发。我试图通过在表单构造函数中调用picturebox.refresh()、picturebox.update() 和picturebox.invalidate() 的各种组合来解决这个问题,但无济于事。
有趣的是,当我将按钮按下事件与 picturebox.refresh() 和 picturebox.update() 相关联并在程序运行后按下按钮时,图片框开始正常运行 - 调用绘制事件并更新图像。
有谁知道如何让所有图片框在初始化时正确显示?
可能有用的代码片段:
图片框的绘制代码:
private void PictureBox1_Paint(object sender, PaintEventArgs e)
{
paintPictureBox(e, PictureBox1, currentImage[0]);
}
private void paintPictureBox(PaintEventArgs e, PictureBox picBox,ImageObject c)
{
try
{
Font myFont = new Font("Arial", 14);
//Get bitmap
Bitmap imageToDisplay = new Bitmap(Bitmap.FromFile(c.ImageFile));
//resize smallest dimension to 200
if (imageToDisplay.Height > imageToDisplay.Width)
{
imageToDisplay = new Bitmap(Bitmap.FromFile(c.ImageFile), 200, 200 * imageToDisplay.Height / imageToDisplay.Width);
}
else
{
imageToDisplay = new Bitmap(Bitmap.FromFile(c.ImageFile), 200 * imageToDisplay.Width / imageToDisplay.Height, 200);
}
//crop anything outside of 200x200
imageToDisplay = imageToDisplay.Clone(new Rectangle(Math.Max((imageToDisplay.Width - 200) / 2, 0), Math.Max((imageToDisplay.Height - 200) / 2, 0), 200, 200), imageToDisplay.PixelFormat);
//now draw it
picBox.Image = imageToDisplay;
//add the name
e.Graphics.DrawString(c.Name, myFont, Brushes.Maroon, new Point(2, 200));
}
catch (Exception E)
{
MessageBox.Show("Could not display image successfully\n" + E.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
来自 form.designer 的代码:
//This one displays correctly on initialisation
this.Controls.Add(this.PictureBox0);
//These two do not
this.Controls.Add(this.PictureBox1);
this.Controls.Add(this.PictureBox2);
((System.ComponentModel.ISupportInitialize)(this.PictureBox0)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.PictureBox1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.PictureBox2)).EndInit();
使图片框正确显示的按钮按下代码(初始化后):
private void Button_Click(object sender, EventArgs e)
{
//Refresh the picture boxes
foreach (PictureBox pb in this.Controls.OfType<PictureBox>())
{
pb.Refresh();
pb.Update();
}
}