当前位置:C++技术网 > 资讯 > MFC基于对话框程序的键盘响应

MFC基于对话框程序的键盘响应

更新时间:2015-06-25 16:45:23浏览次数:1+次

    基于对话框的MFC程序,基类有OnOk和OnCancel两个函数,分别是响应确定和取消按钮退出程序的。如果生成程序时,将这两个按钮删掉而没有重载这两个函数的话,那么按回车键或ESC键就会退出程序,因为默认的确定按钮和回车键都是调用基类的OnOk函数来结束程序,ESC键和取消按钮是调用基类的OnCancel函数来结束程序的,其中窗口右上角以及系统菜单的关闭程序都是调用OnCancel按钮来结束程序的,如果重载了这两个函数而什么也不做的话,那不能够从程序中正常退出。
    解决办法就是在这两个函数的重载版本中实现关闭功能,同时还可以实现其他功能。但是对话框中的控件的键盘响应就不能简单的重载这两个函数了,因为这样的话还要进行鼠标单击的测试,就麻烦了点。这样最好的解决方法是:截获键盘消息,将主窗口的回车和ESC键屏蔽,然后截获控件的键盘消息进行响应,自然,基类的这两个函数就无法执行了,从而达到要求。
    解决方法1:重载虚函数OnOK()和OnCancel()
    如图所示:
   
   1.1 如果不删除按钮,双击按钮即可实现重载。自动生成的按钮响应函数中,已经添加好了基类的OnOK函数调用,用来关闭窗口的。如果需要关闭窗口,则保留,不需要则去掉。OnCancel是取消按钮重载的。
   1.2 如果要删除默认的确定和取消按钮,则手动在类向导中添加。方法:选中对话框类,查看属性,在属性中,选择”重写“,找到OnOK和OnCancel,选择”添加“进行重载。自动会添加CDialog::OnOK();这句代码,是调用基类函数来关闭窗口,如果不需要关闭窗口,则去掉这个函数调用,如果需要最终关闭窗口,则保留。OnCancel的重载实现与OnOK类似,就不重复了。
    解决方法2:如果想去掉按钮,可以通过重载以上两个函数解决。默认的确定按钮是对应的回车键进行响应,而取消按钮和窗口右上角的关闭按钮以及ESC键是对应的。如果想实现去掉回车键和ESC键,也去掉两个默认按钮,但是想让关闭按钮有效,此时简单的重载是不够的,所以,还需要换种角度来做。那就是:拦截键盘消息,屏蔽回车和ESC键,直接去掉两个按钮,这样,通过关闭按钮是可以关闭窗口的。
    下面给出窗口屏蔽回车键和ESC键的消息。通过重载虚函数PreTranslateMessage来实现,其实就是对消息预处理函数进行重载,从而可以对屏蔽回车键和ESC键的响应。

BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{
    // 屏蔽ESC键
    if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE)
    {
        return TRUE;
    }
    // 屏蔽回车键
    if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
    {
        return TRUE;
    }
    return CDialog::PreTranslateMessage(pMsg);
}