问题:输入完毕后,回车后直接进入下一个输入框,这个功能是怎么实现的呢?
我们知道,windows是基于消息处理机制的,那么我们在处理字符输入的时候,是对输入字符的判断来确定是否需要去转移到下一个输入框!为此我们可以增加一个消息处理!
WM_INITDIALOG;关于这个函数的说明可以去查看手册,里面介绍的很清楚!
要想更改mfc中的默认的消息处理机制,可以使用SetWindowLong 这个函数,同样的额也可以查它的用法!
原理解读:在编辑框空间创建之后,显示之前,捕获输入的消息!进行人为的改变!
在增加的消息处理函数中,添加如下代码:
WNDPROC preProc;
LRESULT CALLBACK newProc(//自己定义的窗口过程函数!用来处理特殊的从键盘捕获的消息
HWND hwnd, // handle to window
UINT uMsg, // 消息的类型
WPARAM wParam, // 保存的是消息的值
LPARAM lParam // second message parameter
)
{
if(uMsg==WM_CHAR && wParam==0x0d)
{
//3个获取下一个窗口句柄的函数GetNextWindow,GetWindow,GetNextDlgTabItem
//::SetFocus(::GetNextWindow(hwnd,GW_HWNDNEXT));
//SetFocus(::GetWindow(hwnd,GW_HWNDNEXT));
SetFocus(::GetNextDlgTabItem(::GetParent(hwnd),hwnd,FALSE));
return 1;
}
else
{
return prevProc(hwnd,uMsg,wParam,lParam);//对于除了回车以外的键盘消息,交给先前的窗口过程函数,preProc()去处理
}
}
BOOL CTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
preProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,(LONG)newProc);//这个函数返回的是改变属性之前的窗体的状态,newProc是自己定义的新的窗口过程函数,而且函数名可以表达函数调用的地址!
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
但是以上只能,处理由第一个到第二个编辑框的过度,不能处理更多的编辑框的过度!那么怎么处理任意多个编辑框的过度呢?我们知道在新建对话框之后,默认的会有ok按钮,打开ok按钮的属性,我们可以发现,它是缺省的!
void CTestDlg::OnOK()
{
// TODO: Add extra validation here
CDialog::OnOK();
}
而在缺省的情况下,会调用CDialog::OnOK();函数将窗口资源回收!那么这个缺省的机制,是可以解决上面问题的!
在mfc中,当我们在窗口中输入回车的时候,就会调用缺省的函数来完成响应,而这个缺省的函数就是OnOk(),因此呢,就可以在OnOk()的函数中添加特定的消息处理:
当我们调用GetNextDlgTabItem(GetFocus())->SetFocus();来获取当前焦点的下一个焦点!默认的顺序是按照窗体控件布局的顺序,进行循环传递!
但是用以下的方法就不能达到理想的效果!
//GetDlgItem(IDC_EDIT1)->GetNextWindow()->SetFocus();
//GetFocus()->GetNextWindow()->SetFocus();
//GetFocus()->GetWindow(GW_HWNDNEXT)->SetFocus();
通过Layout->Tab Order来查看布局!