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

来源:互联网 发布:centos apache公网ip 编辑:程序博客网 时间:2024/04/28 23:37


为了使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);
}


0 0
原创粉丝点击