注:可能你看這些東西的時候有些亂,不過沒關係,這很正常,多看幾下msdn就慢慢明白了,有我寫這個專題的時候,很多概念也太不清楚,不過等我查資料寫下來後,感覺漸漸有些東西也有了點眉目,因為這本身也是個進步的過程。---小朱
(七)處理訊息
視窗過程處理訊息通常以switch語句開始,對於它要處理的每一條訊息id都跟有一條case語句。大多數windowsproc都有具有下面形式的內部結構:
switch(umsgid)
在處理完訊息後,要返回0,這很重要-----它會告訴windows不必再重試了。對於那些在程式中不準備處理的訊息,視窗過程會把它們都扔給defwindowproc進行預設處理,而且還要返回那個函式的返回值。在訊息傳遞層次中,可以認為defwindowproc函式是最頂層的函式。這個函式發出wm_syscommand訊息,由系統執行windows環境中多數視窗所公用的各種通用操作,例如,畫視窗的非使用者區,更新視窗的正文標題等等等等。
再提示一下,以wm_的訊息在windows標頭檔案中都被定義成了常量,如wm_quit=*********xx,但我們沒有必要記住這個數值,也不可能記得住,我們只要知道wm_quit就ok了。
在第二隻小板凳中我們只讓視窗過程處理了兩個訊息:乙個是wm_paint,另乙個是wm_destroy,先說說第乙個訊息---wm_paint.
關於wm_paint:
無論何時windows要求重畫當前視窗時,都會發該訊息。也可以這樣說:無論何時視窗非法,都必須進行重畫。哎呀,什麼又是"非法視窗"?什麼又是重畫啊?你這人有沒有完,嗯?
稍安勿燥,我比你還煩呢?我午飯到現在還沒吃呢!你有點耐心,來點專業精神好不好???我開始在msdn裡面找有關這個方面的內容了,別急,我找找看:
platformsdk
-->
graphics and ********** services
-->
windows gdi
-->
painting and drawing
-->
using the wm_paint message-----終於找到了。
下面是一大套理論:
讓我們把windows的螢幕想像成乙個桌面,把乙個視窗想像成一張紙。當我們把一張紙放到桌面上時,它會蓋住其他的紙,這樣被蓋住的其他紙上的內容都看不到了。但我們只要把這張紙移開,被蓋住的其他紙上的內容就會顯示出來了---這是乙個很簡單的道理,誰都明白。
對於我們的螢幕來說,當乙個視窗被另一視窗蓋住時,被蓋住的視窗的某些部分就看不到了,我們要想看到被蓋住的視窗的全部面貌,就要把另乙個視窗移開,但是當我們移開後,事情卻起了變化-----很可能這個被蓋住的視窗上的資訊被擦除了或是丟失了。當視窗中的資料丟失或過期時,視窗就變成非法的了---或者稱為"無效"。於是我們的任務就來了,我們必須考慮怎樣在視窗的資訊丟失時"重畫視窗"--使視窗恢復成以前的那個樣子。這也就是我們在這第二隻小板凳中呼叫updatewindow的原因。
你忘記了嗎?剛才我們在(三)顯示和更新視窗中有下面的一些文字:
winmain()呼叫完showwindow後,還需要呼叫函式
updatewindow
,最終把視窗顯示了出來。呼叫函式updatewindow將產生乙個wm_paint訊息,這個訊息將使視窗重畫,即使視窗得到更新.---這是程式第一次呼叫了這條訊息。
為重新顯示非法區域,windows就傳送wm_paint訊息實現。要求windows傳送wm_paint的情況有改變視窗大小,對話方塊關閉,使用了updatewindows和scrollwindow函式等。這裡注意,windows並非是訊息wm_paint的唯一**,使用invalidaterect或invalidatergn函式也可以產生繪圖視窗的wm_paint訊息......
通常情況下用beginpaint()來響應wm_paint訊息。如果要在沒有wm_paint的情況下重畫視窗,必須使用getdc函式得到顯示緩衝區的控制代碼。這裡面不再擴充套件。詳細見mdsn。
這個beginpaint函式會執行準備繪畫所需的所有步驟,包括返回你用於輸入的控制代碼。結束則是以endpaint();
在呼叫完beginpaint之後,wndproc接著呼叫getclientrect:
getclientrect(hwnd,&rect);
第乙個引數是程式視窗的控制代碼。第二個引數是乙個指標,指向乙個rect型別的結構。查msdn,可看到這個結構有四個成員。
wndproc做了一件事,他把這個rect結構的指標傳送給了drawtext的第四個引數。函式drawtext的目的就是在視窗上顯示一行字----"你好,歡迎你來到vc之路!",有關這個函式的具體用法這裡也沒必要說了吧。
關於wm_destroy
這個訊息要比wm_paint訊息容易處理得多:只要使用者關閉視窗,就會傳送wm_destroy訊息(在視窗從螢幕上移去後)。
程式通過呼叫postquitmessage以標準方式響應wm_destroy訊息:
postquitmessage (0) ;
這個函式在程式的訊息佇列中插入乙個wm_quit訊息。
在(四)建立訊息迴圈中我們曾有這麼一段話:
訊息迴圈以getmessage呼叫開始,它從訊息佇列中取出乙個訊息:
在接收到除wm_quit之外的任何乙個訊息後,getmessage()都返回true。如果getmessage收到乙個wm_quit訊息,則返回false,如收到其他訊息,則返回true。因此,在接收到wm_quit之前,帶有getmessage()的訊息迴圈可以一直迴圈下去。
只有當收到的訊息是wm_quit時,getmessage才返回false,結束訊息迴圈,從而終止應用程式。
Window訊息機制 1
為了保證發給視窗的任何過程的訊息都能夠被視窗處理,window提供兩個預設的訊息處理api defwindowproc 對應普通視窗,defdlgproc對應對話方塊的訊息處理 傳送訊息的方式 sendmessage 要求訊息立即返回,直到訊息處理完畢,將訊息結果發給呼叫者 被封裝的mfc原形函式 ...
Window訊息機制 2
對話方塊程式的初始化顯示 可以在oninitdialog中增加相應的初始處理方法。自定義訊息對映處理例項 定義乙個訊息 define wm doextwork wm user 500 在對應的對話方塊類中通過on message wm doextwork,ondoextwork 實現訊息對映,在對話...
Window 訊息大全
訊息,就是指windows發出的乙個通知,告訴應用程式某個事情發生了。例如,單擊滑鼠 改變視窗尺寸 按下鍵盤上的乙個鍵都會使windows傳送乙個訊息給應用程式。訊息本身是作為乙個記錄傳遞給應用程式的,這個記錄中包含了訊息的型別以及其他資訊。例如,對於單擊滑鼠所產生的訊息來說,這個記錄中包含了單擊滑...