VS2008, MFC 編程 對話框 筆記3 - 實現回車鍵 在Edit Control控件 輸入焦點切換(此方法比較麻煩)

1. 一般情況,當按回車鍵 會觸發default按鍵,而一般來講是 確定 按鈕 ,此時會程序會退出,原因是 確定 按鈕 的Defalut Button屬性 設爲true,過程中調用了基類的OnOK函數:

2. 在新建的Dialog類中,增加 Windows 消息處理INITDIALOG,但是不太一樣的是 要在重寫裏面添加

3. 用來轉移焦點的Edit control控件的屬性 Multiline 設爲True

4.雙擊 資源視圖 dialog的 確定 按鈕 實現一個OnBnClickedOK() 響應函數。相關代碼:

WNDPROC prevProc;//新建一個窗口過程類型
LRESULT CALLBACK WinTstProc(
	HWND hwnd,     //handle to window
	UINT uMsg,     //message identifier
	WPARAM wParam, //first message parameter
	LPARAM lParam  //second message parameter
							)//窗口過程函數原型
{
	if(uMsg == WM_CHAR && wParam == 0x0d)//如果是回車鍵,
	{
		//把編輯焦點傳到下一個控件
        //本函數是全局函數,只能使用平臺SDK來進行
		//::SetFocus(::GetNextWindow(hwnd,GW_HWNDNEXT));//方式1,GW_HWNDNEXT Returns a handle to the window below the given window
		//::SetFocus(::GetWindow(hwnd,GW_HWNDNEXT));//方式2,使用平臺GetWindow
		::GetNextDlgTabItem(::GetParent(hwnd)/*獲取對話框句柄*/,hwnd,FALSE);//需要Edit control 屬性Tapstop 爲True
		::SetFocus(::GetNextDlgTabItem(::GetParent(hwnd),hwnd,FALSE));

	}
	else
	{
		//讓先前的窗口去處理
		return prevProc(hwnd,uMsg,wParam,lParam);
	}

}
BOOL CtestDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// TODO:  在此添加額外的初始化
	//要改變編輯框的窗口過程,需要在MainFrame OnCreate執行之後,所以要在OnInitDialog 這裏進行
		//第一個參數是窗口句柄, 中間是索引值參考MSDN進行設置,最後一個參數是窗口過程函數名。
	prevProc = (WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,(LONG)WinTstProc);



	return TRUE;  // return TRUE unless you set the focus to a control
	// 異常: OCX 屬性頁應返回 FALSE
}

MSDN 文件 鏈接:https://pan.baidu.com/s/1UPpu61qQMQGk4kLjYl5WbQ 
提取碼:a620

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章