29

私が目にするほとんどの例では、それをクリップボードに置いて貼り付けを使用すると言っていますが、クリップボードを上書きするため、あまり良くないようです。

pinvoke を使用して画像を手動で RTF に配置し、画像を wmf に変換する1 つの方法を見ました。これが最善の方法ですか?もっと簡単にできることはありますか?

4

10 に答える 10

57

最も簡単な方法は、RTFコードを変更して、自分で画像を挿入することです。

RTFでは、画像は次のように定義されます。

'{' \ pict(brdr?&shading?&picttype&pictsize&metafileinfo?)data'}'疑問符は、制御ワードがオプションであることを示します。「データ」は、16進形式のファイルの内容です。バイナリを使用する場合は、\bin制御ワードを使用します。

例えば:

{\pict\pngblip\picw10449\pich3280\picwgoal5924\pichgoal1860 hex data}
{\pict\pngblip\picw10449\pich3280\picwgoal5924\pichgoal1860\bin binary data}

\ pict =画像グループを開始します、\ pngblip=png画像\picwX=画像の幅(Xはピクセル値)\pichX=画像の高さ\picwgoalX=twip単位の画像の希望の幅

したがって、画像を挿入するには、画像を開き、データを16進数に変換し、これらのデータを文字列にロードし、その周囲にRTFコードを追加してRTF画像を定義する必要があります。これで、ドキュメントのRTFコードに挿入できる画像データを含む自己完結型の文字列ができました。最後の「}」を忘れないでください

次に、RichTextBox(rtbBox.Rtf)からRTFコードを取得し、画像を適切な場所に挿入して、rtbBox.Rtfのコードを設定します。

発生する可能性のある問題の1つは、.NETRTBがRTF標準を十分にサポートしていないことです。

小さなアプリケーション*を作成しました。これにより、RTB内のRTFコードをすばやくテストし、それがどのように処理されるかを確認できます。ここからダウンロードできます: RTBテスターhttp://your-translations.com/toys)。

一部のRTFコンテンツ(たとえば、Wordから)を左側のRTFボックスに貼り付けて[RTFコードを表示]をクリックして右側のRTFボックスにRTFコードを表示するか、右側のRTBにRTFコードを貼り付けてクリックすることができます「RTFコードの適用」で、左側の結果を確認します。

もちろん、コードを好きなように編集できます。これにより、RichTextBoxが必要なコマンドをサポートしているかどうかをテストしたり、RTF制御ワードの使用方法を学習したりするのに非常に便利です。

RTFの完全な仕様をオンラインでダウンロードできます。


NBそれは私が5分で一緒に叩いたほんの少しのことなので、ファイルを開いたり保存したり、ドラッグアンドドロップしたり、その他の文明的なものを実装しませんでした。

于 2009-02-20T05:16:16.690 に答える
13

次のコードを使用して、最初にクリップボードからデータを取得し、メモリに保存し、画像をクリップボードに設定し、リッチ テキスト ボックスに貼り付けて、最後にクリップボードにデータを復元します。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    OpenFileDialog1.Filter = "All files |*.*"
    OpenFileDialog1.Multiselect = True
    Dim orgdata = Clipboard.GetDataObject

    If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
        For Each fname As String In OpenFileDialog1.FileNames
            Dim img As Image = Image.FromFile(fname)
            Clipboard.SetImage(img)
            RichTextBox1.Paste()

        Next
    End If
    Clipboard.SetDataObject(orgdata)
End Sub

OpenFileDailog1、RichTextBox1、および Button1 は、それぞれファイルを開くダイアログ、リッチ テキスト ボックス、およびボタン コントロールです。

于 2009-12-26T15:05:14.593 に答える
6
private void toolStripButton1_Click(object sender, EventArgs e)
    {
        FileDialog fDialog = new OpenFileDialog();
        fDialog.CheckFileExists = true;
        fDialog.CheckPathExists = true;
        fDialog.RestoreDirectory = true;
        fDialog.Title = "Choose file to import";
        if (fDialog.ShowDialog() == DialogResult.OK)
        {
            string lstrFile = fDialog.FileName;
            Bitmap myBitmap = new Bitmap(lstrFile);
            // Copy the bitmap to the clipboard.
            Clipboard.SetDataObject(myBitmap);
            DataFormats.Format format = DataFormats.GetFormat(DataFormats.Bitmap);
            // After verifying that the data can be pasted, paste
            if(top==true && this.rtTop.CanPaste(format))
            {
                rtTop.Paste(format);
            }
            if (btmLeft == true && this.rtBottomLeft.CanPaste(format))
            {
                rtBottomLeft.Paste(format);
            }
            if (btmCenter == true && this.rtBottomCenter.CanPaste(format))
            {
                rtBottomCenter.Paste(format);
            }
            if (btmRight == true && this.rtBottomRight.CanPaste(format))
            {
                rtBottomRight.Paste(format);
            }
        }
    }
于 2009-04-21T09:19:09.960 に答える
5

リッチテキストコントロールをハックするために私が行うことは次のとおりです。

ワードパッドまたはMS-WORDに必要な画像を挿入します。ファイルを「rtf」として保存します。メモ帳でrtfファイルを開いて、生のrtfコードを確認します。必要なタグなどをリッチテキストボックスの「rtf」プロパティにコピーします(既存のテキストに追加します)。

いくつかの試行錯誤が含まれていますが、機能します。

C#では、プレースホルダーStringBuilderオブジェクトと必要なrtfコードを使用します。次に、画像パスを追加します。

これは、RTF構文を学習する必要がない場合の回避策です。

于 2009-02-20T05:28:52.073 に答える
0

私がしたことは、c# で小さな pictureBox コントロールを作成し、それを隠すのに十分な大きさの別のオブジェクトの背後に隠れていることを確認することだけでした。次に、画像を挿入するボタンを作成し、pictureBox に画像をロードしてから、それを richTextBox に入れ、pictureBox コントロールをクリアします。

これがコードです。

 private void InsertPicture_Click(object sender, EventArgs e)
    {

                    {
            if (openFileDialog4.ShowDialog() == DialogResult.OK)
            {
                // Show the Open File dialog. If the user clicks OK, load the 
                // picture that the user chose.   
                pictureBox2.Load(openFileDialog4.FileName);
                Clipboard.SetImage(pictureBox2.Image);
                pictureBox2.Image = null;
                this.richTextBox1.Paste();

            }
    }
}
于 2016-07-10T23:49:07.430 に答える
0

私もこの同じタスクのために何かを探していて、これを見つけました->

http://sourceforge.net/projects/netrtfwriter/

必要な任意のタイプの RTF テキストを生成し、必要に応じて使用できます。使用されている画像の種類 (jpg/jpeg/png など) を自動的に認識し、私が使用している画像ファイルに対して機能する非常によく構造化された例。急いでいるなら、これは素晴らしい RTF ジェネレーターです!

于 2012-09-13T15:43:04.037 に答える
0

C++ を使用している場合、その方法は OLE を使用することです。より具体的には、Google で ImageDataObject を検索すると、RTF コントロールに HBITMAP を挿入する方法を C++ コードで示します。1 つのリンクはこちらです。

さて、これが .Net コードにどのように変換されるかはわかりません。現在、詳細を検討する時間がありません。

于 2009-02-25T19:09:40.690 に答える
0

クリップボードで実行するコードを挿入したら、 と入力しClipboard.Clear();ます。それはうまく機能し、すべてをクリアするわけではなく、最後にクリップボードに追加されたアイテムのみをクリアします。

完全なコード:

private void addPictureToRTB()
{
    using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "Pictures|*.png" })
    {
         if (ofd.ShowDialog() == DialogResult.OK)
         {
               ClipBoard.SetImage(Image.FromFile(ofd.FileName));
               richTextBox.Paste();
               Clipboard.Clear();
         }
    }
}

次に、必要な場所でこの関数を参照します。

于 2021-12-20T01:03:02.247 に答える
-1

品質を落とさずに画像を挿入し、透明な画像/ pngで灰色の背景を修正するためのソリューションを数時間サーフィンしました

                // assuming the image is in your Resources
                var img = Resources.ImageWithTransparentBckgrnd;
                var g = Graphics.FromImage(img);
                using (var ms = new MemoryStream())
                {
                    img.Save(ms, ImageFormat.Png);
                    IntPtr ipHdc = g.GetHdc();
                    Metafile mf = new Metafile(ms, ipHdc);
                    g = Graphics.FromImage(mf);
                    g.FillEllipse(Brushes.White, 0, 0, 16, 16); // size you want to fill in
                    g.Dispose();
                    mf.Save(ms, ImageFormat.Png);
                    IDataObject dataObject = new DataObject();
                    dataObject.SetData("PNG", false, ms);
                    Clipboard.SetDataObject(dataObject, false);
                    richTextBox1.Paste();
                    SendKeys.Send("{RIGHT}");
                    richTextBox1.Focus();
                }
于 2018-10-08T13:55:28.427 に答える