エクスプローラからフォームへのドラッグアンドドロップを受け入れる方法を説明します。
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());
}
}