2016-05-17 5 views
3

私はこの例を見てきたWM_CommandWM_COMMANDキャッチボタンを押し++のWin32

HWND hBtn; 
HWND hBtnParent = HWND("UploadVideo"); 
HWND SelectVideoBTN, UploadBTN; 
HWND hWnd; 

HINSTANCE hUpload; 
WNDCLASSEX wcexUpload; 
int nCmdShowUpload = 1; 
using namespace std; 

LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM); 
LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    loader::alert("rrr"); 
    switch (message) 
    { 
    case WM_COMMAND: 
     if (LOWORD(wParam) == WORD(SelectVideoBTN)) { 
      loader::alert("hello"); 
     } 
     break; 
    default: 
     return DefWindowProc(hwnd, message, wParam, lParam); 
    } 
    return 0; 
} 

SelectVideoBTN = CreateWindow(
      L"BUTTON", // Predefined class; Unicode assumed 
      L"Select Video's",  // Button text 
      WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, // Styles 
      10,   // x position 
      460,   // y position 
      100,  // Button width 
      25,  // Button height 
      hWnd,  // Parent window 
      NULL,  // No menu. 
      (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), 
      NULL);  // Pointer not needed. 

     UploadBTN = CreateWindow(
      L"BUTTON", // Predefined class; Unicode assumed 
      L"Upload",  // Button text 
      WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, // Styles 
      390,   // x position 
      460,   // y position 
      100,  // Button width 
      25,  // Button height 
      hWnd,  // Parent window 
      NULL,  // No menu. 
      (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), 
      NULL);  // Pointer not needed. 

を使用してC++のWin32でボタン押下イベントを取得しようとしている - http://forums.devshed.com/programming-42/create-button-clicked-148407.html - しかし、私は非常に得ることができませんそれは働くために、それはCALLBACK WindowProcedureとも呼ばれません - 私を助けることができる人は誰ですか?

ボタンは、私が作成したwindow上に存在している、私は実行してwindowを作成 -

WNDCLASSEX vidUploader; 

    vidUploader.cbSize = sizeof(WNDCLASSEX); 

    vidUploader.style = CS_HREDRAW | CS_VREDRAW; 
    vidUploader.lpfnWndProc = WndProc; 
    vidUploader.cbClsExtra = 0; 
    vidUploader.cbWndExtra = 0; 
    vidUploader.hInstance = hUpload; 
    vidUploader.hIcon = LoadIcon(hUpload, MAKEINTRESOURCE(IDI_P2GOVIDEOUPLOADER20)); 
    vidUploader.hCursor = LoadCursor(NULL, IDC_ARROW); 
    vidUploader.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 
    vidUploader.lpszMenuName = MAKEINTRESOURCE(IDC_P2GOVIDEOUPLOADER20); 
    vidUploader.lpszClassName = (LPCWSTR)(L"UploadVideo"); 
    vidUploader.hIconSm = LoadIcon(wcexUpload.hInstance, MAKEINTRESOURCE(IDI_SMALL)); 

    RegisterClassEx(&vidUploader); 

    hInst = hUpload; // Store instance handle in our global variable 

をしてから

hWnd = CreateWindow((LPCWSTR)(L"UploadVideo"), (LPCWSTR)(L"Upload Video's"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 100, NULL, NULL, hUpload, NULL); 
if (!hWnd) 
     { 
      MessageBox(NULL, _T("Call to CreateWindow failed!"), _T("Win32 Guided Tour"), NULL); 

      return 1; 
     } 


    // The parameters to ShowWindow explained: 
    // hWnd: the value returned from CreateWindow 
    // nCmdShow: the fourth parameter from WinMain 
    ShowWindow(hWnd, 
     nCmdShowUpload); 

    UpdateWindow(hWnd); 

答えて

4

子ウィンドウを持つ(つまり、ウィンドウのウィンドウを作成しますWS_CHILDウィンドウスタイル)は、しばしばコントロールIDまたはウィンドウIDと呼ばれる固有の数値で識別されます。たとえば、WM_COMMANDメッセージを受信すると、親に渡されます。ただし、ボタンコントロールにコントロールIDを割り当てたことはありません。親ウィンドウではコントロールIDを識別できません。子ウィンドウの場合は、CreateWindowへの呼び出しでHMENUパラメータは一意の識別子運ぶために、オーバーロードされます。子ウィンドウの場合

HMENU
を、HMENUは、子ウィンドウのIDを指定しますダイアログボックスコントロールがイベントを親に通知するために使用する整数値。アプリケーションは、子ウィンドウ識別子を決定します。同じ親ウィンドウを持つすべての子ウィンドウで一意でなければなりません。

つまり、アプリケーションはコントロールに割り当てる数値を選択します。より低いIDはすでにダイアログマネージャによって使用されているので(例えば、IDOK)、コントロールIDの割り当てを開始するのが一般的です(Why do dialog editors start assigning control IDs with 100?を参照)。

WM_COMMANDハンドラでは、LOWORD(wParam)とボタンコントロールに割り当てられた識別子を比較できます。

コードに次の変更を適用する必要があります。

// Declare control IDs. This is usually done in a file called Resource.h 
#define IDC_SELECT_VIDEO (100) 

変更あなたのウィンドウ作成コード:あなたのWM_COMMANDハンドラでコントロールIDの

SelectVideoBTN = CreateWindow(
      L"BUTTON", // Predefined class; Unicode assumed 
      L"Select Video's",  // Button text 
      WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, // Styles 
      10,   // x position 
      460,  // y position 
      100,  // Button width 
      25,   // Button height 
      hWnd,  // Parent window 
      (HMENU)IDC_SELECT_VIDEO, // Assign appropriate control ID 
      (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), 
      NULL);  // Pointer not needed. 

チェック:あなたのウィンドウプロシージャが全く

switch (message) 
    { 
    case WM_COMMAND: 
     if (LOWORD(wParam) == IDC_SELECT_VIDEO) { 
      loader::alert("hello"); 
     } 
     break; 
    default: 
     return DefWindowProc(hwnd, message, wParam, lParam); 
    } 


と呼ばれていない場合は、これは、呼び出し元のスレッドにメッセージをディスパッチしていないことを意味します。 GUIスレッドは常にメッセージループを必要とします。標準メッセージループで十分:

MSG msg = {0}; 
while (GetMessage(&msg, NULL, 0, 0)) 
{ 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 
+0

私はあなたが言ったことをやったが、私はプログラムに.dllファイルを入れたときに(私はプラグインを作成しています)ウィンドウが負荷に生成されますが、私がクリックしたとき彼らがうまくいかないボタンで、私は自分の質問を編集しました – Gerwin

+0

@Gerwin:公開された答えを無効にする方法で質問を変更しないでください。あなたの編集内容を最初のバージョンに戻しました。新しい質問がある場合は、[Ask Question](http://stackoverflow.com/questions/ask)ボタンをクリックしてください。より多くの情報を追加したい場合は、コアの問題が変更されない場合は、[編集](http://stackoverflow.com/posts/37271194/edit)に質問をすることもできます。 – IInspectable

+0

申し訳ありませんが、私はちょうど1つの問題がある情報をありがとう、私はプラグインを作成しているので、プログラムがループに止まって残りのプログラムをロードしないので、私はメッセージループを使用することはできません – Gerwin