MFC回车键不关闭对话框以及变成TAB键效果
之前在弄完这个十六进制字符串异或的工具后,发现直接按回车键就直接关闭了工具。网上搜了下解决方案,然后自己的总结如下4种方法:
1 设置一个默认按钮(不推荐)
如前文小节5中所述,只要将“进行异或”这个按钮属性中的Default Button设置为"TRUE"就行了。但是这样就直接触发这个按钮对应的事件OnBnClickedButton1,而不是对输入的数据进行合法性检查。
2 比较推荐的是重载OnOK()函数或者PreTranslateMessage()函数
首先我们需要找到这两个函数的位置,方法有两种,效果都是殊途同归:
在类视图中点击对话框类(CHexStrXorDlg),然后在“属性”中点击菜单栏上的“重写”按钮,可以选择需要重写的函数。
或者直接点击“项目”——“类向导”,“类名”选择对话框类(CHexStrXorDlg),点击“虚函数”就可以看到可以被重载的函数了,右侧是已经被重载了的函数。
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 »