C++Builderで、フォームへのファイルのDrop処理を行う手順について説明します。
ファイルのドロップを許可する
DragAcceptFiles()関数を、ドロップを受け入れるフォームのコンストラクタか、OnShowイベント内に記述します。
最初の引数は、ドロップされたファイルを受け入れるウィンドウの識別子です。第二引数は、trueに設定します。
DragAcceptFiles(this->Handle, true);
DragAcceptFiles 関数 (shellapi.h) - Win32 apps
ウィンドウがドロップされたファイルを受け入れるかどうかを登録します。
イベント処理の追加
DragAcceptFiles()関数を追加したフォームのヘッダファイルに、WM_DROPFILESイベントを処理する関数を追加します。
具体的には、以下のコードをヘッダファイルに追加します。
private: // ユーザー宣言
//追加
void __fastcall WMDropFiles(TWMDropFiles &Message);
//追加
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_DROPFILES, TWMDropFiles, WMDropFiles)
END_MESSAGE_MAP(TForm)
ソースファイルへのイベント関数(WMDropFiles)の追加
最後に、フォームのソースファイルに、イベント関数(WMDropFiles)を追加します。
以下、参考例です。FileListは、TStringList *型のポインタ変数です。コンストラクタで、newしておきます。Dropされたファイルが、フォルダかファイルかをチェックし、実際に存在した場合は、FileListに追加しています。
void __fastcall TSDIAppForm::WMDropFiles(TWMDropFiles MSG)
{
// Dropされたファイル情報の取得
_TCHAR FileName[MAXPATH_NO + 1];
String fname = "";
F_Type type = F_FILE; // F_FOLDER
try
{
int DragNo = DragQueryFile((HDROP)MSG.Drop, 0xFFFFFFFF, NULL, MAXPATH_NO);
if( DragNo != 0 )
{
for(int i=0;i<DragNo;i++)
{
DragQueryFile((HDROP)MSG.Drop, i,
FileName, sizeof(FileName)/sizeof(_TCHAR));
fname = FileName;
if(type == F_FILE)
{
if(TFile::Exists(fname))
{
if(FileList->IndexOf(fname) == -1) // 重複チェック
{
FileList->Add(fname);
}
}
} else if(type == F_FOLDER) { // F_FOLDER
if( TDirectory::Exists(fname) )
{
if(FileList->IndexOf(fname) == -1) // 重複チェック
{
FileList->Add(fname);
}
} else if( TFile::Exists(fname) ) {
fname = TPath::GetDirectoryName(fname);
if(FileList->IndexOf(fname) == -1) // 重複チェック
{
FileList->Add(fname);
}
}
}
}
// Dropされたファイル情報の取得
DragQueryPoint((HDROP)MSG.Drop, &DropPos);
DragFinish((HDROP)MSG.Drop);
}
} __finally {
//
}
}
DragAcceptFiles 関数 (shellapi.h) - Win32 apps
ウィンドウがドロップされたファイルを受け入れるかどうかを登録します。
参考URL
以下のURLも参考にしてください。