【问题标题】:C++ Win32 API Controls messagesC++ Win32 API 控制消息
【发布时间】:2009-11-11 03:08:32
【问题描述】:

我从 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。

【问题讨论】:

  • oks5,欢迎来到 StackOverflow!请务必更新您的个人资料,以便我们了解您。如果您想回复这些消息,那么可以回到发布这些消息的问题上。在您自己的问题的底部和每个答案的底部是灰色文本,上面写着“添加评论”。这将允许您响应 cmets。

标签: c++ api winapi


【解决方案1】:

要为其分配 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);

编辑:特别呼吁 Heath Hunnicutt 获取有关 BS_NOTIFY 的信息。

【讨论】:

  • 嘿,也许我应该用有关如何将其作为 ID 传递的信息来更新我的答案...:-/
  • BS_NOTIFY 仅在您想要接收 BN_CLICKED 以外的通知时才需要。
【解决方案2】:

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

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

然后,每次单击按钮时,您都会收到带有(HIWORD(w_param) == BN_CLICKED) 的窗口消息WM_COMMAND。有关更多信息,请参阅BN_CLICKED 文档。

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

【讨论】:

  • 是的,你是对的,很抱歉抢了你的风头。投赞成票。距离接受仅差 5 分。
  • 你不需要销毁 WM_DESTROY 中的窗口。拥有的窗口会在其所有者被销毁时自动销毁。如果 NULL 被传递给参数 8,那么确定。
【解决方案3】:

要设置窗口 id,将其作为 HMENU 传入:

(HMENU) nChildID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 2011-03-27
    • 2011-03-24
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2013-06-12
    相关资源
    最近更新 更多