日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用回车键实现MFC对话框中TAB键控件输入焦点在控件中跳转的效果(转)

發布時間:2023/12/2 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用回车键实现MFC对话框中TAB键控件输入焦点在控件中跳转的效果(转) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

用回車鍵實現MFC對話框中TAB鍵控件輸入焦點在控件中跳轉的效果(轉)

版權聲明:轉載時請以超鏈接形式標明文章原始出處和作者信息及本聲明
http://hcq11.blogbus.com/logs/54217707.html

近日在為一個數據應用寫數據輸入界面,大量的編輯框要想實現快速的輸入就是有設計良好的符合工作流程的TAB鍵序。相信,不少的人在使用具有大量編輯框的程序時都有這樣的想法和感概。而我這個對話框界面主要輸入的是數字,因此如果使用TAB鍵作編輯框之間的跳轉會在使用數字鍵盤時不方便。因此,就考慮了用回車鍵來實現TAB鍵的功能。因為MFC對話框的特點,基于MFC對話框的對話框按下回車鍵會調用框架內的的OnOk成員函數導至退出。即使你去掉IDC_OK按鍵的BS_DEFPUSHBUTTON 屬性也是不行的。
必須重載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键控件输入焦点在控件中跳转的效果(转)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。