代码之家  ›  专栏  ›  技术社区  ›  Aging Hippie

将多个对象的组合复制到剪贴板(c#winforms)

  •  0
  • Aging Hippie  · 技术社区  · 6 年前

    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,在使用多个监视器定位和确定实际位置(相对于容器的这个.location.X,而不是屏幕)时遇到问题,并且不完全符合规范,因为如果richtextbox隐藏或浮动,则不会在顶部显示它。更不用说,如果您尝试调试它,它会复制Visual Studio的一块显示。

    开源第三方解决方案可能还可以,寻找了一些,但没有发现任何可以实现此功能的方法。Win32 API调用将是最后的选择。

    提前感谢您的帮助。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Aging Hippie    6 年前

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

        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);