2017-05-06 3 views
2

私はちょっと混乱しています。ファイルがWS_EX_ACCEPTFILESとウィンドウ上にドラッグされたとき、それはDragQueryFileにWPARAMを渡すことはできませんか?

https://msdn.microsoft.com/en-us/library/windows/desktop/bb774303(v=vs.85).aspx

WPARAM =(WPARAM)(HDROP)あるhDropによれば、WM_DROPFILESにUINTメッセージを設定WndProcメソッド関数へのPostMessageを配置し、フラグが立てられ、ですから、私はWPARAMを使ってHDROPを初期化するか、それをDragQueryFileに渡すことができますか?

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { 
switch (message) { 
case WM_CREATE: 
    return 0; 

case WM_DROPFILES: 
    TCHAR* FilePath; 
    HDROP hDrop = wParam; //wParam cannot be used to ini. an entity of type HDROP 
    //HDROP hdrop = (HDROP)wParam; initialization of hDrop is skipped by case label 
    DragQueryFile(wParam, 0, FilePath, 0); //wParam not compatible 
    return 0; 

case WM_DESTROY: 
    PostQuitMessage(0); 
    return 0; 
} 
return DefWindowProc(hwnd, message, wParam, lParam); 
} 

あらゆる種類のヘルプがあります。

+0

ここに 'C++'タグがあるのはなぜですか?これは純粋なCです。 – i486

+0

@ i486:C++コンパイラをパスしている場合、C++です。私はCがその誤りを与えると確信していない。 –

+0

@BoundaryImposition C++コンパイラは、 '.c'ソースファイルのCコンパイラとして動作します。 Win32 APIはC言語であり、上記の例ではC++はありません。 – i486

答えて

0

あなたはほぼそこにいます。あなたは正しい答えを持っていましたが、caseラベルの使用に関するさまざまな誤りのためにコメントアウトしました。 HDROPWPARAMで後ろに行くのではなく、別のエラーを修正してください)

キャストは正しいですが、実際にはケースにボディがないため、またはそれ自身の範囲)、それは誤りのは、あなたを伝えるものです:

case WM_DROPFILES: { 
    TCHAR FilePath[MAX_PATH]; 
    HDROP hdrop = (HDROP)wParam; 
    DragQueryFile(hdrop, 0, FilePath, 0); 
    return 0; 
} 

をここに私はブロックスコープを導入し{}を追加しました。

+0

'DragQueryFile'の引数として' hdrop'を使うべきではありませんか? 'lpszFile'と' cch'の引数も間違っています。事前に割り当てられたバッファとそのサイズを渡すか、必要なバッファサイズを得るために 'lpszFile'に' NULL'を渡すことになっています。 – zett42

1

wROPAMをHDROPにキャストしてから、バッファを提供するドロップされたファイルパスを反復処理する必要があります。

case WM_DROPFILES: 
{ 
    auto const drop_handle{reinterpret_cast<::HDROP>(wParam)}; 
    auto const dropped_files_count 
    { 
     ::DragQueryFileW(drop_handle, 0xFFFFFFFF, nullptr, 0) 
    }; 
    ::std::vector<wchar_t> buffer; 
    for(::UINT dropped_file_index{0}; dropped_files_count != dropped_file_index; ++dropped_file_index) 
    { 
     auto const file_path_symbols_count_excluding_terminating_null 
     { 
      ::DragQueryFileW(drop_handle, dropped_file_index, nullptr, 0) 
     }; 
     if(0 < file_path_symbols_count_excluding_terminating_null) 
     { 
      auto const buffer_size{file_path_symbols_count_excluding_terminating_null + 1}; 
      buffer.resize(buffer_size); 
      auto const copied_symbols_count_excluding_terminating_null 
      { 
       ::DragQueryFileW(drop_handle, dropped_file_index, buffer.data(), buffer_size) 
      }; 
      if(copied_symbols_count_excluding_terminating_null == file_path_symbols_count_excluding_terminating_null) 
      { 
       buffer.back() = L'\0'; // just in case.... 
       // buffer now contains file path... 
      } 
     } 
    } 
    break; 
} 

しかしさえWM_DROPFILESが動作するはず取り扱いものの、ドラッグアンドドロップを処理するため兼ね備え方法は、アプリケーションのためのIDropTarget interfaceregister it as drop target handlerを実装することであることに注意してください。

関連する問題