模態對話方塊和非模態對話方塊的在關於訊息處理方面的區別

2021-05-26 20:28:26 字數 1157 閱讀 9081

windows是乙個巨大的訊息驅動結構,由使用者發出訊息,系統響應處理。

windows的訊息機制:

windows是一種物件導向的體系結構,windows環境和應用程式都是通過訊息來互動的。windows應用程式開始執行後,windows為該程式建立乙個"訊息佇列(message queue)",用以存放郵寄給該程式可能建立的各種不同視窗的訊息。訊息佇列中訊息的結構(msg)為:

typedef struct tagmsgmsg;

其中第乙個成員變數是用來標識接收訊息的視窗控制代碼;第二個引數便是訊息標識號,如wm_paint;第三個和第四個引數的具體意義同message值有關,均為訊息引數。前四個引數是非常重要和經常用到的,至於後兩個引數則分別表示郵寄訊息的時間和游標位置(螢幕座標)。把訊息傳送到應用程式有兩種方法:一種是由系統將訊息"郵寄(post)"到應用程式的"訊息佇列"這是"進隊訊息"win32 api有對應的函式: postmessage(),此函式不等待該訊息處理完就返回;而另一種則是由系統在直接呼叫視窗函式時將訊息"傳送(send)"給應用程式的視窗函式,屬於"不進隊訊息"對應的函式是sendmessage()其必須等待該訊息處理完後方可返回。  

對於每乙個正在執行的windows應用程式,系統為其建立乙個"訊息佇列",即應用程式佇列,用來存放該程式可能建立的各種視窗的訊息。應用程式中含有一段稱作"訊息迴圈"的**,用來從訊息佇列中檢索這些訊息並把它們分發到相應的視窗函式中。

訊息迴圈**是應用程式中主函式winmain ( )中類似如下的程式段:

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

由此可見,所謂"訊息迴圈",實際是程式迴圈。

windows 應用程式建立的每個視窗都在系統核心註冊乙個相應的視窗函式,視窗函式程式**形式上是乙個巨大的switch 語句,用以處理由訊息迴圈傳送到該視窗的訊息,視窗函式由windows 採用訊息驅動的形式直接呼叫,而不是由應用程式顯示呼叫的,視窗函式處理完訊息後又將控制權返回給windows。

非模態對話方塊是響應乙個訊息,系統處理乙個訊息,處理完畢後返回控制權給windows。

模態對話方塊在對話方塊建立後,掛起外部的訊息,只是響應對話方塊內部的訊息,而外部訊息則全部"過濾"掉了,直到系統接收到wm_destroy或wm_close後,系統返回控制權給模態對話方塊建立前的執行緒,繼續模態對話方塊建立前的執行緒將執行的**.

模態對話方塊和非模態對話方塊

模態對話方塊和非模態對話方塊的區別 在這裡我就說的比較通俗易懂了,就是當你開啟乙個模態對話方塊時,你的焦點不能轉移到程式的其他視窗上,也就是你只能先響應模態對話方塊,才能進行成下面的操作。而非模態對話方塊則相反,你可以不用管它,照常能夠將其他視窗啟用。建立模態對話方塊,主要是應用對話方塊的domod...

模態對話方塊和非模態對話方塊

模態對話方塊 關閉才能返回,非模態 不關閉就能返回 在資源裡新建立二個對話方塊 為新的對話方塊建立乙個類 在最原始的對話方塊函式的標頭檔案將上述兩個新新增的標頭檔案加進去,對模態按鈕進行程式設計 void cdemo11dlg onbnclickedbutton1 對非模態按鈕進行程式設計 void...

模態對話方塊和非模態對話方塊

模態對話方塊 modal dialogue box 是指在使用者想要對對話方塊以外的應用程式進行操作時,必須首先對該對話方塊進行響應。如單擊 確定 或者 取消 按鈕等將該對話方塊關閉,它和非模態對話方塊都是永遠置頂的,它們的區別在於當對話方塊開啟時,是否允許使用者進行其他物件的操作。開啟模態對話方塊...