IIn*_*ble 10 c c++ user-interface winapi
WM_NEXTDLGCTL的文档指出,此消息将与对话框一起使用:
发送到对话框过程以将键盘焦点设置为对话框中的其他控件.
如果此消息不能与非对话框控件父项一起使用,则以通用方式(如此问题中所示)对控件进行子类化将非常繁琐,因为窗口过程必须调用SetFocus或发送WM_NEXTDLGCTL消息,基于确定背景并不是一件容易的事.
由于其他特定于对话框的API可以与非对话窗口(例如IsDialogMessage)一起使用WM_NEXTDLGCTL,因此能够在此设置中使用也很自然.
问题:可以WM_NEXTDLGCTL与非对话控制父母一起使用吗?
mar*_*inj 11
WM_NEXTDLGCTL可以与非对话控制父项一起使用吗?
我不认为你可以在非对话框父窗口中使用它(至少不改变父窗口),原因是它是在里面实现的DefDlgProc.所以你的其他非对话窗口必须调用它来使这个消息工作.
这是我在旧事物中发现的引用:整个Windows演变中的实际发展:DefDlgProc内部会发生什么?
在观察WM_NEXTDLGCTL消息的注释时,DefDlgProc函数通过更新所有内部对话管理器簿记来处理WM_NEXTDLGCTL消息,确定哪个按钮应该是默认值,所有这些好东西.
它是仅对话消息的另一个原因是它(引自msdn for WM_NEXTDLGCTL):
设置默认控件标识符
要做到这一点,必须发送DM_SETDEFID,定义为:
#define DM_SETDEFID (WM_USER+1)
Run Code Online (Sandbox Code Playgroud)
因此它是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);
}
}
Run Code Online (Sandbox Code Playgroud)
所以,如果你不想对你的父窗口代码进行重大更改,那么我恐怕你运气不好.
| 归档时间: |
|
| 查看次数: |
864 次 |
| 最近记录: |