阻止 CDialog 派生类中的转义键



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

我不确定你指的是什么形式。我只是假设您正在使用对话框。

当您按 Esc 对话框时,不会隐藏;它被关闭,并带有 IDCANCEL 退出代码。按下 RETURN 时也会发生同样的情况。不同之处在于退出代码设置为 IDOK。

不要更改取消处理程序行为。您需要它才能知道用户实际上终止了带有"取消"按钮的对话框。

而是在资源编辑器中创建加速器表,并向其添加 Esc (VK_ESCAPE) 键。将 HACCEL 类型成员变量添加到应用。在初始化实例调用中:

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

将虚拟预翻译消息添加到您的应用程序。将以下代码放在重写中:

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

就是这样。您甚至不必为此加速器插入处理程序,除非您想在按下 Esc 时防止对话框关闭之外执行其他操作。

最新更新