私が目にするほとんどの例では、それをクリップボードに置いて貼り付けを使用すると言っていますが、クリップボードを上書きするため、あまり良くないようです。
pinvoke を使用して画像を手動で RTF に配置し、画像を wmf に変換する1 つの方法を見ました。これが最善の方法ですか?もっと簡単にできることはありますか?
最も簡単な方法は、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分で一緒に叩いたほんの少しのことなので、ファイルを開いたり保存したり、ドラッグアンドドロップしたり、その他の文明的なものを実装しませんでした。
次のコードを使用して、最初にクリップボードからデータを取得し、メモリに保存し、画像をクリップボードに設定し、リッチ テキスト ボックスに貼り付けて、最後にクリップボードにデータを復元します。
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 は、それぞれファイルを開くダイアログ、リッチ テキスト ボックス、およびボタン コントロールです。
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);
}
}
}
リッチテキストコントロールをハックするために私が行うことは次のとおりです。
ワードパッドまたはMS-WORDに必要な画像を挿入します。ファイルを「rtf」として保存します。メモ帳でrtfファイルを開いて、生のrtfコードを確認します。必要なタグなどをリッチテキストボックスの「rtf」プロパティにコピーします(既存のテキストに追加します)。
いくつかの試行錯誤が含まれていますが、機能します。
C#では、プレースホルダーStringBuilderオブジェクトと必要なrtfコードを使用します。次に、画像パスを追加します。
これは、RTF構文を学習する必要がない場合の回避策です。
私がしたことは、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();
}
}
}
私もこの同じタスクのために何かを探していて、これを見つけました->
http://sourceforge.net/projects/netrtfwriter/
必要な任意のタイプの RTF テキストを生成し、必要に応じて使用できます。使用されている画像の種類 (jpg/jpeg/png など) を自動的に認識し、私が使用している画像ファイルに対して機能する非常によく構造化された例。急いでいるなら、これは素晴らしい RTF ジェネレーターです!
C++ を使用している場合、その方法は OLE を使用することです。より具体的には、Google で ImageDataObject を検索すると、RTF コントロールに HBITMAP を挿入する方法を C++ コードで示します。1 つのリンクはこちらです。
さて、これが .Net コードにどのように変換されるかはわかりません。現在、詳細を検討する時間がありません。
クリップボードで実行するコードを挿入したら、 と入力し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();
}
}
}
次に、必要な場所でこの関数を参照します。
品質を落とさずに画像を挿入し、透明な画像/ 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();
}