非模態對話方塊的訊息處理

2021-04-09 10:57:09 字數 1688 閱讀 4450

模態對話方塊的處理方法是dlg.domodel()==idok ....

但是模態對話方塊的訊息處理則不然,需要另外註冊訊息處理事件

今天看到一本書中這麼處理,做個記錄:

//向winproc中註冊處理事件

static const uint nmymsg = ::registerwindowmessage(findmsgstring);

//手動新增訊息對映

on_command(id_user_msg, onmymodeless)

然後是訊息函式實現

下面是windows sdk 詳細參考:

在sdk中使用非模態對話方塊時,主迴圈中必須插入下列**: 

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

} 我的問題是:

1、為什麼要呼叫isdialogmessage??

2、非模態對話方塊與主視窗有什麼區別?

3、如果不呼叫isdialogmessage,訊息能不能傳遞到對話方塊?

4、如果一定要呼叫isdialogmessage,那麼如果有多個非模態對話方塊的話,是否對每乙個非模態對話方塊都必須單獨呼叫isdialogmessage?如果真是這樣,mfc是如何處理的?因為mfc隱藏了主訊息迴圈,我如何增加對isdialogmessage的呼叫? 

要搞掂這一連串的問題,首先要明白isdialogmessage的作用,不要被它的名字搞懵。

isdialogmessage並不是象它的名字那樣用來檢查對話方塊訊息的,而是用來解釋或轉換訊息的,更貼切的名字應該是translatedialogmessage。 

與translateaccelerator有點類似,isdialogmessage解釋非模態對話方塊訊息。例如,它對映tab鍵和shift+tab鍵到對話方塊前/後的控制,並且對映箭頭鍵到對話方塊相應的操作。你可以將它看成是對話方塊中專門內建的解釋訊息的加速鍵表。實際上,isdialogmessage不是對話方塊專用的-你可以在任何有控制的視窗中使用它來實現與在對話方塊中一樣的鍵盤行為。但是因為它的第乙個引數是對話方塊的hwnd,所以實際上你必須應用中的每乙個非模態對話方塊都呼叫這個函式。通常當你建立對話方塊時可以獲得乙個全程的hwnd型別變數g_hdlg。 

現在對問題一(為什麼要呼叫isdialogmessage?)的回答也同時解決了問題四中的前半部分。

下乙個要解決的問題是:mfc如何進行對話方塊訊息的解釋?在mfc中使用了乙個複雜的虛函式:cwnd::pretranslatemessage,這個虛函式讓任何視窗訊息自己進入主訊息迴圈,而不用去修改視窗自身的迴圈。以下是cdialog::pretranslatemessage的預設實現**: 

bool cdialog::pretranslatemessage(msg* pmsg)

換句話說,cdialog還傳遞訊息到另乙個虛函式:cwnd::pretranslateinput 

bool cwnd::pretranslateinput(lpmsg lpmsg)

return false;

} cwnd::isdialogmessage實際上是乙個用m_hwnd作為hwnd引數呼叫全程::isdialogmessage的打包函式。這就導致了mfc中每乙個對話方塊解釋自己的輸入。如果你同時執行五個對話方塊,每乙個對話方塊的pretranslatemessage都呼叫isdialogmessage-所以說你就不必做什麼了。mfc實在是牛啊,你壓根就不必去操心isdialogmessage,它會自己運轉良好。

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

windows是乙個巨大的訊息驅動結構,由使用者發出訊息,系統響應處理。windows的訊息機制 windows是一種物件導向的體系結構,windows環境和應用程式都是通過訊息來互動的。windows應用程式開始執行後,windows為該程式建立乙個 訊息佇列 message queue 用以存放...

模態對話方塊與非模態對話方塊

1.對話方塊分類 按工作方式不同,可將對話方塊分成兩類 模態對話方塊 modal 在關閉模態對話方塊之前,程式不能進行其他工作 如一般的 開啟檔案 對話方塊 非模態對話方塊 modeless 非模態對話方塊開啟後,程式仍然能夠進行其他工作 如一般的 查詢與替換 對話方塊 2.對話方塊建立 模態對話方...

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

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