2016-12-15 10 views
1

C++でボタンにイベントハンドラを追加します。ボタンは、メインウィンドウ(hWndを)に表示され私は次のようにC++でボタン作成

HWND btn = CreateWindow(
    "BUTTON", 
    "OK", 
    WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 
    10, 
    10, 
    100, 
    100, 
    hWnd, 
    NULL, 
    (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), 
    NULL); 

を私はかどこそれを与える方法がわかりませんイベントハンドラ。助けてください?

+4

誰かが答えようとする前に、いくつかのアドバイス - 良い本や参考書なしでWindows APIコードを試してみないでください。 APIは非常に複雑すぎて、盲目のコードを書くことができません。ウィンドウを作成してイベントハンドラを追加する方法を正確に示した書籍やリファレンスなどがいくつかあります。 winapi用語で – PaulMcKenzie

+0

それはcではない+ +です。秒:これはスクリプトではありません。貼り付けて実行するだけです。 –

+0

まずは別のものを選択してください。 http://stackoverflow.com/questions/20640330/winapi-bn-clicked-how-to-identify-which-button-was-clicked#20640498 –

答えて

2

ボタンをクリックすると、BN_CLICKED通知メッセージ(WM_COMMANDメッセージが運ぶ)が親ウィンドウに送信されます。 BN_CLICKED通知コードは、メッセージのwParamHIWORDにあります。メッセージのwParamLOWORDには、ボタンのIDがあります。メッセージのlParamには、ボタンのHWNDがあります。これは、すべてオンラインのWindowsドキュメントにあります。 Google for BN_CLICKED

この疑似コードを考えてみましょう。メモリからのものです。基本的に、あなたが既に持っているウィンドウプロシージャにWM_COMMANDケース内のものを追加します。

LRESULT WINAPI YourWindowProc(HWND hWnd, UINT nMsg, WPARAM wp, LPARAM lp) 
{ 
    switch (nMsg) 
    { 
     case WM_COMMAND: 
     { 
     switch (HIWORD(wp)) 
     { 
      case BN_CLICKED: 
      { 
       switch (LOWORD(wp)) 
       { 
        case IDC_BUTTON1: // or whatever the ID of your button is... 
        { 
        // do stuff for button... 
        break; 
        } 
       } 
       break; 
      } 
     } 
     break; 
     } 

     default: 
     return DefWindowProc(hWnd, nMsg, wp, lp); 
    } 

    return 0; 
} 
3

クリックされたボタンを検出するための3つの方法があります。

  1. 好ましい方法は、ボタンの親ウィンドウのウィンドウプロシージャにWM_COMMANDハンドラを追加することです。ボタンをクリックすると、BN_CLICKED通知が親ウィンドウに送信されます。これは、ボタンのMSDNのドキュメントに記述されています

    Handling Messages from a Button

    Notification Messages from Buttons

  2. 自分が所有していない親ウィンドウにボタンを追加する場合は、あなたがSetWindowsLongPtr(GWL_WNDPROC)かを使用して親ウィンドウをサブクラス化することができますSetWindowSubClass()を入力してから、BN_CLICKEDのように送信されたメッセージを処理できます。これは、サブクラス化コードが親ウィンドウを所有する同じスレッドで実行されている場合にのみ機能します。

    また、ボタン自体をサブクラス化し、代わりにキーボードとマウスのメッセージを処理することもできます。

  3. もう1つの方法は、SetWinEventHook()イベントを受信するようにイベントフックを設定することです。EVENT_OBJECT_INVOKEDイベントを受信します。 event callback procedureでは、提供されたhwnd,ID、およびidChildのパラメータは、クリックされたボタンなど、呼び出されているコントロールを識別します。

関連する問題