ものえおさむ

C#で作る、あなただけのメモ帳 ~ドラッグ・アンド・ドロップ機能の実装~

2009-09-09 13:41:00

はじめに
このブログでは、"Windows アプリケーションってどう作るのかよくわからない" といったプログラマ向けに Visual C# 2008 Express Edition (無償) を使用した Windows アプリケーションに作り方について説明しています。
Visual C# 2008 Express Edition (無償)(※) の入手方法については
この記事 を、プロジェクトのコンパイル方法については この記事を参照してください。

(※1)大学生、専門学校生の方は DreamSpark で、商用の Visual Studio を無償で入手することもできます。
(※2)設立 3 年未満のベンチャー企業の方は BizSparkで、Microsoft の開発製品、およびサーバー製品を無償で使用することができます。

なんと、五ヶ月ぶりの投稿ですが、みなさんお元気でしょうか?

さて、昨今、芸能界に広がるドラッグ汚染が話題になっておりますが、そんな話題となんの関係もなく、今回は ドラッグ・アンド・ドロップの機能を作成中のアプリケーションに追加したいと思います。

オブジェクト、あるいはファイルの上でマウスのボタンをクリックしたまま動かすと、移動先に情報を送れるあれです。

ドラッグ & ドロップ、人によっては DOLCE&GABBANA っぽく D&D なんて記述しますよね。(まぁ、そんな理由でもないでしょうが)

このドラッグ・アンド・ドロップ、記述はいろいろあるのに読み方が "どろらっぐあんどどろっぷ" として揺るぎがないところが個人的にはすごいと思っております。

たとえば似たような言葉で、いつの世の若人の魂を震わす Rock & Roll という言葉がありますが、これなど正しく"ロックアンドロール" と呼ばれるのは稀で、通称は"ロック" あるいは "ロックンロール" と呼ばれます。

さらには革ジャン・リーゼント系のトッぽい兄ぃ様方からは "ロケンローッ!!" なんて呼ばれたりもします。

それに比べてドラッグ・アンド・ドロップはどうでしょう?

"ドッケンドープ" などとは誰も呼びませんし、ヤナギヤのポマードが香るトッぽい兄ぃ様方であっても "ドケンドー"とは呼びません。

・・・・・・。

この話し、どうでもいいですね。

 

さて、このドッケンドー、もとい、ドラッグ・アンド・ドロップ。ウィンドウ型の GUI システムでは基本的な動作で、ウィンドウシステム上で動作するアプリケーションであればどのような形であれサポートしているものです。

たとえば、コマンドラインを実行するためのシェルであるコマンドプロンプト(cmd.exe) でさえ、自身のウィンドウをコントロールするためのドラッグ・アンド・ドロップ機能を備えていますし、バージョンによっては、コマンドプロンプトにファイルをドラッグ・アンド・ドロップすると、そのファイルのパスが自動的に入力されるようになっています。

もちろん、Windows 搭載のトラディショナルなテキストエディタ・メモ帳もドラッグ・アンド・ドロップをサポートしており、ウィンドウ内にテキスト形式のファイルをドラッグ・アンド・ドロップすればそのファイルの内容をロードしてくれます。

と、まぁ、このようにどんなシンプルなアプリケーションであれ、Windows のデスクトップアプリケーションであれは、自身のウィンドウ内ではもちろん、ウィンドウ外からの情報のやり取りの手段としてのドラッグ・アンド・ドロップの機能はサポートしているものなのです。

実行中のアプリケーションと、その外側の情報をやりとりするための、GUI においての "クリップボード" のようなもの、と言えば機能としての立ち位置を理解しやすいかもしれません。

たとえば、ファイルアクセス機能をサポートするゴージャスで美しい GUI を備えたアプリケーションがあったとして、そのウィンドウにファイルをドラッグしても無反応だったらどうでしょう?

幻滅しないまでもがっかりするのは請け合いでしょう。人によっては開発者のセンスに疑いを持つかもしれません。

つまり、ドラッグ・アンド・ドロップ機能の搭載は、もはや機能として必要かどうかではなく姿勢の問題なのです。(※すみません、ここはてきとーに言ってます)。

そんなわけで、真に Windows アプリケーション を名乗るのであれば、ドラッグ・アンド・ドロップ機能を搭載することをお勧めします。

 

アプリケーションへのドラッグ・アンド・ドロップの実装

このブログの内容に沿って今まで自力で開発をされてきた方はそのプロジェクトを Visual Studio でオープンしてください。

これからちょっとやっとみよう、という方はここから Sample05.zip をダウンロードして解凍し、プロジェクトを入手してください。

さて、以下がサンプルアプリケーションへのドラッグ・アンド・ドロップ機能の実装手順です。

手順

1. Form1 を選択して、[プロパティ] ウィンドウで [AllowDrop] を True に

2. TextBox1 を選択し、[プロパティ] ウィンドウで  [AllowDrop] を True に

3. TextBox1 を選択し、[プロパティ] ウィンドウでイベント(稲妻) のマークをクリック

4. [DragDrop] をダブルクリック
 DragDrop イベントハンドラが追加されるので、以下のようにコードを記述

private void textBox1_DragDrop(object sender, DragEventArgs e)
{
 string[] dlagFilePathArray = (string[])e.Data.GetData(DataFormats.FileDrop, false);
           
  //複数のファイルがドラックされた場合、パスが配列として取得されるが、
  //今回のアプリケーションは TextBox が 1 つしかないため、先頭の
  //ファイルのみを扱う
 string filePath = dlagFilePathArray[0];

  //ファイルがテキスト形式でオープン可能なものかどうか確認
 if (CheckFileType(filePath))
 {
   //ファイルの内容を TextBox にロード
   textBox1.Text = File.ReadAllText(filePath, Encoding.Default);
              
   //フォームのタイトル部分にファイル名を表示
  this.Text = GetFileNameString(filePath,'\\');
  editFilePath = filePath;
  setDirty(false);   
  }

5. イベントハンドラ内で使用されている CheckFileType 関数を以下のように記述

//ドロップファイルがオープン可能なものであるかどうかをチェックする関数
private bool CheckFileType(string filePath)
{
 //読み込みを許可するファイルの拡張子を指定 (app.config に定義した方が本当は便利)
 string[] extnArray = { "txt", "cs", "vb", "htm", "html", "xml", "csv", "js", "vbs", "wsh" };
 foreach (string extn in extnArray)
 {
  int dotLen = extn.Length;
  if (extn == filePath.Substring(filePath.Length - dotLen, dotLen))
  {
    return true;
  }
 }
 return false;
}

6. プロパティウィンドウ内の [DragEnter] をダブルクリック
 DragEnter イベントハンドラが追加されるので、以下のようにコードを記述

private void textBox1_DragEnter(object sender, DragEventArgs e)
{
 //ドラッグされたのがファイルであるか確認
 if (e.Data.GetDataPresent(DataFormats.FileDrop))
  //ドラッグされたデータを受け取る
  e.Effect = DragDropEffects.All;
 else
  //ドラッグされたデータを受け取らない
  e.Effect = DragDropEffects.None;
}

以上でコードの実装は完了です。

Visual Studio のメニュー [デバッグ] から [デバッグ開始] を選択するか、キーボードの [F5] キーを押下してプロジェクトしてください。

アプリケーションの画面に拡張子が "txt" のファイルをドラッグ・アンド・ドロップして、ファイルの内容がロードされるのを確認してください。

うまくいかない人は以下のリンクから今回のコードを実装済みのプロジェクトを入手して、こちらでお試しください。

sample06.zip
http://cid-19ad6021fd45505c.skydrive.live.com/self.aspx/%e5%85%ac%e9%96%8b/builder/sample06.zip

ではまた。

※マイクロソフト社員のコミュニティ参加について

※このエントリは ブロガーにより投稿されたものです。朝日インタラクティブ および ZDNet Japan編集部の見解・意向を示すものではありません。
  • 新着記事
  • 特集
  • ブログ