2

複数のものをクリップボードにコピーしたい:

Clipboard.SetImage(Image);
Clipboard.SetText(ImageCaption);  

ただし、すべての Clipboard.Set* 関数が最初にクリップボードをクリアすることに気付きました。したがって、上記の例では、テキストのみを取得します。「追加」に相当するものはありますか?

少なくとも、ビットマップとテキストをクリップボードに追加して、Microsoft Office などのアプリケーションに貼り付けられるようにしたいと考えています。

私は大胆に試しました:

    [Serializable]
    public class ImageAndText
    {
        public readonly string text;
        public readonly Bitmap image;

        public ImageAndText(string text, Bitmap image)
        {
            this.text = text;
            this.image = image;
        }
    }
    private void CopyToClipBoard()
    {

        Clipboard.SetData(DataFormats.Rtf , new ImageAndText(NewLayer.RecursionLog, rootLayer.GetBitmapTrueRes()));
    }

しかし、理にかなっているimageandtextの「to string」を取得しました。画像とテキストを取得していることをMSに伝えるために使用できるデータ形式が必要ですか? 秘密ですか?

4

1 に答える 1

2

現在、RTFを使用してこれを機能させていますが、達成したいことにはやり過ぎのようです...

私はこのすてきな小さな RTF ライブラリオフ コード プロジェクトを手に入れました。これを世界と共有してくれてありがとうディマ :)

そして、それを修正して、クリップボードに書き込む関数を 1 つ追加しました (追加の関数をもっとうまく追加できたと思いますが、機能します) ('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 ライブラリに追加した追加の関数は、RtfWriter.cs に追加した "WriteToClipbard" で、単純に書き込み関数の C&P でしたが、文字列をファイルに書き込む代わりに、クリップボードに書き込みます(どちらのシナリオでも使用できる「tostring」を持つように RtfDocument を変更しました)

//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に貼り付けることができます。したがって、クリップボード部分への余分な書き込みをスキップしてファイルを作成し、ファイルをクリップボードに追加できます。これにより、実際には複数の画像とテキストのアイテムを使用できます。欠点は、埋め込みドキュメントとして単語に貼り付けられることですが、これは実際には私が望んでいたものよりも優れていました.

また、クリップボードに複数のタイプを並行して追加できるため、アプリケーションの制限の問題を回避できることがわかりました。そのため、現在、RTF ファイルとビットマップの両方としてクリップボードに追加しています。「 setimage 」を実行しても「setfile」は上書きされません

このようにして単語に貼り付けると、画像とビットマップを含む RTF が取得されます。

ペイントに貼り付けるときは、画像だけを貼り付けます:)(実際、ビットマップクリップボードに追加するときは、GDIを使用してキャプションを書き込みます)

さまざまなプログラムでどのように機能するかは、実際には非常にクールです。興味深いことに、異なるオフィス プログラムには異なるデフォルトの「選択肢」があります。Word は RTF を選択するようですが、Powerpoint はビットマップを選択します。

于 2015-02-18T12:39:34.763 に答える