【发布时间】:2016-05-15 08:13:08
【问题描述】:
我的主窗口是使用 CreateDialogParam() 创建的无模式对话框,我需要使用加速器。我应该在调用 TranslateAccelerator() 之前调用 IsDialogMessage() 还是相反?这两个哪个是正确的,为什么?
if(!IsDialogMessage(hDlg, &msg))
{
if(!TranslateAccelerator(hDlg, hAccel, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
或
if(!TranslateAccelerator(hDlg, hAccel, &msg))
{
if(!IsDialogMessage(hDlg, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
【问题讨论】:
-
首先使用 MSDN 示例代码 IsDialogMessage()。如果对话代码已使用该消息,则不应进一步处理它。
-
当我使用 IsDialogMessage() 时,第一个加速器不起作用。 hDlg 是主窗口的句柄。 hDlg 有一些子控件
-
如果它以一种方式而不是另一种方式起作用,你为什么还要问?
-
我想了解为什么首先调用 IsDialogMessage() 时加速器不起作用
-
根据您的特定加速器,它们很可能会与对话框导航键发生冲突。这可能是默认对话框管理器的实现,也可能是对键盘输入贪婪的对话框控制 (WM_GETDLGCODE)。如果您想安全起见,请按照 Raymond Chen 的做法:The dialog manager, part 9: Custom accelerators in dialog boxes。
标签: winapi