0

C# Winforms 应用程序,Windows 10。

表单有一个richtextbox 和一个图表(都是MS)。目前具有将richtextbox复制到剪贴板的功能:

    Clipboard.SetText(rtbContents.Rtf, TextDataFormat.Rtf);

以及将图表作为图像复制到剪贴板的功能:

    using (MemoryStream ms = new MemoryStream())
    {
        chart1.SaveImage(ms, ChartImageFormat.Bmp);
        Bitmap bm = new Bitmap(ms);
        Clipboard.SetImage(bm);
    }

需要一个函数将两者作为一个单元进行复制(富文本在上面,图像在下面),以便 ctrl-v 将它们都粘贴到例如 Word 文档中。

尝试过 IDataObject,无法在对象中存储富文本而不会丢失颜色、字体大小、特殊字符。看起来 IDataObject 仍然只能一次粘贴一个东西,只是感知目标应用程序最可能想要的东西。

尝试使用 DrawString 组合 bmp,在富文本中保留多种颜色以及组装或连接位图时遇到了麻烦。

尝试了 CopyFromScreen,使用多个监视器定位问题并确定实际位置(this.Location.X 相对于容器,而不是屏幕),并且不完全符合规范,因为如果richtextbox 是隐藏或浮动的,则不会在顶部显示它。更不用说如果你尝试调试它,它会复制一大块 Visual Studio 的显示。

开源第三方解决方案可能没问题,寻找了一些但没有看到任何可以执行此功能的东西。Win32 API 调用将是最后的手段。

提前感谢您的任何帮助。

4

1 回答 1

0

解决方案是使用剪贴板作为中间步骤。哈克但有效。

    using (MemoryStream ms = new MemoryStream())
    {
        chart1.SaveImage(ms, ChartImageFormat.Bmp);
        Bitmap bm = new Bitmap(ms);
        Clipboard.SetImage(bm);
    }
    RichTextBox rtbCombination = new RichTextBox();
    rtbCombination.Rtf = ucLegend.rtbContents.Rtf;
    rtbCombination.Select(rtbCombination.Rtf.Length, 0);
    rtbCombination.AppendText(Environment.NewLine);
    rtbCombination.Select(rtbCombination.Rtf.Length, 0);
    rtbCombination.Paste();
    Clipboard.SetText(rtbCombination.Rtf, TextDataFormat.Rtf);
于 2018-02-15T20:01:18.910 回答