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作下比較即可區分出是需要哪個編輯框對回車鍵作出響應。小結:本文通過對消息的解析實現了對特定編輯框的回車鍵的響應,在對消息機制有了基本的了解之后,可以用與本文類似的方法,對代碼稍作改動,就可以使其他一些不能響應非凡消息的控件能接收、處理特定的消息。新聞熱點
疑難解答