WM_NEXTDLGCTL 可以与非对话框控件父级一起使用吗?
我不认为你可以在非对话框父窗口中使用它(至少对父窗口没有更改),原因是它在DefDlgProc 内部实现。因此,您的其他非对话框窗口必须调用它才能使此消息起作用。
这是我在 The Old New Thing: Practical Development Through the Evolution of Windows 中找到的引述:DefDlgProc 内部发生了什么?
正如 WM_NEXTDLGCTL 消息的注释所观察到的,DefDlgProc 函数通过更新所有内部对话管理器簿记来处理 WM_NEXTDLGCTL 消息,决定哪个按钮应该是默认按钮,所有这些都是好事。
它是仅对话框消息的另一个原因是它(来自 msdn 的 WM_NEXTDLGCTL 引用):
设置默认控件标识符
为此它必须发送DM_SETDEFID,其定义为:
#define DM_SETDEFID (WM_USER+1)
所以它是 WM_USER,因此它可能用于非对话窗口的其他目的(Raymond Chens 书中也提到了这一事实)。有趣的是,根据这本书IsDialogMessage 也将 DM_SETDEFID/DM_GETDEFID 发送到您的窗口。因此,如果你想在非对话窗口中使用类似 TAB 的导航(使用对话代码),你必须遵守一些规则,你可以在里面阅读它们:What happens inside IsDialogMessage? 上面的书。这意味着使用以下消息循环:
while (GetMessage(&msg, NULL, 0, 0)) {
if (IsDialogMessage(hwnd, &msg)) {
/* Already handled by dialog manager */
} else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
因此,如果您不想对父 Windows 代码进行重大更改,那么恐怕您就不走运了。