プログラミングメモ →目次

エクスプローラなどからのファイルドロップ(VC++)

エクスプローラなどからファイルを自分のアプリケーションのウィンドウズにドラッグアンドドロップできれば、格好がいいだけじゃなく、アプリケーションの操作もしやすくなります。DragAcceptFiles()などのAPI関数を使えば、エクスプローラなどからのファイルドロップが簡単に実現できます。

1.事前準備。DragAcceptFiles()関数を呼び出します。CWndから派生クラスを利用する場合は、CWndのメンバー関数void DragAcceptFiles( BOOL fAccept = TRUE );を呼び出します。直接にAPIのVOID DragAcceptFiles(HWND hWnd, BOOL fAccept);を呼び出しても結構です。いずれにして、引数のfAcceptTRUEに設定します。

2.ドロップされた時の処理。
CWndから派生クラスを利用する場合は、void OnDropFiles(HDROP hDropInfo);をオーバーライドして実装します。ドロップされたファイルの数とファイル名を調べてから、ファイルに関する処理をします。

void CWndTest::OnDropFiles(HDROP hDropInfo)
{
    static TCHAR FileName[MAX_PATH];
    //ドロップされたファイルの数
    int FileNum = DragQueryFile(hDropInfo, 0xffffffff, FileName, sizeof(FileName));
    for(int i = 0; i < FileNum; i++)
    {
        //第i番目のファイル名を受け取る
        DragQueryFile(hDropInfo, i, FileName, sizeof(FileName));
        //TODO:ドロップされたファイルのパスネームがFileNameに保存されています。
        //FileNameを使って、ファイルを開いたりして処理できます。
    }
    DragFinish(hDropInfo);
}

SDKでメッセージを処理する場合は、WM_DROPFILESというメッセージを受け取ったら、ドロップされたファイルの数とファイル名を調べしから、ファイルに関す る処理をします。WM_DROPFILESメッセージのwParamに、ドロップされたファイルを表す内部データ管理するハンドルを保存されています。HDROP hDropInfo= (HDROP)wParam;

case WM_DROPFILES: ファイルがドロップされた時の処理
    {
        HDROP hDropInfo=(HDROP)wParam;
        static TCHAR FileName[MAX_PATH];
        int FileNum = DragQueryFile(hDropInfo, 0xffffffff, FileName, sizeof(FileName));
        for(int i = 0; i < FileNum; i++)
        {
            DragQueryFile(hDropInfo, i, FileName, sizeof(FileName));
            //TODO:ドロップされたファイルのパスネームがFileNameに保存されています。
            //FileNameを使って、ファイルを開いたりして処理できます。
        }
        DragFinish(hDropInfo);
    }
    break;