多个编辑框之间编辑通过回车改变焦点

本文介绍了如何在MFC应用程序中实现在多个编辑框之间通过按下回车键自动切换焦点的功能。关键在于利用WM_INITDIALOG消息处理,设置自定义消息响应,以及利用CDialog::OnOK()函数处理回车键事件,通过GetNextDlgTabItem()获取并设置下一个焦点控件。

  问题:输入完毕后,回车后直接进入下一个输入框,这个功能是怎么实现的呢?

我们知道,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来查看布局!





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值