我正在使用c ++创建一个简单的win32程序,虽然我认为我只在这个应用程序中使用c。我需要确定应用程序上按下了哪个HWND按钮。我搜索了msdn引用,它只告诉我HIWORD是通知代码,而LOWORD是BN_CLICKED消息的标识符。我已经设法确定何时单击按钮,但它仅适用于所有按钮。我的所有按钮都是在WM_CREATE消息中创建的。到目前为止,这是我设法鞭打的原因:
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进行比较,它也没有编译。现在我对下一步做什么一无所知。
答案 0 :(得分:7)
您只需要查看lParam
它是按钮句柄:
if ((HWND)lParam == hPlus)
{
// "plus" clicked ... etc.
}
虽然在您的代码中,您需要将HWND
保留在全局变量中才能进行比较。
// 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;
你明白了,我确定......
答案 1 :(得分:5)
为每个按钮指定自己的ID,并将其传递给hMenu参数中的CreateWindowEx,该参数用于:
菜单的句柄,或指定子窗口标识符,具体取决于 在窗口风格。
#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;
}