在VC++中文本框控件如何通过回车键转移焦点
在VC,,中文本框控件如何通过回车键转
移焦点 计算机系统应用2004年第8期
在VC++中文本框控件如何通过回车键转移焦点 theShiftofFocusBetweenEditboxusingENTERinVC++
蔡伟丰朱彦华郑少慧赵益建陈泽铭(广州铁路中心医院电脑室510080)
摘要:本文介绍了VisualC++6.O在对话框的多个文本框之问,通过回车键转移焦点
的几种方法,并提出了一个改进方法.
关冀词:VisualC4-4-6.0文本框回车键焦点
1引言
在使用VC4-4-进行各种编程时,往往要在对话框中设 置多个文本框,用于用户输入各种信息,但是用户在输入数 据时,默认方式下必须用Tab键在文本框之间转移焦点,如 果用户输入回车键将可能使对话框退出,对于大多数用户是 非常不方便.本文介绍了输入回车键在各个文本框中转移 焦点的几种方法.
2技术难点
在对话框中,如果用户在一个单行文本框中按回车键, Windows将会自动寻找对话框的默认按钮,并执行默认按 钮的代码,或者未找到默认按钮时,则会自动执行OnOK()函 数,使对话框退出.对话框及文本框的WM—KEYDoWN或 WM-CHAR消息都无法捕捉到回车键.因此如果能捕捉到 回车键消息后向对话框发送转移焦点的WM—NE×TDL— GOTL消息,则可以解决此问题.
3几种常见的处理方法
3.1利用对话框的WM—COMMAND及映射消息 当对话框或它的某一个控件具有输入焦点时,如果按回
车键,Windows将会发送WM_COMMAND消息,并且将默 认的按钮ID值传递给该消息的参数wParam,如果没有默 认按钮,将传递IDOK值,因此通过截取WM—COMMAND的 消息并判断wParam的值转移焦点.转移焦点的方法如 下:首先获取当前焦点控件,并且判断是否为文本框控件,如 果是则发送WM_NEXTDLGCTL给对话框,使对话框将焦点 移至下一个控件.示例代码如下:
caseWMJOMMAND://截取消息
if(wParam:=IDOFDEFAULTBUTTONllwParam
==IDoK)//IDOFDEFAULTBUTTON为默认按钮的ID 值,若无默认按钮,则wParam值为IDOK
{
CWnd*pWnd=GetFocus();/供得当前焦点控
58实践经验PracticalExperience 件
BOOLbRetVal=TestlsEdItWnd(pWnd一>m— hWnd)://'#JJ断是否为文本控件
if(bRetVa1){
PostMessage(hDI8,WM—NEXTDL-GCTL,0,0L) ://发送消息将焦点转移至下一控件
retUmTRUE:
}
eIse{
EndDialo8(hDI8,TRUE);/借束对话框
returnFALSE:
}
}
break;
3.2子类化或超类化文本控件
当一个文本控件被子类化或超类化后,所有的键盘输入 将被发送至自定义子类或超类函数中,而不管该对话框是否 有默认按钮,通过在该函数中捕捉WM—KEYDOWN(或WM— CHAR)消息,加入相应代码即可.示例如下:
Ion8FARPASCALMySubCIassProo(HWNDhWnd,
WORDwMessase,WORDwParam,L0NGIParam){
switch(wMessase)
{
caseWM—
HAR:/
if((wParam==VK—RETURN)ll(wParam==VK_ TAB))/当获得回车键时,直接返回0
retum0:
eIse
return(CalIWindowPPoc(IpOIdPPoc,hWnd,
wMessase,wParam,IParam));/r~4用默认处理过程
caseWM—KEYDoWN:
if((wParam==VK—RETURN)II(wParam== VK__TAB)){/椭捉到按回车键或TAB键时
2004年第8期计算机系统应用
PostMessage(ghDIg,WM—NEXTDLGCTL,0, 0L);//发送消息给对话框,使焦点转移至下一控件
retumFALSE://返回
}
retum(CalIWindowProo(IpOIdProc,hWnd,wMes—
sage,wParem,IParam));/僦行默认的消息
break;
}
3.3创建新的对话框成员函数
这种方法允许按回车键在各个文本框中来回转移焦点, 即当前焦点为最后一个文本框时,当按回车键时将使焦点转 移至第一个文本框控件.
实现步骤如下:
(1)将对话框的默认ID值IDOK改为另一值,如lD— MYOK并将该默认按钮改为非默认按钮;
(2)为对话框的该按钮创建一个新的对话框成员函数, 这个成员函数是ID_MYOK控件的BN__cUCKED消息: (3)在第二步创建的新成员函数中加入正常的处理代 码;
(4)在对话框中加入如下函数原型:
protected:
virtualvoidOn0K(1
(5)为OnOK函数加入转移焦点的代码,例如: voidCMyDialoe::OnOKI) {
CWnd*pWndOtrl=GetFocus();/供得当前焦点控件 CWnd*pWndCtrlNextpWndCtrl! UINTcontrolID=pWndCtrl一>eetOlgOtrlID();/饭 得焦点控件的ID值
swltoh(oontroIID){
caseIDQEDIT1:
pwndOtrlNext=GetOlgltem(IDC—EDIT2):/厂通 过ID值的判断获得下一焦点控件
break;
caseIDQEDIT2:
pwndOtrlNext=GetOlgltem(IOQEOIT3):
break;
caseIDCEDIT3:
pwndOtrlNext=GetOlgltem(IDC_EDIT4):
break;
caseIDOK://当焦点为默认按钮时执行对话框的On— OK函数
CDIaloe::CriCK():
break.
defauIt:
break;
}
pwndOtrlNext一>SetFoous();/伪下一焦点控件设置焦 点
}
4改进方法
当按回车键时,将执行默认按钮的函数,因此通过在默 认按钮的函数加入相应的代码便可达到通过回车键转移焦 点,另外还可以对某一文本框输入完成后,使按回车时执行 特定功能,如查找,列表更新等.示例如下:
首先为每一个文本框控件增加文本框类型的数据成员, 下一步是编辑默认按钮处理函数
VOidCmyOIaloe::OnMyOK{)/愀认按钮的处理函数 {
CWnd*pWnd=GetFoous();/供取当前焦点控件 If(pWnd一>IsKIndOf(RUNTIME—CLASS (CEdIt)))/r#J断是否为文本框控件
{
ff(pWnd一>m—hWnd:=m—oEdItRequery.m— hWnd)
{
DoRequery();//当在查询文本框按加车键时将执行
查询功能,而不执行转移焦点
}
eIse
::PostMessage(this一>m_hWnd,WM_NEXTDL-
OCTL,0,0L);//丰苷焦点转移至下一控件
}
eIse
COialoe::OnOK();
5
本文通过介绍三种常规方法及一种改进方法,说明了如 何在各个文本框之间的焦点转移通过回车键实现,最后对于 文本框输入完成后按回车执行某种特定功能的方法.本示 例在Wlndows2000VisualC++6.0上运行通过. 参考文献
1微软,MSDN
2雷神,[Vc++技术内幕]学习笔记(10),易会网. PracticalExperlenCe宴?量t59