C# 多图片框初始化问题

本文关键字:初始化 问题 | 更新日期: 2023-09-27 18:37:02

我正在组装一个在GUI上使用多个图片框的应用程序。 我为绘制事件调用的每个图片框编写了自定义事件。

遗憾的是,当应用程序运行时,恰好显示了一个图片框。 其他的只是显示为白框。 无论哪个opicturebox碰巧首先添加到form.designer中,都是正确显示的图片框,对于其他人来说,他们的绘画事件永远不会被触发。 我试图通过在表单构造函数中调用 picturebox.refresh()、picturebox.update() 和 picturebox.invalidate() 的各种组合来解决这个问题,但无济于事。

有趣的是,当我将按钮按下事件与 picturebox.refresh() 和 picturebox.update() 相关联并在程序运行时按下按钮时,图片框开始正常运行 - 调用 paint 事件并且图像更新。

有没有人知道如何让所有图片框在初始化时正确显示?

可能有用的代码片段:

图片框的绘制代码:

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();
    }
}

C# 多图片框初始化问题

每次需要重新绘制窗口时都会引发Paint事件。 例如,如果将另一个窗口拖动到顶部,则每秒将引发多次Paint事件。 因此,重要的是您的paintPictureBox函数除了绘画之外什么都不做。

问题是paintPictureBox不断地重新初始化位图,但实际上并没有绘制它。 此外,您每次绘制时都会从磁盘读取并创建多个位图。 这很慢,并且会占用大量内存。

相反,您应该在加载窗体时初始化每个图片框的 Image 属性一次。 然后,每个图片框将负责绘制自己的位图。 绘制事件除了绘制图片名称外,什么都不做。