2013-12-17 2 views
4

Я создаю простую программу win32 с использованием C++, хотя я думаю, что я использую c только в этом приложении. Мне нужно определить, какая кнопка HWND была нажата в приложении. Я искал ссылку msdn, и он только сказал мне, что HIWORD - это код уведомления, а LOWORD - это идентификатор для сообщения BN_CLICKED. Мне удалось определить, когда нажата кнопка, но она применима только для всех кнопок. Все мои кнопки создаются в сообщении WM_CREATE. Это то, что я сумел расшевелить до сих пор:winapi BN_CLICKED, как определить, какая кнопка была нажата?

case: WM_CREATE: 
    HWND hPlus = CreateWindowEx(0, L"BUTTON", L"+", WS_CHILD | WS_VISIBLE, 130, 240, 35, 30, hwnd, (HMENU)IDC_MENU, GetModuleHandle(NULL), NULL); 
    HWND hEquals = CreateWindowEx(0, L"BUTTON", L"=", WS_CHILD | WS_VISIBLE, 170, 205, 65, 65, hwnd, (HMENU)IDC_MENU, GetModuleHandle(NULL), NULL); 
break; 

case WM_COMMAND: 
    switch(HIWORD(wParam)) 
    { 
     case BN_CLICKED: 
      MessageBox(hwnd, L"OK", "OK", MB_OK); 
      break; 
    } 
    break; 

Я попытался сравнивающие hEquals к LOWORD (wParam'а,), но это дало мне ошибку при компиляции. Я думаю, что я также пытался сравнить его с HIWORD и LOWORD от lParam, которые также не собирались. Теперь я не знаю, что делать дальше.

+0

Рад, что помог. Почему вы не приняли один из двух ответов? – manuell

+0

Привет Винс. Я снова здесь, потому что кто-то просто поддержал мой ответ. Почему вы не принимаете ответ? Просто любопытно. – manuell

+0

Я очень занят. Я очень плохо отношусь к ответам ха-ха. Я так легко отвлекаюсь и даже не могу вспомнить, для чего это был проект. – Vince

ответ

3

Дайте каждой кнопке свой собственный идентификатор, и передать его в CreateWindowEx в параметре HMenu, который используется для этого:

Ручка в меню или указывает идентификатор дочернего окна, в зависимости от типа окна .

#define BTN_PLUS 100 
#define BTN_EQUAL 101 

CreateWindowEx(0, L"BUTTON", L"+", WS_CHILD | WS_VISIBLE, 130, 240, 35, 30, 
       hwnd, (HMENU)BTN_PLUS, GetModuleHandle(NULL), NULL); 

CreateWindowEx(0, L"BUTTON", L"=", WS_CHILD | WS_VISIBLE, 170, 205, 65, 65, 
       hwnd, (HMENU)BTN_EQUAL , GetModuleHandle(NULL), NULL); 

Затем в WM_COMMAND, вы можете проверить на ID:

case WM_COMMAND: { 
    if (LOWORD(wParam) == BTN_PLUS) { 
     [...] 
    } 
    [...] 
    break; 
} 
+0

Вау, я этого никогда не знал. Я всегда думал, что меню предназначено для фактического меню для окна, например. Файл, Изменить, Окно, Справка и т. Д. – Vince

+0

@Vince: У окон верхнего уровня есть меню, у дочерних окон есть контрольные идентификаторы. Параметр используется для обоих. –

+0

И этот факт четко изложен в документации. –

5

Вам просто нужно смотреть на lParam это кнопка ручки:

if ((HWND)lParam == hPlus) 
{ 
    // "plus" clicked ... etc. 
} 

Хотя в вашем коде, вы должны будете держать HWND «S в глобальных переменных, чтобы сделать сравнение.

// somewhere global 
HWND hPlus = NULL; 
HWND hEquals = NULL; 

// in your WndProc ... 

case: WM_CREATE: 
    hPlus = CreateWindowEx(0, L"BUTTON", L"+", WS_CHILD | WS_VISIBLE, 130, 240, 35, 30, hwnd, (HMENU)IDC_MENU, GetModuleHandle(NULL), NULL); 
    hEquals = CreateWindowEx(0, L"BUTTON", L"=", WS_CHILD | WS_VISIBLE, 170, 205, 65, 65, hwnd, (HMENU)IDC_MENU, GetModuleHandle(NULL), NULL); 
break; 

case WM_COMMAND: 
    switch(HIWORD(wParam)) 
    { 
     case BN_CLICKED: 
      // see which button was clicked 
      if ((HWND)lParam == hPlus) 
      { 
       MessageBox(hwnd, L"hPlus was clicked", "OK", MB_OK); 
      } 
      break; 
    } 
    break; 

Вы получаете идею, я уверен ....

+0

Неплохая практика иметь много глобальных переменных? Во многих обучающих программах на C++, которые я наблюдал, они говорят, что не очень хорошо иметь много глобальных переменных. – Vince

+0

@Vince да, совершенно верно, но это была не твоя оригинальная проблема, и трудно судить, сколько стоит задать конкретный ответ. Я только что дал вам минимальные изменения кода, чтобы преодолеть начальную проблему. –

+0

Я пробовал это раньше, но я не сравнивал его с (HWND) hPlus или что-то еще. Вместо этого я пытался (HIWORD) hPlus, затем (LOWORD) hPlus ... полностью забыл, что он должен быть преобразован в HWND. – Vince

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