C ++ Win32 API控制消息

时间:2009-11-11 03:08:32

标签: c++ api winapi

我从Win32 api开始,我使用流动的代码向我的主窗口添加一个按钮控件:


 HWND boton = CreateWindow(
    "BUTTON",   //
    "Caption",       // 
    WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // Styles.
    250,         // x position.
    10,         // y position.
    100,        // Button width.
    40,        // Button height.
    hwnd,       // Parent window.
    NULL,       // No menu.
    (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
    NULL);      // Pointer not needed.

我怎么能为它分配一个id,所以我可以在循环中获取消息,在消息循环中我试图捕获消息为WM_COMMAND但我没有得到任何结果我也尝试过WM_NOTIFY。 / p>

3 个答案:

答案 0 :(得分:2)

实际上,您无需为按钮指定ID。问题是您的代码缺少样式位CreateWindow()

您必须为父窗口指定样式BS_NOTIFY才能从Button控件接收通知。

每次点击按钮,您都会收到WM_COMMAND窗口消息(HIWORD(w_param) == BN_CLICKED)。有关详细信息,请参阅BN_CLICKED文档。

使用控件ID是不必要的,因为BN_CLICKED消息将为您提供控件的窗口句柄。因为您需要跟踪窗口句柄,以便在收到DestroyWindow时正确调用WM_DESTROY,比较按钮的窗口句柄就像使用控件ID一样简单。

答案 1 :(得分:2)

要为其分配ID,您必须使用hMenu参数。如果您已指定窗口将是子窗口(即WS_CHILD),则hMenu参数将被解释为窗口的整数ID。另外,提供BS_NOTIFY样式。


HWND boton = CreateWindow (
    "BUTTON", 
    WS_TAPSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON | BS_NOTIFY,
    250, 10, 100, 40,
    hwnd,
    (HMENU)101,  // This becomes the Control ID
    (HINSTNACE)GetWindowLong(hwnd,GWL_HINSTANCE),
    NULL);

编辑:关于BS_NOTIFY的信息特别喊出Heath Hunnicutt

答案 2 :(得分:0)

要设置窗口ID,请将其传递,就像它是HMENU一样:

(HMENU)nChildID