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

2021-08-26 14:36:05 字數 2197 閱讀 6414

vc(mfc) 用vc實現特定編輯框上對回車鍵響應

2023年06月03日

在通常的以ceditview為基類的單文件/多文件檢視程式中,可以很好的響應鍵盤輸入的回車鍵,只需比較最近兩次的輸入的字元,看看最新輸入的字元是 否內碼是13(0x0d,回車鍵的內碼)即可識別出來,而要單獨把乙個編輯框放入對話方塊中卻根本不響應,這個看似簡單的問題在實際應用中還是解決起來比較 困難的。尤其是當乙個充當表單錄入的對話方塊上有若干個編輯框,這就要求在乙個編輯框添完一項表單後用習慣的回車鍵將該編輯框上的資料讀取到記憶體中去,並自 動將游標移動到下乙個編輯框中準備填寫下一欄表單。無疑這種介面是十分人機友好的,使錄入人員不必去執行每填一下表單就去按一下執行讀入到快取功能的按鈕 的煩瑣操作。但上述功能的實現卻並不象其演示的功能那樣簡單,下面本文就對這項技術的實現及附帶的其他技術作簡要的介紹。

[b]二、不能響應回車鍵的原因分析[/b]

之所以在以ceditview作為基類的程式中可以響應回車鍵,是由於該程式的視類本身就是乙個edit控制項,這就是問題的關鍵所在。 ceditview作為cview的派生類能響應從鍵盤輸入的各種訊息,其中有和鍵盤輸入相關的wm_char、wm_keydown、wm_keyup 等訊息。我們就可以在這些訊息的響應函式中靈活地設計程式去捕捉到回車鍵的輸入,並執行響應的操作。

當我們將編輯框作為乙個普通的控 件放到對話方塊上時情況就發生了變化。在此我們以cformview為例,它也是cview的乙個派生類,視是乙個form窗體(即對話方塊),當放有編輯框 的窗體有回車鍵輸入時,由於只有編輯框可以接受從鍵盤輸入的字元,所以當鍵盤按下時統統把訊息都發給了編輯框(在windows下每個視窗、按鈕、編輯框 都看作乙個視窗,都可以接受訊息),可以通過classwizard在"object ids"選中編輯框所對應的id號,在右邊的訊息框中可以看出該編輯框並不能響應wm_char等訊息,只能用en_change事件來做類似的響應。可 當我們加入了對該事件的處理函式時,卻又將回車鍵當作控制字元,當輸入回車鍵並不會激發en_change事件,也就是說用這種方法仍舊無法捕獲回車鍵的 輸入。

[b]三、攔截回車鍵的思路與方法

[/b]

windows作業系統下各個視窗、控制項 歸根結底都是通過系統的各種各樣的訊息來相互協調、相互聯絡的,而我們所遇到的這個問題換到訊息的角度說就是"如何使程式能響應在編輯框上輸入的回車鍵所 發出的訊息",只要能響應到這個訊息,剩下的工作都可以在訊息處理函式中完成。所以有必要對windows系統的訊息機制做些了解。

每個windows應用程式開始執行後,windows都為該程式建立乙個"訊息佇列(message queue)",用來存放郵寄給該程式可能建立的各種不同視窗的訊息。訊息佇列中訊息的結構(msg)為:

typedef struct tagmsgmsg;

在系統下最常用的訊息迴圈是呼叫getmessage()函式從訊息佇列中取出訊息,然後呼叫despatchmessage() 函式讓系統把訊息傳送給視窗函式,一般情況下其結果是把視窗的所有訊息都傳送給視窗函式。但特殊情況下可以在getmessage()函式獲得訊息而又沒 傳送出去之前,通過translatemessage()函式可以中途對訊息進行解析,可以對指定的訊息進行攔截,攔截後即可以照樣傳送出去,也可以不繼 續傳送,完成對該訊息的攔截,下面**是該過程的示例:

msg msg;

while(getmessage(&msg,null,null,null,null)

由於按下回車鍵時把產生的訊息加入到訊息佇列中了,也傳給了編輯框,但僅僅是由於編輯框沒有能力處理該訊息而造成了無法對回車鍵的響應,所以可以在訊息 迴圈裡在把訊息傳送到編輯框之前就對訊息進行攔截,並對其進行處理。其效果同編輯框響應回車鍵是一樣的,僅在時序上有所提前而已。上述**是在 sdk(software develope kits)下使用的,在mfc(microsoft foundation class)下早已對其進行了封裝,可以通過過載虛函式pretranslatemessage()對所關心的訊息進行解析:

bool ctestview::pretranslatemessage(msg* pmsg)

}return cformview::pretranslatemessage(pmsg);

}在上面的**中,首先將pmsg->message所表示的訊息同wm_keyfirst 和wm_keylast比較,確定是鍵盤訊息,然後通過訊息引數pmsg->wparam的值來判斷是否是回車鍵(vk_return,虛擬鍵碼可 以從sdk相關資料查到)。如是,可以顯示jj字元。這裡可以加響應的操作,如qq中傳送訊息不僅可用enter鍵,也可按傳送按鈕等等。

VC 透明編輯框的實現

本方法對於背景為位圖的對話方塊有效,其實也就是換了一種方式讓編輯框相對於對話方塊是透明的,把編輯框在當前對話方塊的點陣圖給擷取一部分出來用於填充編輯框 實現如下 派生乙個cedit的類,新增 cbitmap m bmp cbrush m brhollow 新增wm ctlcolor,wm lbutt...

VC 透明編輯框的實現

本方法對於背景為位圖的對話方塊有效,其實也就是換了一種方式讓編輯框相對於對話方塊是透明的,把編輯框在當前對話方塊的點陣圖給擷取一部分出來用於填充編輯框 實現如下 派生乙個cedit的類,新增 cbitmap m bmp cbrush m brhollow 新增wm ctlcolor,wm lbutt...

用VC如何改變編輯框的背景顏色

用 vc如何改變編輯框的背景顏色在vc 中,編輯框的顏色改變起來似乎很難,mfc的 cedit 類後沒有提供可改變顏色的函式。在本文中,我們將過載 cedit 類,編寫乙個可以改變背景顏色的類 cmyedit 類,將編輯框的變數定義為 cmyedit 型別來實現改變編輯框的背景顏色。一 構建應用程式...