2024/04/24「多機能ファイラーAs/Rの魅力と活用法」を出版、KView32公開

C++Builderでの、ファイルのドロップ【drag and drop】の処理

C++Builder

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も参考にしてください。

タイトルとURLをコピーしました