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

2021-06-22 17:55:48 字數 1637 閱讀 1506

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

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

6.}

我的問題是:

為什麼要呼叫isdialogmessage?? 非模態對話方塊與主視窗有什麼區別? 如果不呼叫isdialogmessage,訊息能不能傳遞到對話方塊? 如果一定要呼叫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的預設實現**:

1.boolcdialog::pretranslatemessage(msg* pmsg)

2.

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

1.boolcwnd::pretranslateinput(lpmsg lpmsg)

2.

7.returnfalse;

8.}

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

模態與非模態對話方塊

vc 模態對話方塊建立 domodal 模式對話方塊關閉順序 1.onclose 訊息響應函式,響應wm close訊息,當 關閉 按鈕被單擊的時候,該函式被呼叫 2.onkillfocus 訊息響應函式,響應wm killfocus訊息,當乙個視窗即將失去鍵盤輸入焦點以前被傳送 3.ondestr...

模態與非模態對話方塊

模態對話方塊就是在沒有關閉它之前,不能與同乙個應用程式的其他視窗進行互動。非模態對話方塊就是既可以與它互動也可以與同乙個應用程式的其他視窗進行互動。下面看 qt快速入門第三版 裡專案03 3 3的例子 ifndef mywidget h define mywidget h include names...

模態與非模態對話方塊

功能上區別 模態對話方塊執行時,關閉本對話方塊之前,使用者無法對本程式的其他部分進行操作。而非模態對話方塊開啟同時還可以切換到其他視窗進行操作。程式設計實現區別 模態對話方塊使用cdialog domodal函式來建立,domodal會啟動乙個模態對話方塊自己的訊息迴圈,這也是模態對話方塊要關閉後才...