目前我正在使用 RTF 进行这项工作,但对于我想要实现的目标来说,这似乎有点矫枉过正......
我从代码项目中获取了这个不错的小型 RTF 库,感谢 Dima 与世界分享这个:)
我对其进行了修改,添加了一个额外的函数来写入剪贴板(我确信这个额外的函数可以添加得更好,但它确实有效)('cough' hacky'cough')
将我的图像和文本复制到剪贴板的代码变为:
private void CopyDetailToClipBoard(string caption, Image image)
{
//using rtf data format, put a bunch of data onto the clipboard
RtfDocument rtf = new RtfDocument();
RtfParagraph rtfTextBlock = new RtfParagraph();
const int captionFontSize = 22;
//add main image to rtf text
RtfImage image = new RtfImage(image, RtfImageFormat.Png);
rtfTextBlock.AppendParagraph(image);
//add caption
RtfFormattedText Caption = new RtfFormattedText(caption,
RtfCharacterFormatting.Underline | RtfCharacterFormatting.Bold,
1,
captionFontSize);
rtfTextBlock.AppendParagraph(Caption);
rtf.Contents.Add(rtfTextBlock);
//write the rtf to the clipboard
RtfWriter rtfWriter = new RtfWriter();
rtfWriter.WriteToClipBoard(rtf);
}
我添加到 RTF 库的额外函数是“WriteToClipbard”,我将它添加到 RtfWriter.cs,它只是 write 函数的 C&P,但不是将字符串写入文件,而是写入剪贴板(如果我会更好已将 RtfDocument 修改为仅具有可在任一情况下使用的“tostring”)
//Where rtfWriter.WriteToClipBoard is a modified version of the "Write" function:
public void WriteToClipBoard(RtfDocument document)
{
_encoding = Encoding.GetEncoding((int)document.CodePage);
sb = new StringBuilder();
Reflect(document);
Clipboard.SetData(DataFormats.Rtf, sb.ToString());
}
我仍然希望有一个“更轻”的解决方案然后这个,但这适用于从我的应用程序复制到 Word/任何 rtf 应用程序,它有一个很好的好处,我可以做花哨的格式化等。
ps
一个警告,如果你只是为了它而向图像添加文本(或反之亦然),不要,因为警告只是向剪贴板添加位图被更多应用程序识别(例如绘画) ,同样的 RTF 说记事本不是很干净:p。
因此,您实际上通过走 RTF 路线来限制应用程序数据的潜在交叉(请参阅下面的更新) 。对我来说,文本实际上不仅仅是一个“标题”,它是解释图像是如何创建的大量数据(因此,为什么花哨的格式实际上非常有用,但为了简洁起见,我已经简化了所有这些)。我实际上发现自己将此添加为“cntrl+shift+c”选项并保留“ctnrl+c”作为向剪贴板添加好的旧位图。
- 更新 - -
原来您可以将RTF 文件复制并粘贴到 word 中。因此,您可以跳过额外写入剪贴板部分并创建文件,然后将文件添加到剪贴板。这实际上允许您拥有多个图像+文本项目,缺点是它作为嵌入式文档粘贴到 word 中,但这实际上更适合我想要的。
事实证明,您可以解决应用程序限制问题,因为您可以将多种类型并行添加到剪贴板。所以我目前将它作为 RTF 文件和位图添加到剪贴板。执行“ setimage ”不会覆盖“ setfile ”
这样,当我粘贴到 word 中时,我会得到带有图像和位图的 RTF。
当我粘贴到油漆中时,我只粘贴图像:)(事实上,当我添加到位图剪贴板时,我使用 GDI 来写标题)
它实际上非常酷,它适用于各种程序。有趣的是,不同的办公程序有不同的默认“选择”。Word 似乎选择了 RTF,而 Powerpoint 将选择位图。