Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#多个picturebox初始化问题_C#_Winforms_Picturebox - Fatal编程技术网

C#多个picturebox初始化问题

C#多个picturebox初始化问题,c#,winforms,picturebox,C#,Winforms,Picturebox,我正在组装一个在GUI上使用多个picturebox的应用程序。我已经为每个picturebox编写了自定义事件,这些picturebox在paint事件中被调用 不幸的是,当应用程序运行时,只有一个picturebox正确显示。其他的只是显示为白色框。在form.designer中,无论哪一个opicturebox恰好是最先添加的,都是正确显示的picturebox,对于其他对象,它们的绘制事件永远不会触发。我试图通过在表单构造函数中调用picturebox.refresh()、picture

我正在组装一个在GUI上使用多个picturebox的应用程序。我已经为每个picturebox编写了自定义事件,这些picturebox在paint事件中被调用

不幸的是,当应用程序运行时,只有一个picturebox正确显示。其他的只是显示为白色框。在form.designer中,无论哪一个opicturebox恰好是最先添加的,都是正确显示的picturebox,对于其他对象,它们的绘制事件永远不会触发。我试图通过在表单构造函数中调用picturebox.refresh()、picturebox.update()和picturebox.invalidate()的各种组合来解决这个问题,但都没有成功

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

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

可能有用的代码段:

pictureboxes的绘制代码:

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();
使pictureboxes正确显示的按钮按下代码(初始化后):

private void按钮\u单击(对象发送者,事件参数e)
{
//刷新图片框
foreach(this.Controls.OfType()中的PictureBox pb)
{
pb.Refresh();
pb.Update();
}
}

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

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


相反,当表单加载时,您应该初始化每个图片框的
Image
属性一次。每个图片框将负责绘制自己的位图。您的绘画活动只能画出图片名称。

谢谢您的回答-它使我能够解决这个问题。我现在只在需要时更改位图,而不是每次调用paint方法时都更改,并且文本是在paint上刷新的唯一内容。现在,所有pictureboxes都已正确初始化。我不确定我是否完全理解为什么它以前不起作用-初始化位图但不绘制位图的方法是什么?可以通过调用类似于
Graphics.DrawImage
的函数来绘制位图。在图片框上设置
Image
属性不会绘制任何内容-它会告诉图片框在将来绘制位图。啊,好的,我现在明白了。谢谢你的帮助,非常感谢。
private void Button_Click(object sender, EventArgs e)
{
    //Refresh the picture boxes
    foreach (PictureBox pb in this.Controls.OfType<PictureBox>())
    {
        pb.Refresh();
        pb.Update();
    }
}