2016-12-15 5 views
1

Я создал кнопку в C++ следующим образом:Добавить обработчик события кнопки в 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); 

Кнопка отображается в главном окне (HWND), но я не знаю, как и где, чтобы дать ему обработчик события. Любая помощь, пожалуйста?

+4

Прежде чем кто-нибудь попытается ответить, некоторые советы. Не пытайтесь писать код Windows API без хорошей книги или справки. API слишком сложный, чтобы лежать вслепую. Существует несколько книг, ссылок и т. Д., Показывающих, как создать окно и добавить обработчики событий. – PaulMcKenzie

+0

в терминах winapi это не C++. second: это не скрипт. Вы не можете просто вставить его и запустить. –

+0

выберите что-то еще для начала. http://stackoverflow.com/questions/20640330/winapi-bn-clicked-how-to-identify-which-button-was-clicked#20640498 –

ответ

2

Когда кнопка нажата, она отправляет сообщение-уведомление BN_CLICKED (переносимое сообщением WM_COMMAND) в его родительское окно. Код уведомления BN_CLICKED находится в HIWORD сообщения wParam. LOWORD сообщения wParam имеет идентификатор кнопки. lParam сообщения имеет кнопку HWND. Это все в онлайн-документах Windows. Google для 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

Есть три способа обнаружить кнопку будучи щелкнул.

  1. Предпочтительный подход заключается в добавлении WM_COMMAND обработчика к оконной процедуре родительского окна кнопки. Когда кнопка нажата, она отправляет уведомление BN_CLICKED в его родительское окно. Это описано в документации MSDN для кнопок:

    Handling Messages from a Button

    Notification Messages from Buttons

  2. При добавлении кнопки в родительском окне, что вы не владеете, вы можете унаследовать родительское окно с помощью SetWindowsLongPtr(GWL_WNDPROC) или SetWindowSubClass(), а затем вы можете обрабатывать отправленные на него сообщения, такие как BN_CLICKED. Это работает только в том случае, если код подкласса работает в том же потоке, которому принадлежит родительское окно.

    В качестве альтернативы вы можете подклассифицировать сама кнопку и обрабатывать сообщения клавиатуры и мыши.

  3. Другой вариант - установить крючок события с помощью SetWinEventHook() с просьбой принять EVENT_OBJECT_INVOKED событий. В event callback procedure предоставленные параметры hwnd, ID и idChild идентифицируют вызывающий элемент управления, такой как кнопка с нажатием.

Смежные вопросы