
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;
}
}
}
問題点が残ったままですが、少しはお役に立てればとおもいます。
この回答へのお礼
お礼日時:2013/01/17 15:57
どうもありがとうございます!!!
自分でも他の方法を試してみたのですがアイコンの取得がうまくできなくて悩んでいましたが、この方法で解決することができました!!!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Eclipseで検索ができなくなった
-
[Java]LinuxのOS判定方法
-
VB2008 iniファイルの全セクシ...
-
ディレクトリのサイズの取得
-
VB6.0のメモリリークについて
-
GetOpenFileName()について
-
XMLShemaからXML文書を作成
-
0バイトのテキストファイル
-
2GB以上のファイルを扱う方法
-
ファイル作成日時と更新日時を...
-
CSV名と同じシートを選択して取...
-
CSVファイルの時刻の形式について
-
accessでクエリをExcelにエクス...
-
コマンドプロンプトのテキスト...
-
Thunderbird 受信メールからの...
-
VB.NET操作で Excelにビットマ...
-
C#でプログラミング リストボ...
-
Excel で「OLE は現在使用でき...
-
ファイル変換
-
[VB.NET] 処理の高速化を行いた...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0バイトのテキストファイル
-
【Excel VBA】取り込んだファイ...
-
Eclipseで検索ができなくなった
-
VBAで、JPG写真の撮影日時を読...
-
VB6.0のメモリリークについて
-
HTMLテキストリンクでExcelファ...
-
サイトマップにサブドメインを...
-
VB2008 iniファイルの全セクシ...
-
2GB以上のファイルを扱う方法
-
Javaのファイルダウンロードに...
-
リソースファイルを認識してく...
-
VBScriptから指定URLを次々に開...
-
C++によるファイル送受信プログ...
-
【VBA】印刷マクロのループ処理...
-
RPGでメッセージファイル利用
-
C++.NET 2003 「空のドキュメ...
-
<input type="file" で初期値...
-
windows 環境でのファイル操作...
-
BASP21のファイルアップロード...
-
ファイルのダウンロードが遅い
おすすめ情報