亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

用VC實現特定編輯框上對回車鍵響應

2019-11-17 05:06:28
字體:
來源:轉載
供稿:網友
摘要:本文講述了在指定的編輯框上能響應從鍵盤輸入回車鍵的一種方法,對進程內消息的解析、動態獲取指定資源ID等技術也作了簡要描述。
要害字:Microsoft Visual C++ 6.0、編輯框、回車鍵、消息、資源 一、引言在通常的以CEditView為基類的單文檔/多文檔視圖程序中,可以很好的響應鍵盤輸入的回車鍵,只需比較最近兩次的輸入的字符,看看最新輸入的字符是否內碼是13(0x0d,回車鍵的內碼)即可識別出來,而要單獨把一個編輯框放入對話框中卻根本不響應,這個看似簡單的問題在實際應用中還是解決起來比較困難的。尤其是當一個充當表單錄入的對話框上有若干個編輯框,這就要求在一個編輯框添完一項表單后用習慣的回車鍵將該編輯框上的數據讀取到內存中去,并自動將光標移動到下一個編輯框中預備填寫下一欄表單。無疑這種界面是十分人機友好的,使錄入人員不必去執行每填一下表單就去按一下執行讀入到緩存功能的按鈕的煩瑣操作。但上述功能的實現卻并不象其演示的功能那樣簡單,下面本文就對這項技術的實現及附帶的其他技術作簡要的介紹。二、不能響應回車鍵的原因分析之所以在以CEditView作為基類的程序中可以響應回車鍵,是由于該程序的視類本身就是一個Edit控件,這就是問題的要害所在。CEditView作為CView的派生類能響應從鍵盤輸入的各種消息,其中有和鍵盤輸入相關的WM_CHAR、WM_KEYDOWN、WM_KEYUP等消息。我們就可以在這些消息的響應函數中靈活地設計程序去捕捉到回車鍵的輸入,并執行響應的操作。當我們將編輯框作為一個普通的控件放到對話框上時情況就發生了變化。在此我們以CFormView為例,它也是CView的一個派生類,視是一個Form窗體(即對話框),當放有編輯框的窗體有回車鍵輸入時,由于只有編輯框可以接受從鍵盤輸入的字符,所以當鍵盤按下時統統把消息都發給了編輯框(在Windows下每個窗口、按鈕、編輯框都看作一個窗口,都可以接受消息),可以通過ClassWizard在"Object IDs"選中編輯框所對應的ID號,在右邊的消息框中可以看出該編輯框并不能響應WM_CHAR等消息,只能用EN_CHANGE事件來做類似的響應??僧斘覀兗尤肓藢υ撌录奶幚砗瘮禃r,卻又將回車鍵當作控制字符,當輸入回車鍵并不會激發EN_CHANGE事件,也就是說用這種方法仍然無法捕捉回車鍵的輸入。三、攔截回車鍵的思路與方法Windows操作系統下各個窗口、控件歸根結底都是通過系統的各種各樣的消息來相互協調、相互聯系的,而我們所碰到的這個問題換到消息的角度說就是"如何使程序能響應在編輯框上輸入的回車鍵所發出的消息",只要能響應到這個消息,剩下的工作都可以在消息處理函數中完成。所以有必要對Windows系統的消息機制做些了解。每個Windows應用程序開始執行后,Windows都為該程序創建一個"消息隊列(message queue)",用來存放郵寄給該程序可能創建的各種不同窗口的消息。消息隊列中消息的結構(MSG)為:typedef strUCt tagMSG{/*msg*/HWND hwnd;//窗口句柄,標識接收消息的窗口。UINT message;//消息標識號,如WM_TIMER等。WPARAM wParam;//消息參數,當為鍵盤消息時,表示虛擬鍵碼如VK_RETURN等。LPARAM lParam;//消息參數。 DWord time;//郵寄消息的時間。POINT pt;//郵寄消息時的光標位置,用屏幕坐標表示。}MSG;在系統下最常用的消息循環是調用GetMessage()函數從消息隊列中取出消息,然后調用DespatchMessage() 函數讓系統把消息發送給窗口函數,一般情況下其結果是把窗口的所有消息都傳送給窗口函數。但非凡情況下可以在GetMessage()函數獲得消息而又沒發送出去之前,通過TranslateMessage()函數可以中途對消息進行解析,可以對指定的消息進行攔截,攔截后即可以照樣發送出去,也可以不繼續發送,完成對該消息的攔截,下面代碼是該過程的示例:
MSG msg;while(GetMessage(&msg,NULL,NULL,NULL,NULL){TranslateMessage(&msg);…… //對攔截的消息進行處理DispathchMessage(&msg);}由于按下回車鍵時把產生的消息加入到消息隊列中了,也傳給了編輯框,但僅僅是由于編輯框沒有能力處理該消息而造成了無法對回車鍵的響應,所以可以在消息循環里在把消息發送到編輯框之前就對消息進行攔截,并對其進行處理。其效果同編輯框響應回車鍵是一樣的,僅在時序上有所提前而已。上述代碼是在SDK(Software Develope Kits)下使用的,在MFC(Microsoft Foundation Class)下早已對其進行了封裝,可以通過重載虛函數PReTranslateMessage()對所關心的消息進行解析:BOOL CTestView::PreTranslateMessage(MSG* pMsg) {if (WM_KEYFIRST <= pMsg->message && pMsg->message <= WM_KEYLAST) {if(pMsg->wParam==VK_RETURN ){UpdateData(TRUE);AfxMessageBox(m_Text);}}return CFormView::PreTranslateMessage(pMsg);}在上面的代碼中,首先將pMsg->message所表示的消息同WM_KEYFIRST 和WM_KEYLAST比較,確定是鍵盤消息,然后通過消息參數pMsg->wParam的值來判定是否是回車鍵(VK_RETURN,虛擬鍵碼可以從SDK相關資料查到)。如是,則可以將已輸入到編輯框中的字符讀取到m_Text中,并將其顯示出來四、對編輯框的識別前面已經可以對回車鍵響應了,可一個表單窗體有若干個編輯框,其各自的處理方式不盡相同,這就有必要對編輯框進行識別、對不同的編輯框做不同的處理。而且當按下回車鍵時必須保證只有當前有焦點的編輯框能完成對回車鍵的響應動作,否則也就失去了實際意義。在Windows下的程序中,所有的資源都是有唯一標號的,使每個資源對象能唯一的區別于其他資源,所以我們可以通過資源ID來對編輯框做出區別,使之完成各自的響應處理。在Microsoft Visual C++ 6.0下可以通過"View"菜單的"ID= Resource Symboles…"查到指定ID的資源標識號的實際數值,如在本例中的兩個編輯框IDC_EDIT1和IDC_EDIT2所對應的數值分別為1000和1001,對前面的解析消息的代碼做些改動,主要如下所示:……if(pMsg->wParam==VK_RETURN ){HWND hWnd=::GetFocus();int iID=::GetDlgCtrlID(hWnd);if(iID==1000)//第一個編輯框的標識為1000{UpdateData(TRUE);AfxMessageBox(m_Text1);//顯示第一個編輯框的內容}if(iID==1001) //第二個編輯框的標識為1001{UpdateData(TRUE);AfxMessageBox(m_Text2);//顯示第二個編輯框的內容}}……在此通過API函數::GetFocus()(注重前面的"::",標識是全局API函數,而非某個類中的成員函數)取得當前光標所處的(即有焦點的)編輯框的句柄,然后通過API函數::GetDlgCtrlID()根據這個句柄返回此窗口資源的ID 號,該ID號是動態獲取的,使之同預先查看好的編輯框的ID作下比較即可區分出是需要哪個編輯框對回車鍵作出響應。小結:本文通過對消息的解析實現了對特定編輯框的回車鍵的響應,在對消息機制有了基本的了解之后,可以用與本文類似的方法,對代碼稍作改動,就可以使其他一些不能響應非凡消息的控件能接收、處理特定的消息。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91成人在线观看国产| 欧美成人免费视频| 91美女高潮出水| 国产视频精品va久久久久久| 青草热久免费精品视频| 亚洲二区中文字幕| 欧美精品免费播放| 久久中文字幕视频| 国产一区二区三区在线免费观看| 欧美乱妇高清无乱码| 日韩成人久久久| 久久久久在线观看| 中文字幕在线观看日韩| 久久国产精品影片| 欧美国产日韩一区| 91丝袜美腿美女视频网站| 在线播放国产一区中文字幕剧情欧美| 亚洲无线码在线一区观看| 国产国产精品人在线视| 亚洲国产精品人人爽夜夜爽| 69国产精品成人在线播放| 2019中文字幕在线观看| 日韩久久免费视频| 亚洲剧情一区二区| 91久久久久久久久久久| 国产在线精品播放| 日韩国产中文字幕| 久久精品夜夜夜夜夜久久| 亚洲第一视频网站| 亚洲福利在线观看| 欧美黑人一级爽快片淫片高清| 一区二区国产精品视频| 97精品久久久中文字幕免费| 欧美老女人xx| 日韩理论片久久| 中文字幕欧美日韩在线| 91青草视频久久| 日韩黄色在线免费观看| 久久久久久久久久久亚洲| 亚洲视频一区二区三区| 亚洲欧美制服第一页| 久国内精品在线| 久久亚洲成人精品| 亚洲欧美日韩天堂| 欧美电影在线观看| 国产精品2018| 欧美电影免费观看高清完整| 精品亚洲永久免费精品| 91日本在线观看| 国内自拍欧美激情| 欧美电影在线观看高清| 久久久91精品国产一区不卡| 综合av色偷偷网| 91丨九色丨国产在线| 国产午夜精品全部视频在线播放| 中文字幕精品影院| 91在线直播亚洲| 日韩在线播放视频| 亚洲嫩模很污视频| 国产精品自拍小视频| 亚洲片在线资源| 亚洲精品一区在线观看香蕉| 国产精品久久久久久久久久新婚| 最近2019中文字幕一页二页| 26uuu久久噜噜噜噜| 欧美激情视频一区二区| 日韩免费电影在线观看| 亚洲国产欧美在线成人app| 性欧美长视频免费观看不卡| 久久精品国产精品亚洲| 国产精品v片在线观看不卡| 久久久精品国产亚洲| 欧美乱人伦中文字幕在线| 久久视频免费观看| 欧美精品电影在线| 日韩精品免费在线播放| 91tv亚洲精品香蕉国产一区7ujn| 亚洲精品国精品久久99热| 欧美高跟鞋交xxxxhd| 中文字幕欧美在线| 亚洲第一国产精品| 亚洲最大福利网| 国产精品美女午夜av| 精品国产老师黑色丝袜高跟鞋| 久久亚洲综合国产精品99麻豆精品福利| 国产精品日韩一区| 亚洲国产精品字幕| 亚洲电影成人av99爱色| 亚洲国产97在线精品一区| 欧美日韩亚洲国产一区| 亚洲第一级黄色片| 亚洲国产精品专区久久| 中文字幕久精品免费视频| 欧美性资源免费| 国产精品露脸自拍| 色综合天天狠天天透天天伊人| 91精品国产高清自在线| 欧美大片在线免费观看| 久久久精品国产| 欧美成人免费全部观看天天性色| 国产精品青草久久久久福利99| 欧美日韩色婷婷| 亚洲第一av网| 色综合亚洲精品激情狠狠| 91高清免费视频| 亚洲国产精品va在看黑人| 91热福利电影| 国产在线久久久| 8x拔播拔播x8国产精品| 亚洲美腿欧美激情另类| 国产精品18久久久久久首页狼| 中文字幕在线国产精品| 国产热re99久久6国产精品| 91久久精品美女| 欧美激情综合亚洲一二区| 中文日韩电影网站| 久久久久久久亚洲精品| 精品国产91久久久久久| 国产99在线|中文| 精品久久久999| 一区二区三区视频免费| 一本色道久久88综合亚洲精品ⅰ| 国产精品亚洲网站| 久久免费成人精品视频| 欧美三级免费观看| 亚洲国产精品久久91精品| 日韩激情第一页| 日本免费久久高清视频| 黄色91在线观看| 国产精品久久网| 国产精品伦子伦免费视频| 久久综合免费视频| 亚洲区一区二区| 欧美激情精品久久久久久大尺度| 国产美女直播视频一区| 欧美日韩亚洲精品一区二区三区| 欧美精品电影在线| 色多多国产成人永久免费网站| 国产精品一区二区女厕厕| 亚洲色图美腿丝袜| 国产精品久久久久7777婷婷| 中文字幕亚洲综合久久筱田步美| 日韩亚洲成人av在线| 欧美精品久久久久a| 在线日韩精品视频| 国产午夜精品免费一区二区三区| 在线亚洲欧美视频| 国产成人综合一区二区三区| 日本欧美精品在线| 亚洲第一区在线观看| 国产精品免费久久久| 国产精品偷伦一区二区| 亚洲成年人在线播放| 热99在线视频| 亚洲jizzjizz日本少妇| 亚洲色无码播放| 亚洲自拍欧美色图| 国产精品爽爽ⅴa在线观看| 欧美成人激情在线| 久久久国产视频91| 青青a在线精品免费观看| 国产一区二区黄| 国产欧美日韩免费看aⅴ视频| 日韩中文字幕网址|