• ベストアンサー

C# リッチテキストボックスへのドラッグ&ドロップ

C#でリッチテキストボックスにファイルをドラッグ&ドロップすることでファイルそのものを張り付けることは可能でしょうか?(張り付けたファイルはデスクトップ上の物と同様にダブルクリックで開ける) また、可能ならどのようにすればできるのか教えていただけると幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • sean9
  • ベストアンサー率86% (26/30)
回答No.1

こんにちは。 RichTextBoxの仕様を読んでいないので標準でできたりするのかもしれません。 vb6だとできるんですかね。 → http://okwave.jp/qa/q951600.html 今回は自前で泥臭くやってみました。 Drag&Drop処理は省略します。 1. アイコン表示用PictureBox:PictureBoxとファイルパス:stringのDictionaryを作成 Dictionary<PictureBox, string> _dictionary = new Dictionary<PictureBox, string>(); 2. DragDropイベントハンドラでファイルパス、マウスポジションなどを取得 Point mousePosition = richTextBox1.PointToClient(Cursor.Position); 3. ファイルパスからアイコンを取得 Icon appIcon = Icon.ExtractAssociatedIcon(path); 4. 取得したアイコン、ファイルパスの情報をDictionaryへ 5. PictureBoxのMouseDoubleClickイベントハンドラを追加 といった感じでした。 今回の問題点として 1. 複数ファイルを受け付けた時の配置 2. RichTextBoxのスペース調整(アイコン(実際にはPictureBox)を表示する場所を開けるならば) があります。他にもあるかも・・・ 以下は今回書いたソースです。Drag&Dropでは複数ファイルを受け付けていますが、1つのファイルにのみ処理を行なっています。 public partial class Form1 : Form { private Dictionary<PictureBox, string> _dictionary = new Dictionary<PictureBox, string>(); public Form1() { InitializeComponent(); richTextBox1.DragEnter += new DragEventHandler(richTextBox1_DragEnter); richTextBox1.DragDrop += new DragEventHandler(richTextBox1_DragDrop); } private void Form1_Load(object sender, EventArgs e) { richTextBox1.AllowDrop = true; } /// <summary> /// DragDropされたイベントハンドラ /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void richTextBox1_DragDrop(object sender, DragEventArgs e) { Point mousePosition = richTextBox1.PointToClient(Cursor.Position); string[] filePaths = (string[])e.Data.GetData(DataFormats.FileDrop, false); string path = filePaths[0]; Icon appIcon = Icon.ExtractAssociatedIcon(path); PictureBox pictureBox = new PictureBox(); pictureBox.Image = appIcon.ToBitmap(); pictureBox.SizeMode = PictureBoxSizeMode.AutoSize; pictureBox.Location = mousePosition; pictureBox.Cursor = Cursors.Arrow; _dictionary.Add(pictureBox, path); this.richTextBox1.Controls.Add(pictureBox); pictureBox.MouseDoubleClick += new MouseEventHandler(pictureBox_MouseDoubleClick); } /// <summary> /// PictureBoxのマウスダブルクリックイベントハンドラ /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void pictureBox_MouseDoubleClick(object sender, MouseEventArgs e) { var pictureBox = sender as PictureBox; if (!_dictionary.Keys.Contains(pictureBox)) { return; } System.Diagnostics.Process.Start(_dictionary[pictureBox]); } /// <summary> /// DragEnterされたイベントハンドラ /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void richTextBox1_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) { e.Effect = DragDropEffects.Copy; } else { e.Effect = DragDropEffects.None; } } } 問題点が残ったままですが、少しはお役に立てればとおもいます。

tmg_890
質問者

お礼

どうもありがとうございます!!! 自分でも他の方法を試してみたのですがアイコンの取得がうまくできなくて悩んでいましたが、この方法で解決することができました!!!