TypeCodes

MFC回车键不关闭对话框以及变成TAB键效果

之前在弄完这个十六进制字符串异或的工具后,发现直接按回车键就直接关闭了工具。网上搜了下解决方案,然后自己的总结如下4种方法:

1 设置一个默认按钮(不推荐)

前文小节5中所述,只要将“进行异或”这个按钮属性中的Default Button设置为"TRUE"就行了。但是这样就直接触发这个按钮对应的事件OnBnClickedButton1,而不是对输入的数据进行合法性检查。

2 比较推荐的是重载OnOK()函数或者PreTranslateMessage()函数

首先我们需要找到这两个函数的位置,方法有两种,效果都是殊途同归:

在类视图中点击对话框类(CHexStrXorDlg),然后在“属性”中点击菜单栏上的“重写”按钮,可以选择需要重写的函数。

mfc类视图中重载函数

或者直接点击“项目”——“类向导”,“类名”选择对话框类(CHexStrXorDlg),点击“虚函数”就可以看到可以被重载的函数了,右侧是已经被重载了的函数。

mfc类向导中重载函数

3 取消回车的效果

通过重载OnOK()函数,然后函数体内不做任何处理,这样就可以直接屏蔽回车键的效果了。

1
2
3
4
5
void CHexStrXorDlg::OnOK()
{
    //CDialog::OnOK();
    return;
}
4 获取焦点位置,根据是否在Button按钮资源上做相应处理

通过重载PreTranslateMessage()消息函数,可以改变MFC的消息控制流程,能自主处理键盘和鼠标消息。于是,先捕捉到回车键所在的控件焦点,然后判断是否是Button按钮。如果焦点在Button按钮上,则给资源ID为i的Button按钮发送点击消息,否则设置下一个控件得到输入焦点。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
BOOL CHexStrXorDlg::PreTranslateMessage(MSG* pMsg)
{
    // TODO:  在此添加专用代码和/或调用基类
    if ((pMsg->message == WM_KEYDOWN && (int)pMsg->wParam == VK_RETURN))
    {
        CWnd * wind = GetFocus();
        if (wind)
        {
            //判断焦点是否在Button按钮上
            char str[50];
            CString ClassName = _T("Button");
            GetClassName(wind->m_hWnd, str, 50);
            if (ClassName == str)
            {
                UINT i = wind->GetDlgCtrlID();
                SendMessage(WM_COMMAND, i, (LPARAM)wind->m_hWnd);
                return TRUE;
            }
        }

        //获取当前焦点所在控件的下一个控件的句柄
        wind = GetNextDlgTabItem(GetFocus());
        if (wind)
        {
            //设置下一个控件得到输入焦点
            wind->SetFocus();
            return TRUE;
        }
    }
    return CDialogEx::PreTranslateMessage(pMsg);
}
5 直接把回车键的效果替换成TAB键的效果

同小节4中一样,先要获取焦点位置信息,但是直接将回车的效果替换成TAB键的效果。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
BOOL CHexStrXorDlg::PreTranslateMessage(MSG* pMsg)
{
    if ((pMsg->message == WM_KEYDOWN && (int)pMsg->wParam == VK_RETURN))
    {
        //把回车效果替换成TAB键的切换效果
        if( GetFocus->GetDlgCtrlID() != IDOK )
        {
            pMsg->wParam = VK_TAB;
        }
    }

    return CDialogEx::PreTranslateMessage(pMsg);
}
打赏支持

Comments »