C++/CLI C++/CLR ドットネット


C++ フォームアプリケーションで ドラッグドロップでファイルを 開く 読み込む


ピクチャーボックスにBMPファイルをドラッグドロップして表示とか


・ドラッグされてきたものを受け付けるようにする
 Form1.h[デザイン] コントロールのプロパティ → 動作 → AllowDrop を true にする
 デザインのプロパティで AllowDrop の項目が無い場合(PictureBoxなど)
 Form1.hのコード上で AllowDrop を true にする
 InitializeComponent関数 の中で
 this->pictureBox1->BackColor = System::Drawing::SystemColors::Control; こんな感じのその辺の行に
 this->pictureBox1->AllowDrop = true;
 と追加


・イベントを登録1
 ドラッグドロップされた時のイベントを登録したくなるが
 その前にドラッグした状態で コントロールに 入った時(マウスポインタが)のイベントを登録する必要がある


 Form1.h[デザイン] コントロールのプロパティ イベント → ドラッグ アンド ドロップ → DragEnter のイベントを追加する
 その辺をダブルクリックして


 private: System::Void pictureBox1_DragEnter(System::Object^ sender, System::Windows::Forms::DragEventArgs^ e) {
  }


 こんな感じの関数の中に


 if(e->Data->GetDataPresent( ::System::Windows::Forms::DataFormats::FileDrop)) {
    e->Effect = ::System::Windows::Forms::DragDropEffects::All;
 }
 else {
    e->Effect = ::System::Windows::Forms::DragDropEffects::None;
 }


 と書く
 ドラッグされてきたのがファイルなら受け付ける それ以外なら無視みたいな感じ


・イベントを登録2
 実際にドロップされた時のイベントを追加する

 Form1.h[デザイン] コントロールのプロパティ イベント → ドラッグ アンド ドロップ → DragDrop のイベントを追加する
 その辺をダブルクリックして


 private: System::Void pictureBox1_DragDrop(System::Object^ sender, System::Windows::Forms::DragEventArgs^ e) {
  }
 

 この感じの関数の中にドロップされた時の処理を書いていく

 ドロップされたものの内容は e->Data->GetData関数で取得する
 引数は フォーマット と false(無くても良い気がするけど 自分が作った時はfalse)
 フォーマットは ::System::Windows::Forms::DataFormats 参照 この場合 ::System::Windows::Forms::DataFormats::FileDrop

 んでこれを String ^ の配列に型変換して そのまま String ^ の配列に入れます
 コードでは


 array^ s = (array^)e->Data->GetData( ::System::Windows::Forms::DataFormats::FileDrop, false);


 こんな感じで
 これで s に ドラッグ&ドロップしたファイルのパスが入ってます


 あとは
 for( int i=0; i < s->Length; i++) {

    s[i]を開く

 }
 とすれば 複数ファイルがドロップされた時の処理も出来ます

 以上