【问题标题】:Should I call IsDialogMessage() before TranslateAccelerator()我应该在 TranslateAccelerator() 之前调用 IsDialogMessage()
【发布时间】: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


【解决方案1】:

线程很旧,但如果有人会搜索相同的问题,这是我的看法:

出于某种原因,我需要 IsDialogMessage()。但是,当我根据“经典”将 TranslateAccelerator() 放在第二个位置时,它完全禁用了我所有的加速器,例如 F1 等。不幸的是,我无法解开这个谜团(坦率地说,没有足够努力;需要做一个特殊的测试……)相反,我打算尝试子类化,这样我就可以完全摆脱 IsDialogMessage。但后来我决定交换电话,等等,一切都开始正常了!

因此,您可以将 TranslateAccelerator() 放在 IsDialogMessage() 之前,只要确保它不会阻塞重要的击键即可。

但主要问题仍未得到解答:“为什么在第一次调用 IsDialogMessage() 时加速器不起作用?”

【讨论】:

  • 您的帖子似乎没有回答这个问题。请仅在您对此问题有答案的情况下发布。否则,您可以提出新问题。
猜你喜欢
  • 2021-12-03
  • 1970-01-01
  • 2013-01-02
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多