对话框Enter键与Esc键的处理问题

在MFC对话框中,经常会碰到按Enter或ESC键,对话框会被关闭的现象。
一、原因分析
MFC对话框Enter键消息机理:
1.如果Dialog中某个Button拥有Foucs,则按Enter键会响应该按钮。
在Dialog按下某按钮该按钮就会获得焦点。
2.如果Dialog中,没有任何Button拥有focus,但是Dialog有default button,则按Enter键时会响应Default Button,Default Button可以设置。
3.如果Dialog中,没有任何Button拥有focus,也没有Default Button,则按Enter键时,会给对话框发送一条WM_COMMAND消息,参数wParam被设置成IDOK(此时Windows为对话框提供了一个专用的键盘接口用于处理Enter按键消息)。

MFC对话框Esc键消息机理:
ESC键按下时,会给对话框发送一条WM_COMMAND的消息,参数wParam被设置成IDCANCEL。

WM_CLOSE消息机理:
WM_CLOSE消息(单击关闭按钮)会调用CWnd::OnClose函数,在此函数中会Send一个WM_COMMAND,wParam=IDCANCEL消息。
[源码不可见,用spy++可以看到]

我们查看源码看下CDialog对以上消息的处理:
BEGIN_MESSAGE_MAP(CDialog, CWnd)
  ON_COMMAND(IDOK, &CDialog::OnOK)
  ON_COMMAND(IDCANCEL, &CDialog::OnCancel)
END_MESSAGE_MAP()
 
void CDialog::OnOK()
{
    if (!UpdateData(TRUE))
    {
        return;
    }
 
    EndDialog(IDOK);
}

void CDialog::OnCancel()
{
    EndDialog(IDCANCEL);
}
二、解决方案
2.1重载PreTranslateMessage函数
BOOL CYourDlg::PreTranslateMessage(MSG* pMsg)  
{
    if (pMsg->message == WM_KEYDOWN)
    {
        switch(pMsg->wParam)
        {
        case VK_RETURN:
            return TRUE;

        case VK_ESCAPE:
            return TRUE;

        default:
            break;
        }
    }

    return CDialog::PreTranslateMessage(pMsg);
}
2.2重载CDialog的两个虚函数OnOK&OnCancel使其什么也不做,并重载WM_CLOSE消息的处理函数并在其中调用EndDialog(IDCANCEL)
protected:
    virtual void OnOK();
    virtual void OnCancel();

void CYourDlg::OnOK()
{
}

void CYourDlg::OnCancel()
{
}

BEGIN_MESSAGE_MAP(CYourDlg, CDialog)
    ON_WM_CLOSE()
END_MESSAGE_MAP()

protected:
    afx_msg void OnClose();

void CYourDlg::OnClose()
{
    EndDialog(IDCANCEL);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
盘上各按对应的英文名及意思如下: 1. 字母 (Letter keys): A-Z - 用于输入字母字符。 2. 数字 (Number keys): 0-9 - 用于输入数字字符。 3. 功能 (Function keys): F1-F12 - 用于执行特定的功能,如打开帮助菜单、刷新页面等。 4. 控制 (Control keys): Ctrl, Alt, Shift, Win(Command on Mac) - 用于与其他按组合使用,以执行特定的命令或功能。 5. 空格 (Space bar) - 用于输入空格。 6. 退格 (Backspace) - 用于删除光标前面的字符。 7. 删除 (Delete) - 用于删除光标后面的字符。 8. Tab (Tab) - 用于缩进或在表格和表单中切换焦点。 9. Caps Lock (Caps Lock) - 用于切换大写字母输入模式。 10. Enter (Enter) - 用于确认输入或在文本编辑器中换行。 11. 方向 (Arrow keys): 上箭头 (Up), 下箭头 (Down), 左箭头 (Left), 右箭头 (Right) - 用于在文本或界面中上下左右移动光标或选择项。 12. Esc (Escape) - 用于取消当前操作或关闭对话框。 13. Insert (Insert) - 用于切换插入模式,光标插入位置后的字符将被移动。 14. Home (Home) - 用于将光标移动到当前行的开头。 15. End (End) - 用于将光标移动到当前行的末尾。 16. Page Up (Page Up) - 用于向上滚动页面。 17. Page Down (Page Down) - 用于向下滚动页面。 18. 打印屏幕 (Print Screen) - 用于将当前屏幕内容复制到剪贴板。 19. 滚动锁定 (Scroll Lock) - 用于锁定或解锁滚动功能。 20. 暂停 (Pause) - 用于暂停或继续执行命令。 21. 小盘 (Numeric keypad): 包括数字、运算符号和小数点等 - 用于快速输入数字和执行数学运算。 这些按盘上有不同的位置和符号,但它们提供了各种功能,帮助我们进行文本输入、控制操作和执行命令。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值