将对象的存储实例传递给另一个窗体

本文关键字:另一个 窗体 实例 对象 存储 | 更新日期: 2023-09-27 18:28:35

我正试图将我的屏幕截图图像显示在控制面板窗体上的图片框中。但图像没有被忽略。

我已被告知,问题可能存在于以下代码行内:

      ScreenCapture capture = new ScreenCapture();
         capture.CaptureImage(showCursor, curSize, curPosition, startPoint, Point.Empty, bounds, _screenPath, fi);

当我创建一个新的屏幕截图时,数据不会传递到我的图片框中。当我运行我的程序时,错误源于以下始终返回null的行:

 Image img = (Image)bitmap;
 if (OnUpdateStatus == null) return;
 ProgressEventArgs args = new ProgressEventArgs(img);
 OnUpdateStatus(this, args);

然后在我的控制面板winform中,我试图显示如下图像:

private ScreenCapture _screenCap;
public ControlPanel()
{
    InitializeComponent();
    _screenCap = new ScreenCapture();
    _screenCap.OnUpdateStatus += _screen_CapOnUpdateStatus;
}

private void _screen_CapOnUpdateStatus(object sender, ProgressEventArgs e)
{
    imagePreview.Image = e.CapturedImage;
}

我得到的建议如下:

您看到的是CaptureImage中OnUpdateStatus的值方法,对吧?因此,重要的是你调用哪一个而不是ScreenCapture方法打开。我怀疑您需要将_screenMap传递给Form1的构造函数(需要将其存储在字段中),以便在中调用CaptureImage时可以使用相同的实例Form1

我不知道如何实现给我的建议。在我的前两行代码中,我只是试图取消ScreenCapture类的新实例的创建,并编写

  ScreenCapture.CaptureImage(showCursor, curSize, curPosition, startPoint, Point.Empty, bounds, _screenPath, fi);

但这会产生以下错误:

错误1非静态字段、方法或属性"DotFlickScreenCapture.ScreenCaptureImage(bool,System.Drawing.Size,System.Drawing.Point,System.Drawing_Point,System.Drawing.Point、System.Drawing.Rectangle,string,string)"需要对象引用

因此,为了消除这个错误,我将被调用的方法变成了一个静态类,但这在我的代码试图存储拍摄的图像时产生了大量不同的错误:

     Image img = (Image)bitmap;
     if (OnUpdateStatus == null) return;
     ProgressEventArgs args = new ProgressEventArgs(img);
     OnUpdateStatus(this, args);

它声称我的OnUpdateStatus需要对象引用,并且在静态字段或环境中使用THIS关键字是无效的。

有人能帮助我在图片框中显示我的图片吗?

将对象的存储实例传递给另一个窗体

真诚地说,我无法理解您的代码。但我知道这个建议是给你的。它说将捕获屏幕的对象传递给表单的构造函数:

假设您有一个表单名称form1。以下是form1类中必须具有的构造函数和小代码:

public partial class Form1 : Form
{
    Image CapturedImage;
    public Form1(Image imgObj) //"you need to pass _screenCap to the constructor of Form1"
    {
        InitializeComponent();
        CapturedImage = imgObj; //"which would need to store it in a field"
    }
}

构造函数将捕获的图像作为对象(image imgObj),并将其分配给字段(image CapturedImage;)。

如果您想在picturebox中显示它。只需在构造函数中添加这一行:

picturebox.Image = CapturedImage;

现在从另一种形式调用它,这样做:

当你正在做的时候捕获屏幕(你的第一个代码是正确的,你在其中创建了ScreenCapture类的对象),并将其保存在一个对象中:

Image CapturedImageObj = capture.CaptureImage(showCursor, curSize, curPosition, startPoint, Point.Empty, bounds, _screenPath, fi);

现在创建form1的实例,并将捕获的图像传递给表单的构造函数:

form1 ImageForm = new form1(CapturedImageObj);

并显示:

form1.Show();