C++ Win32 API 控制消息

Posted

技术标签:

【中文标题】C++ Win32 API 控制消息【英文标题】:C++ Win32 API Controls messages 【发布时间】: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,欢迎来到 ***!请务必更新您的个人资料,以便我们了解您。如果您想回复这些消息,那么可以回到发布这些消息的问题上。在您自己的问题的底部和每个答案的底部是灰色文本,上面写着“添加评论”。这将允许您响应 cmets。 【参考方案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

【讨论】:

以上是关于C++ Win32 API 控制消息的主要内容,如果未能解决你的问题,请参考以下文章

c++ win32从键盘获取utf8字符

Visual Studio 2017 c++ win32 控制台项目模板

Visual Studio 2017 c++ win32 控制台项目模板

C++ Win32 控制台颜色

更改整个控制台背景颜色 (Win32 C++)

程序对我在 Python 中使用 win32api 发送的消息没有反应