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 控制消息的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2017 c++ win32 控制台项目模板