山本ワールド
Windowsプログラミング
アルゴリズム Vitual C++ 2008/2013によるWin32/Win64 APIレベルのプログラム 基礎 Vitual C++ 2008/2013によるAPIレベルのプログラム(32/64bit) Wix3でインストーラーを作る Visual C++ 2008 Standard Editonによるフォームアプリケーションのプログラム(32/64bit) Vitual C++ 2008 Standard EditonによるAPIレベルのプログラム(32/64bit) Windows 7対応 Visual C++ 2008 ExpressによるAPIレベルのプログラム Visual C++ 2005 ExpressによるAPIレベルのプログラム Visual C++ Versiosn 5 BORLAND C++ Windowsプログラム全般 Excel VBA その他ファイルのドラッグ&ドラップのサンプルプログラム
概要
本プログラムにファイルをドラック&ドロップするとリストビューに登録されます。
ドラッグドロップ後にOKボタンをクリックすると1ファイルごとにメッセージボックスに表示されます。
変更履歴
2014.04.24 初版
2014.05.07 exeファイル実行前にドラッグ&ドロップした場合のファイル名にダブルコーテーションが付加される場合に対応
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
Copyright (C) 2012 山本ワールド All Rights Reserved.