0

我有一个列表控件和一些 CDialog 派生的无边框窗体。当用户单击特定列表项时 - 将显示特定表单。我使用 CDialog 类作为这些表单的基类。一切正常,但是当我在列表和这些控件所在的主窗口中按 Escape 键时 - 当前表单隐藏。如何阻止转义键?我应该在表单的类中定义 OnCancel 方法并防止对话框关闭,还是可以设置一些标志来解决我的问题?我主要选择 CDialog 类作为基类,以便在表单类中包含 DoDataExchange。

4

1 回答 1

0

我不确定您所说的形式。我只是假设您正在使用对话框。

当你按下 Esc 时对话框不会隐藏;它被 IDCANCEL 退出代码解除。按下 RETURN 时也会发生同样的情况。不同之处在于退出代码设置为 IDOK。

不要更改 Cancel 处理程序行为。您需要它知道用户实际上使用取消按钮终止了对话框。

相反,在资源编辑器中创建加速器表并向其添加 Esc (VK_ESCAPE) 键。将 HACCEL 类型成员变量添加到您的应用程序。在 InitInstance 调用中:

m_hAccel = LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR1));

将虚拟 PreTranslateMessage 添加到您的应用程序。将以下代码放在覆盖中:

BOOL CYourApp::PreTranslateMessage(MSG* pMsg)
{
    if(TranslateAccelerator(pMsg->hwnd, m_hAccel, pMsg))
    {
        return TRUE;
    }

    return CWinAppEx::PreTranslateMessage(pMsg);
}

这就对了。您甚至不必为此加速器插入处理程序,除非您想在按下 Esc 时阻止对话框关闭之外做其他事情。

于 2012-06-07T00:31:59.983 回答