【问题标题】:Block escape key in CDialog-derived classCDialog 派生类中的块转义键
【发布时间】:2012-06-07 08:31:59
【问题描述】:

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

【问题讨论】:

    标签: mfc cdialog


    【解决方案1】:

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

    当你按下 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 时阻止对话框关闭之外执行其他操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-12
      • 1970-01-01
      • 2019-11-23
      • 1970-01-01
      相关资源
      最近更新 更多