window訊息機制 四

2021-06-07 04:12:25 字數 2897 閱讀 3881

注:可能你看這些東西的時候有些亂,不過沒關係,這很正常,多看幾下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傳送乙個訊息給應用程式。訊息本身是作為乙個記錄傳遞給應用程式的,這個記錄中包含了訊息的型別以及其他資訊。例如,對於單擊滑鼠所產生的訊息來說,這個記錄中包含了單擊滑...