- ベストアンサー
【Windowsアプリ】ファイルのドラッグ&ドロップについて
C言語でのWindowsアプリの勉強をしています。(始めたばかりです) ***.exeにファイルをD&Dした際、 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 上記の"lpCmdLine"にファイルパスが入るのはわかったのですが、別のファイルパスの取得方法として、 1.***.exeを実行 2.ウィンドウ表示 3.ウィンドウ内にファイルをD&D 4.ファイルパスを取得 の方法がわかりません。 DragAcceptFiles()や、DragQueryFile()を使うと思うのですが、WinAPIの使い方がいまいち良くわかっていない状況です。 自分で勉強するべきというのは承知の上でのお願いしたいのですが、どなたか出来ればサンプルソースなど教えて頂けるとうれしいです。 環境はテキストエディタでソースを作成→Borland C++ Compiler 5.5でコンパイルしています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 ウィンドウの拡張スタイルにWS_EX_ACCEPTFILESを指定して、WM_DROPFILESで受け取ります。以下参考程度に。 TCHAR szTitle[MAX_PATH] = "drag and drop"; TCHAR szWindowClass[MAX_PATH] = "drag and drop"; LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch( message ) { //ココに飛び込んでくる case WM_DROPFILES: { HDROP hDrop = (HDROP)wParam; TCHAR tchName[MAX_PATH]; //tchNameにドロップされたファイル名が入っている ::DragQueryFile(hDrop, 0, tchName, sizeof(tchName)); //ココでファイルを開く //終了 ::DragFinish(hDrop); } case WM_DESTROY: PostQuitMessage( 0 ); break; default: return DefWindowProc( hWnd, message, wParam, lParam ); } return 0; } ATOM MyRegisterClass( HINSTANCE hInstance ) { WNDCLASSEX wcex = {sizeof(wcex)}; wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_DDTEAD); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = (LPCSTR)IDC_DDTEAD; wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); return RegisterClassEx( &wcex ); } BOOL InitInstance( HINSTANCE hInstance, int nCmdShow ) { HWND hWnd = ::CreateWindowEx(WS_EX_ACCEPTFILES, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if( !hWnd ) { return FALSE; } ShowWindow( hWnd, nCmdShow ); UpdateWindow( hWnd ); return TRUE; } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MSG msg; MyRegisterClass( hInstance ); if(!InitInstance( hInstance, nCmdShow ) ) { return FALSE; } while(::GetMessage(&msg, NULL, 0, 0) ) { ::TranslateMessage( &msg ); ::DispatchMessage( &msg ); } return msg.wParam; }
その他の回答 (1)
- oo5goo
- ベストアンサー率29% (9/31)
「猫でもわかるプログラミング」のコードです。 以下のインクルードが必要です //インクルード #include <shellapi.h> #pragma comment(lib, "shell32.lib") //ライブラリ追加 後は参考URLでどうでしょうか?
お礼
「猫でもわかるプログラミング」のサイトを教えて頂いただけでも、ものすごい収穫です! ありがとうございました!
お礼
ご丁寧にソースコードを書いて頂きありがとうございました! 何とかドロップしたファイル名を取得する事が出来ました! また質問させていただく機会があると思うので、その時はまたよろしくお願いします。