如何将我的 Bing 地图图像的屏幕截图复制到 Winforms 中的剪贴板?

问题描述

在我的 winforms 应用程序中,我希望允许用户将 Bing Maps 组件的屏幕截图复制到剪贴板(至少)。

我从 here 中找到了以下代码,它超出了这个范围,但它不能为我编译。

1>C:\Users\bclay\source\repos\mymaps\mymaps\Form1.cs(394,78,394,97): error CS0246: The type or namespace name 'IRandomAccessstream' Could not be found (are you missing a using directive or an assembly reference?)

我得到的编译时错误消息是关于 IRandomAccessstream 的:

1>C:\Users\bclay\source\repos\mymaps\mymaps\Form1.cs(8,7,8,14): error CS0246: The type or namespace name 'Windows' Could not be found (are you missing a using directive or an assembly reference?)

所以我找到了 this,这表明我需要的“使用”是使用 Windows.Storage.Streams;

...但是当我添加它时,我被告知找不到“Windows”命名空间:

R 4.0.4

我需要做什么/更改/添加才能使其在 Winforms 上工作?还是在我的情况下需要完全不同的方法

解决方法

有几种方法可以做到这一点。

作为一个简单的(但绝对不是完美的)选项,您可以使用 Graphics.FromScreen 将一块屏幕复制到图形对象:

var r = elementHost1.ClientRectangle;
using (var img = new Bitmap(r.Width,r.Height))
{
    using (var g = Graphics.FromImage(img))
    {
        var sr = elementHost1.RectangleToScreen(r);
        g.CopyFromScreen(sr.Location,System.Drawing.Point.Empty,sr.Size);
    }
    System.Windows.Forms.Clipboard.SetImage(img);
}

另一种选择是使用 RenderTargetBitmapPngBitmapEncoder 将其导出为这样的图像:

public System.Drawing.Image DrawToImage(
    System.Windows.Controls.Control target)
{
    var rtb = new System.Windows.Media.Imaging.RenderTargetBitmap(
        (int)(target.ActualWidth),(int)(target.ActualHeight),96,System.Windows.Media.PixelFormats.Pbgra32);
    rtb.Render(target);
    System.Windows.Media.Imaging.PngBitmapEncoder encoder =
        new System.Windows.Media.Imaging.PngBitmapEncoder();
    encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(rtb));
    var ms = new System.IO.MemoryStream();
    encoder.Save(ms);
    return System.Drawing.Image.FromStream(ms);
}

然后你可以把它设置到剪贴板中:

using (var image = DrawToImage(userControl11.myMap))
    System.Windows.Forms.Clipboard.SetImage(image);

或将其保存到文件中:

using (var image = DrawToImage(userControl11.myMap))
    image.Save(@"c:\test\map.png",System.Drawing.Imaging.ImageFormat.Png);