修改窗口过程函数:按下回车后 焦点转移到下一个编辑框

本文介绍了两种方法实现按下回车键后,焦点自动转移到编辑框的下一个控件。方法一是通过定义新的窗口过程函数,截获回车键并设置焦点;方法二是利用控件的Tab Stop属性,结合消息处理函数来切换焦点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


为了使EDIT控件能收到回车键 属性mutiline要改为TRUE

方法1 ======================================================================

WNDPROC prevProc;


LRESULT CALLBACK NewEditProc
(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
if(uMsg==WM_CHAR && wParam==0x0d) //截获回车键
{
//输入焦点传入下一个编辑框
::SetFocus(::GetNextWindow(hwnd,GW_HWNDNEXT));
//GetNextWindow返回下一个窗口的句柄

//或者 ::SetFocus(::GetWindow(hwnd,GW_HWNDNEXT));

//或者 ::SetFocus(::GetNextDlgTabItem(::GetParent(hwnd),hwnd,FALSE)); //控件要保留WS_TABSTOP属性
return 1;
}
else
{
//调用先前的窗口过程来处理该消息
return prevProc(hwnd,uMsg,wParam,lParam);
}
}


BOOL CMy0618ADlg::OnInitDialog()

{
::prevProc=(WNDPROC)::SetWindowLongA(this->GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,(LONG)::NewEditProc);
//核心函数 SetWindowLong 为窗口设置一个新的窗口过程函数,返回先前的窗口过程函数地址

}


方法2 =====================================================================================

利用TAB STOP

控件要用Tab stop属性  (默认就有)WS_TABSTOP

void CMy0618ADlg::OnBnClickedOk()
{

this->GetNextDlgTabItem(this->m_wnd,FALSE)->SetFocus(); //FALSE下一个 
//CDialogEx::OnOK();
}


BOOL CMy0618ADlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN)
{
if(pMsg->wParam==13 )
{
CWnd* p;
p=this->GetFocus();

//回车按下后 焦点仍在EDIT框时 这里会运行一次

//焦点被自动转到OK按键后,这里会再运行一次 所以要把IDOK给滤掉
if(this->GetDlgItem(IDOK)!=p)

{
this->m_wnd=p;
}
}
}
return CDialogEx::PreTranslateMessage(pMsg);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值