winapi BN_CLICKED how to identify which button was clicked?
我正在使用c ++创建一个简单的win32程序,尽管我认为我仅在此应用程序中使用c。 我需要确定在应用程序上按下了哪个HWND按钮。 我搜索了msdn参考,它只告诉我HIWORD是BN_CLICKED消息的通知代码,而LOWORD是标识符。 我已经设法确定何时单击按钮,但是它仅适用于所有按钮。 我的所有按钮都是在WM_CREATE消息中创建的。 到目前为止,这是我设法做到的:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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)进行比较,但这在编译时给了我一个错误。 我想我也尝试过将它与lParam的HIWORD和LOWORD进行比较,后者也没有编译。 现在我不知道下一步该怎么做。
为每个按钮提供自己的ID,并将其传递给hMenu参数中的CreateWindowEx,该参数用于此操作:
A handle to a menu, or specifies a child-window identifier, depending
on the window style.
1 2 3 4 5 6 7 8 | #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:
1 2 3 4 5 6 7 | case WM_COMMAND: { if ( LOWORD( wParam ) == BTN_PLUS ) { [...] } [...] break; } |
您只需要查看
1 2 3 4 | if ((HWND)lParam == hPlus) { //"plus" clicked ... etc. } |
尽管在代码中,您需要将
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | // 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; |
您确定,我