Dialog中回車、Esc導致窗口關閉的問題
如題,對于這種問題網上總結的有兩種方式來處理:
1、重載OnOk、OnCancel函數
2、重載PreTranslateMessage(MSG* pMsg) 函數。
兩種方式都能達到希望的效果。但對話框中如果存在輸入控件的話,回車事件會在控件中得不到響應。比如一個CEdit控件,回車后焦點依然在該控件中。
我們可以對上面的第二種重載函數進行一番改造,使之符合我們的預期。
將回車事件轉化為TAB事件,這樣就可以有效的解決這個問題。
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)


{
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)

{
CWnd *mwnd = GetNextDlgTabItem (GetFocus()); //取得當前焦點控件的下一個控件的句柄
if (mwnd)

{
mwnd->SetFocus(); //設置下一件控件得到輸入焦點
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
但這時候又會有個問題,如果焦點定位到了真正的OK按鈕上,這時候回車應該是觸發了按鈕的click事件,但上面的方法會導致焦點繼續轉移。與我們實際的應用有出入。那么接下來再做一次修改升級:如果是按鈕,那么我們構造一個消息發出去。
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)


{
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)

{
CWnd *wnd = GetFocus ();
if (wnd != NULL)

{
char str[256];
CString ClassName = _T("Button");
GetClassName (wnd->m_hWnd, str, 256);
if (ClassName == str)

{
UINT i = wnd->GetDlgCtrlID ();
SendMessage (WM_COMMAND, i, (LPARAM)wnd->m_hWnd);
return TRUE;
}
}
CWnd *mwnd = GetNextDlgTabItem (wnd);
if (mwnd)

{
mwnd->SetFocus();
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
這樣就既解決了回車導致關閉的問題,也同時方便了用戶回車時在按鈕上的焦點切換。
1、重載OnOk、OnCancel函數
2、重載PreTranslateMessage(MSG* pMsg) 函數。
兩種方式都能達到希望的效果。但對話框中如果存在輸入控件的話,回車事件會在控件中得不到響應。比如一個CEdit控件,回車后焦點依然在該控件中。
我們可以對上面的第二種重載函數進行一番改造,使之符合我們的預期。
將回車事件轉化為TAB事件,這樣就可以有效的解決這個問題。



















但這時候又會有個問題,如果焦點定位到了真正的OK按鈕上,這時候回車應該是觸發了按鈕的click事件,但上面的方法會導致焦點繼續轉移。與我們實際的應用有出入。那么接下來再做一次修改升級:如果是按鈕,那么我們構造一個消息發出去。




































這樣就既解決了回車導致關閉的問題,也同時方便了用戶回車時在按鈕上的焦點切換。
posted on 2011-04-21 10:06 Stone xin 閱讀(1057) 評論(0) 編輯 收藏 引用 所屬分類: Window程序開發