将存储的对象实例传递给另一个表单

时间:2013-08-22 15:11:37

标签: c# winforms event-handling screenshot

我正在尝试将我的屏幕截图显示在控制面板表格中的图片框中。但是图像没有被传递过来。

我被告知该问题可能存在于以下代码行中:

      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而是重要的   方法。我怀疑你需要将_screenCap传递给   Form1的构造函数(需要将其存储在字段中)以便这样做   在内部调用CaptureImage时可以使用相同的实例   Form1中

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

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

但这会产生以下错误:

  

错误1非静态字段,方法或属性'DotFlickScreenCapture.ScreenCapture.CaptureImage(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关键字在静态字段或环境中无效。

是否有人能够帮助我将图像显示在图像框中?

1 个答案:

答案 0 :(得分:0)

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

假设您有一个表单名称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();