Top / Programming / C++Builder / エクスプローラからフォームへのドラッグアンドドロップを受け入れる

エクスプローラからフォームへのドラッグアンドドロップを受け入れる

エクスプローラからフォームへのドラッグアンドドロップを受け入れる方法を説明します。

C++Builder XE3で確認しています。
プロジェクトの_TCHARのマップ先の設定はは「wchar_t」にしています。

WM_DROPFILESメッセージを受け取るためのメンバ関数を用意します。

class TForm1 : public TForm
{
__published:    // IDE 管理のコンポーネント
  TMemo *Memo1;
private:    // ユーザー宣言
  //追加
  void __fastcall WMDropFiles(TWMDropFiles &Message);
public:     // ユーザー宣言
  __fastcall TForm1(TComponent* Owner);
protected:
//追加
BEGIN_MESSAGE_MAP
  MESSAGE_HANDLER(WM_DROPFILES, TWMDropFiles, WMDropFiles)
END_MESSAGE_MAP(TForm)
};

フォームがドラッグアンドドロップを受け入れるように設定します。

__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
  DragAcceptFiles(this->Handle, true);
}

ドラッグアンドドロップ時の処理を記述します。

void __fastcall TForm1::WMDropFiles(TWMDropFiles &Message)
{
  //ドロップされたファイルの数を取得する
  const unsigned int count = DragQueryFile((HDROP)Message.Drop, -1, NULL, 0);
  for (unsigned int i = 0; i < count; ++i)
  {
    //ファイル名を格納するのに必要なバッファを取得する
    const unsigned int length = DragQueryFile((HDROP)Message.Drop, i, NULL, 0);
    std::unique_ptr<wchar_t[]> filename(new wchar_t[length + 1]);

    //ドロップされたファイルの名前を取得する
    DragQueryFile((HDROP)Message.Drop, i, filename.get(), length + 1);

    //ファイル名をMemo1に登録する
    Memo1->Lines->Add(filename.get());
  }
}

更新履歴