我不确定您所说的形式。
我只是假设您正在使用对话框。
当你按下 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 时阻止对话框关闭之外执行其他操作。