在CDialog派生类中阻止转义键

时间:2012-06-06 12:40:05

标签: mfc cdialog

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

1 个答案:

答案 0 :(得分:0)

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

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

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

相反,在资源编辑器中创建加速器表并向其添加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时阻止对话框关闭时执行其他操作。