将多个对象的组合复制到剪贴板(c# winforms)
Copy composite of multiple objects to clipboard (c# winforms)
C# Winforms 应用,Windows10.
表单有一个富文本框和一个图表(都是 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 调用将是最后的手段。
在此先感谢您的帮助。
解决方案是使用剪贴板作为中间步骤。 Hacky 但有效。
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);
C# Winforms 应用,Windows10.
表单有一个富文本框和一个图表(都是 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 调用将是最后的手段。
在此先感谢您的帮助。
解决方案是使用剪贴板作为中间步骤。 Hacky 但有效。
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);