winapi BN_CLICKED如何识别点击了哪个按钮?

Vin*_*nce 7 winapi click button

我正在使用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;
Run Code Online (Sandbox Code Playgroud)

我已经尝试将hEquals与LOWORD(wParam)进行比较,但在编译时这给了我一个错误.我想我也尝试将它与lParam的HIWORD和LOWORD进行比较,它也没有编译.现在我对下一步做什么毫无头绪.

Rog*_*and 7

你只需看看lParam它的按钮手柄:

if ((HWND)lParam == hPlus)
{
    // "plus" clicked ... etc.
}
Run Code Online (Sandbox Code Playgroud)

虽然在你的代码中,你需要保留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;
Run Code Online (Sandbox Code Playgroud)

你知道了,我确定......


man*_*ell 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 );
Run Code Online (Sandbox Code Playgroud)

然后,在WM_COMMAND中,您可以测试ID:

case WM_COMMAND: {
    if ( LOWORD( wParam ) == BTN_PLUS ) {
        [...]
    }
    [...]
    break;
}
Run Code Online (Sandbox Code Playgroud)