重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

C#でリッチテキストボックスにファイルをドラッグ&ドロップすることでファイルそのものを張り付けることは可能でしょうか?(張り付けたファイルはデスクトップ上の物と同様にダブルクリックで開ける)

また、可能ならどのようにすればできるのか教えていただけると幸いです。

「C# リッチテキストボックスへのドラッグ」の質問画像

A 回答 (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;
}
}
}




問題点が残ったままですが、少しはお役に立てればとおもいます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/01/17 15:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!