ファイルのドラッグ&ドラップのサンプルプログラム

icon 項目のみ表示/展開表示の切り替え

概要

本プログラムにファイルをドラック&ドロップするとリストビューに登録されます。
ドラッグドロップ後にOKボタンをクリックすると1ファイルごとにメッセージボックスに表示されます。

変更履歴

2014.04.24 初版
2014.05.07 exeファイル実行前にドラッグ&ドロップした場合のファイル名にダブルコーテーションが付加される場合に対応

テスト環境

コンパイラ

Visual C++ 2008/2013 Express 32/64bit マルチバイト/UNICODE

実行環境

Windows XP Professional Service Pack 3 32bit(Virtual Box上の仮想マシーン)
Windows 7 Enterprise Service Pack 1 64bit

動作例

プログラムソースの概要

gpretxt.cpp

_tWinMain

_tWinMain関数よりダイアログボックスを表示します。

DlgProc1

ダイアログの初期化時にDlgProc1関数がWM_INITDIALOGメッセージが発生し、DragAcceptFiles APIを読み出すことによりファイルのドラッグ&ドラッグの受付を許可します。
本プログラム起動時に引数があった場合は、リストボックスにその内容を設定します。
ファイルがドラッグ&ドラッグされるとDlgProc1関数にWM_DROPFILESメッセージが発生するので、DragQueryFile関数で最初にファイルの個数を取得し、次にファイル名を取得します。
取得されたファイル名は、リストボックスに登録します。
OKボタンがクリックされると、DlgProc1関数にWM_COMMANDメッセージが発生するので、OKボタンのメッセージの場合、リストボックスの内容を取得しメッセージボックスに表示します。

ソースコード

drop.cpp

// 本プログラムにファイルをドラックドロップするとリストビューに登録されます。
// ドラッグドロップ後にOKボタンをクリックすると1ファイルごとにメッセージボックスに表示されます。

#include <windows.h>
#include <commctrl.h> 
#include <tchar.h>
#include "resource.h"


LRESULT CALLBACK DlgProc1(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);

TCHAR* file=0;

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPreInst,TCHAR* lpszCmdLine, int nCmdShow){
        TCHAR f[MAX_PATH];
        if(lpszCmdLine[0]){
                if(lpszCmdLine[0]==_T('\"')){
                        _tcscpy_s(f,sizeof(f)/sizeof(TCHAR),lpszCmdLine+1);
                        f[ _tcslen(f) -1]=_T('\0');
                        file=f;
                }else
                        file=lpszCmdLine;
        }
        DialogBox(hInstance, TEXT("DLG1"), 0, (DLGPROC)DlgProc1);
        return 0;
}

LRESULT CALLBACK DlgProc1(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam){
        TCHAR buf[MAX_PATH];
        HDROP hDrop;
        UINT fmax;
        int     i;
        switch (msg) {
                case WM_INITDIALOG:
                        DragAcceptFiles(hDlg, TRUE);
                        if(file)
                                SendMessage(GetDlgItem(hDlg,IDC_LISTBOX1) , LB_ADDSTRING , 0 , (LPARAM)file);
                        return TRUE;
                case WM_DROPFILES:
                        hDrop = (HDROP)wParam;
                        fmax = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, NULL, 0);
                        for(i = 0; i < (int)fmax; i++) {
                                DragQueryFile(hDrop, i, buf, sizeof(buf)/sizeof(TCHAR));
                                SendMessage(GetDlgItem(hDlg,IDC_LISTBOX1) , LB_ADDSTRING , 0 , (LPARAM)buf);
                        }
                        DragFinish(hDrop);
                        break;
                case WM_COMMAND:
                        switch (LOWORD(wParam)) {
                                case IDOK:
                                        fmax=(UINT)SendMessage(GetDlgItem(hDlg,IDC_LISTBOX1) ,LB_GETCOUNT,0,0);
                                        for(i = 0; i < (int)fmax; i++){
                                                SendMessage(GetDlgItem(hDlg,IDC_LISTBOX1) ,LB_GETTEXT,i,(LPARAM)buf);
                                                MessageBox(hDlg,buf,_TEXT("ファイル名"),MB_OK);
                                        }
                                        EndDialog(hDlg, TRUE);
                                        return TRUE;
                                case IDCANCEL:
                                        EndDialog(hDlg,FALSE);
                                        return FALSE;
                                default:
                                        return FALSE;
                        }
                        default:
                                return FALSE;
        }
        return TRUE;
}

resource.h

#define IDC_LISTBOX1 2001

resource.rc

#include <windows.h>
#include "resource.h"


DLG1 DIALOG DISCARDABLE  0, 0, 174, 185
STYLE DS_MODALFRAME | WS_POPUP
CAPTION "ファイル名"
FONT 9, "MS Pゴシック"
BEGIN
        CONTROL "ListBox", IDC_LISTBOX1, "LISTBOX", WS_CHILD | WS_VISIBLE | WS_VSCROLL | LBS_DISABLENOSCROLL , 7, 26, 160, 128
        LTEXT                   "ここへファイルをドラッグドロップしてください",-1,7,7,168,10
        DEFPUSHBUTTON   "OK",IDOK,62,168,50,14
END

実行ファイルとソースファイルのダウンロード