0

我是在 Winforms 中使用事件处理程序的新手。

我想要做的是使用鼠标对我的桌面进行屏幕截图,以指定要捕获的区域,然后将此图像显示在图片中。我被建议在另一篇文章中使用事件处理程序来执行此操作,但我在尝试使其正常工作时遇到了一个真正的问题。有人可以看看我做了什么并告诉我我做错了什么吗?

如果做不到这一点,请指出我正确的方向来解决这个问题?

首先,我的屏幕截图代码:

 class ScreenCapture
{
    public delegate void StatusUpdateHandler(object sender, ProgressEventArgs e);
    public static event StatusUpdateHandler OnUpdateStatus;

    public static bool saveToClipboard = true;

     public  static void CaptureImage(bool showCursor, Size curSize, Point curPos, Point SourcePoint, Point DestinationPoint, Rectangle SelectionRectangle, string FilePath, string extension)
     {
         using (Bitmap bitmap = new Bitmap(SelectionRectangle.Width, SelectionRectangle.Height))
         {
             using (Graphics g = Graphics.FromImage(bitmap))
             {
                 g.CopyFromScreen(SourcePoint, DestinationPoint, SelectionRectangle.Size);

                 if (showCursor)
                 {
                     Rectangle cursorBounds = new Rectangle(curPos, curSize);
                     Cursors.Default.Draw(g, cursorBounds);
                 }
             }

             if (saveToClipboard)
             {

                  Image img = (Image)bitmap;
                      Clipboard.SetImage(img);

                 if (OnUpdateStatus == null) return; 

                    ProgressEventArgs args = new ProgressEventArgs(img);
                     OnUpdateStatus(this,args);



                 // this is where the screen capture is stored.
                 // it is this image I want pass to the image box





             }
             else
             {
                 switch (extension)
                 {
                     case ".bmp":
                         bitmap.Save(FilePath, ImageFormat.Bmp);
                         break;
                     case ".jpg":
                         bitmap.Save(FilePath, ImageFormat.Jpeg);
                         break;
                     case ".gif":
                         bitmap.Save(FilePath, ImageFormat.Gif);
                         break;
                     case ".tiff":
                         bitmap.Save(FilePath, ImageFormat.Tiff);
                         break;
                     case ".png":
                         bitmap.Save(FilePath, ImageFormat.Png);
                         break;
                     default:
                         bitmap.Save(FilePath, ImageFormat.Jpeg);
                         break;
                 }
             }


         }


     }


}


 public class ProgressEventArgs : EventArgs
{
    public  Image { get; private set; }
    public ProgressEventArgs( Image img)
    {
        Image = img;
    }
}

我的 form1 类中的代码:

  public partial class ControlPanel : Form
{
    public EventHandler<ScreenCapture> capture;
    private ScreenCapture _screenCap;

    public ControlPanel()
    {
        InitializeComponent();
        _screenCap = new ScreenCapture();
        _screenCap.OnUpdateStatus += new ScreenCapture.StatusUpdateHandler(SetImage);
    }

    private void SetImage(object sender, ProgressEventArgs e)
    {
        // the image box I want the image to be passed to
       // imagePreview.Image = e.OnUpdateStatus;
        SetImage(e.Image);
    }

    private void btn_CaptureArea_Click(object sender, EventArgs e)
    {

        this.Hide();
        Form1 form1 = new Form1();
        form1.InstanceRef = this;
        form1.Show();

    }


}

我以前从未使用过这样的事件处理程序,所以我有点超出我的深度。

编辑

抱歉忘记在我的问题中添加更多细节。尽管主要错误仍然是我的程序不再像以前使用此新代码那样工作。我仍然希望捕获的图像显示在我的 form1 中的图片框中。

目前我的事件处理代码有 8 个错误。在以下代码部分中:

 public class ProgressEventArgs : EventArgs
{
    public readonly Image { get; private set; }
    public ProgressEventArgs( Image img)
    {
        Image = img;
    }
}

我的编译器不喜欢 get 或 set。正如我的编译器所声称的

令牌无效 ';' 在类、结构或接口成员声明中

然后,在下面的行中,ProgressEventArgs 收到以下错误:

预期的类、委托、枚举、接口或结构 但我的想法是它已经在类中。所以我真的对这个错误感到困惑。

4

1 回答 1

1

看来您真的需要一本涵盖 C# 基础知识的书。因为您的代码中散布着各种各样的问题。我们都经历过——仅仅因为您是一位经验丰富的程序员并不意味着您不会被细微差别所困扰。

截屏

您的班级有很多static成员,但您正在实例ScreenCaptureControlPanel. 我会删除任何static声明,或者不打扰实例化它。

去除静电

public event StatusUpdateHandler OnUpdateStatus;

public bool saveToClipboard = true;

public void CaptureImage(bool showCursor, Size curSize, // ...

您正在using使用bitmapusing. 由于您想将其包含在您的活动中,请先将其删除using

Bitmap bitmap = new Bitmap(SelectionRectangle.Width, SelectionRectangle.Height);
using (Graphics g = Graphics.FromImage(bitmap)) { // ...

现在它bitmap不会被处理,您可以在CaptureImage函数末尾添加代码以触发您的事件。

if (OnUpdateStatus != null) {
    OnUpdateState(this, ProgressEventArgs(img));
}

控制面板

如果您保持ScreenCapture静态,请不要创建实例,并在类上注册事件。

// _screenCap = new ScreenCapture();
ScreenCapture.OnUpdateStatus += _screen_CapOnUpdateStatus;

如果你要做一个实例,你需要在 _screenCap 实例化之后订阅事件。

_screenCap = new ScreenCapture();
_screenCap.OnUpdateStatus += _screen_CapOnUpdateStatus;

您也需要创建订阅者

_screen_CapOnUpdateStatus(object source, ProgressEventArgs e) {
     imagePreview.Image = e.Image;
}

ProgressEventArgs

使用您的事件参数删除只读。由于private set. 您还需要为该属性命名。您可以使用与类型相同的名称,但这会引起混淆。考虑使用CapturedImage.

public Image CapturedImage { get; private set; }
public ProgressEventArgs(Image img)
{
    CapturedImage = img;
}

尝试这些更改,然后解决任何剩余的编译器问题。

于 2013-08-21T15:55:40.797 回答