之所以在以
ceditview
作為基類的程式中可以響應回車鍵,是由於該程式的視類本身就是乙個
edit
控制項,這就是問題的關鍵所在。
ceditview
作為cview
的派生類能響應從鍵盤輸入的各種訊息,其中有和鍵盤輸入相關的
wm_char
、wm_keydown
、wm_keyup
等訊息。我們就可以在這些訊息的響應函式中靈活地設計程式去捕捉到回車鍵的輸入,並執行響應的操作。
當我們將編輯框作為乙個普通的控制項放到對話方塊上時情況就發生了變化。在此我們以
cformview
為例,它也是
cview
的乙個派生類,視是乙個
form
窗體(即對話方塊),當放有編輯框的窗體有回車鍵輸入時,由於只有編輯框可以接受從鍵盤輸入的字元,所以當鍵盤按下時統統把訊息都發給了編輯框(在
windows
下每個視窗、按鈕、編輯框都看作乙個視窗,都可以接受訊息),可以通過
classwizard
在"object ids"
選中編輯框所對應的
id號,在右邊的訊息框中可以看出該編輯框並不能響應
wm_char
等訊息,只能用
en_change
事件來做類似的響應。可當我們加入了對該事件的處理函式時,卻又將回車鍵當作控制字元,當輸入回車鍵並不會激發
en_change
事件,也就是說用這種方法仍舊無法捕獲回車鍵的輸入。
三、攔截回車鍵的思路與方法
windows
作業系統下各個視窗、控制項歸根結底都是通過系統的各種各樣的訊息來相互協調、相互聯絡的,而我們所遇到的這個問題換到訊息的角度說就是
"如何使程式能響應在編輯框上輸入的回車鍵所發出的訊息
",只要能響應到這個訊息,剩下的工作都可以在訊息處理函式中完成。所以有必要對
windows
系統的訊息機制做些了解。 每個
windows
應用程式開始執行後,
windows
都為該程式建立乙個
"訊息佇列(
message queue)"
,用來存放郵寄給該程式可能建立的各種不同視窗的訊息。訊息佇列中訊息的結構
(msg)為:
typedef structtagmsgmsg;
在系統下最常用的訊息迴圈是呼叫
getmessage()
函式從訊息佇列中取出訊息,然後呼叫
despatchmessage()
函式讓系統把訊息傳送給視窗函式,一般情況下其結果是把視窗的所有訊息都傳送給視窗函式。但特殊情況下可以在
getmessage()
函式獲得訊息而又沒傳送出去之前,通過
translatemessage()
函式可以中途對訊息進行解析,可以對指定的訊息進行攔截,攔截後即可以照樣傳送出去,也可以不繼續傳送,完成對該訊息的攔截,下面**是該過程的示例:
msg msg;
while(getmessage(&msg,null,null,null,null)
由於按下回車鍵時把產生的訊息加入到訊息佇列中了,也傳給了編輯框,但僅僅是由於編輯框沒有能力處理該訊息而造成了無法對回車鍵的響應,所以可以在訊息迴圈裡在把訊息傳送到編輯框之前就對訊息進行攔截,並對其進行處理。其效果同編輯框響應回車鍵是一樣的,僅在時序上有所提前而已。上述**是在
sdk(
software develope kits
)下使用的,在
mfc(microsoftfoundation class)
下早已對其進行了封裝,可以通過過載虛函式
pretranslatemessage()
對所關心的訊息進行解析:
bool ctestview::pretranslatemessage(msg*pmsg)
{if (wm_keyfirst <= pmsg->message &&pmsg->message <= wm_keylast)
{if(pmsg->wparam==vk_return )
{updatedata(true);
回車鍵的使用
在vc中建立一基於對話方塊的工程,編譯執行,成功。面對著剛剛建立的工程,心裡那個高興呀。突然一時心血來潮,按了個回車鍵,工程一閃而過沒了。再編譯執行,成功。按了個esc鍵,工程一閃而過也沒了。為什麼會這樣,因為cdialog 中有預設對enter和esc鍵的處理。解決這種一按回車和esc鍵就關閉工程...
MFC實現編輯框對回車鍵的響應
首先把文字編輯框屬性裡的want return選上。然後可以通過過載虛函式pretranslatemessage 對所關心的訊息進行解析 bool ctestview pretranslatemessage msg pmsg return cformview pretranslatemessage ...
MFC實現編輯框對回車鍵的響應
首先把文字編輯框屬性裡的want return選上。然後可以通過過載虛函式pretranslatemessage 對所關心的訊息進行解析 bool crightview pretranslatemessage msg pmsg return cformview pretranslatemessage...