用回车键实现MFC对话框中TAB键控件输入焦点在控件中跳转的效果(转)
用回車鍵實現MFC對話框中TAB鍵控件輸入焦點在控件中跳轉的效果(轉)
版權聲明:轉載時請以超鏈接形式標明文章原始出處和作者信息及本聲明
http://hcq11.blogbus.com/logs/54217707.html
必須重載WM_GETDEFID,因為當用戶按下回車鍵時,Windows發送WM_GETDEFID消息來獲得缺省的命令ID,Windows再將它作為WM_COMMAND發送,所以重載這個消息必須在高位字中返回DC_HASDEFID。 如下所例:
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
??? ON_MESSAGE(DM_GETDEFID, OnGetDefID)
??? ...
END_MESSAGE_MAP()
LRESULT CMyDlg::OnGetDefID(WPARAM wp, LPARAM lp)
{
??? return MAKELONG(0,DC_HASDEFID);
}
??????? 這是一種方法,另外一種方法是在消息循環處著手處理。重載PreTranslateMessage這個虛函數,將消息隊列中有關鍵盤按下的消息給攔載下來,在框架之前處理WM_KEYDOWN消息。判斷是按下回車鍵后,我們可以用GetNextDlgTabItem 函數獲得TAB鍵序中下一個或上一個接受TAB鍵的控件句柄。示例代碼如下:
BOOL CKeydownDlg::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);
}
??????? 但是,各位有沒有注意到。這樣處理之后,雖然可以在各個控件之進行輸入焦點的轉移。可是當一個按鈕控件獲得了焦點之后,也是按下回車鍵。以前我們習慣中或者說預料中按下該按鈕的后應該執行的功能沒有被執行,而焦點又跑到按鈕之后的控件上去了。這就是上面代碼的不足之處,雖然實現了焦點由回車鍵控件轉移,但是按鈕卻不能用回車鍵來操作了。只以用鼠標,這和大家習慣不合。而且,在快速的數據輸入中不能用回車鍵來按下這個按鈕卻要用鼠標來點擊也有違當初我們要快速這樣一個目的。所以,還得對以上代碼做適當的修改。代碼如下。
??????? 在這里增加了對當前焦點控件類的判斷,即如果當前控件是按鈕(Button)那么就不執行焦點跳轉而是構造一條WM_COMMAND消息發送給程序,讓程序以為是鼠標點擊了該按鈕。從而執行了這個按鈕具有的功能而不是什么也不做的焦點轉移。
BOOL CKeydownDlg::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);
}
?
TAB ORDER按回車鍵使下個控件自動獲得焦點
1.選中主對話框:Layout菜單=>Tab Order(或者直接按Ctrl+D):按你需要的TAB順序依次單擊控件.
2.按Ctrl+W打開MFC ClassWizard=>Message Maps選項卡:給你的主DLG映射PreTranslateMessage消息處理函數:
BOOL CYourDlg::PreTranslateMessage(MSG* pMsg)
{
??? // 順次傳遞焦點,除非當前焦點在確定按鈕上時才響應觸發消息
??? if((pMsg->message == WM_KEYDOWN) && (VK_RETURN == (int) pMsg->wParam))
??? {
??????? if(GetFocus()->GetDlgCtrlID() != IDOK)
??????? {
??????????? pMsg->wParam = VK_TAB;
??????? }
??? }
??? return CDialog::PreTranslateMessage(pMsg);
}
總結
以上是生活随笔為你收集整理的用回车键实现MFC对话框中TAB键控件输入焦点在控件中跳转的效果(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MFC处理回车窗口消失
- 下一篇: MFC下列表控件的使用