頭條資訊 - 為您提供最新最全的新聞資訊,每日實時更新

對話框窗口過程返回值的解釋

科技數碼 漫漫開發路

關於對話框窗口過程返回值

有時候,很多朋友會對對話框窗口過程(Dialog Procedure)的返回值感到疑惑,今天我試著使用一種不同的方法來給大家”翻譯翻譯”。

對話框過程實際上需要向操作系統返回兩種信息:

1) 這個消息是否已經得到了處理?

2) 如果得到了處理,返回值應該是什麼?

因為在傳統的C語言中,一個函數只能返回一個值,但是在對話框窗口過程中需要返回上述提到的兩種信息,那咋辦?需要想出一種方法來返回這兩種信息。

方法如下

對話框窗口過程的返回值表明了消息是否得到了處理。第二條信息,關於返回值應該是什麼則會在存儲在DWLP_MSGRESULT消息中。

換句話說,系統實現的默認對話框過程DefDlgProc,會看起來像如下這樣:

對話框窗口過程返回值的解釋

如果你返回任何非0值,則通過SetWindowLongPtr(hdlg, DWLP_MSGRESULT, value)設置的值將作為消息的處理結果值。

舉個例子,許多WM_NOTIFY消息處理函數可以用來被重寫為返回TRUE。

如果希望一個列表視圖(ListView)的標籤取消編輯,則可以在LVN_BEGINLABELEDIT消息處理函數中返回TRUE。

但是如果你在一個對話框窗口過程中這樣做,則你需要分兩步來這樣做,思路如下:

SetWindowLongPtr(hdlg, DWLP_MSGRESULT, TRUE);

return TRUE;

上面代碼中的第二行為對話框窗口過程設置了一個返回值TRUE,這就相當於告訴DefDlgProc,這個消息已經得到了處理,所以不需要系統再進行默認的消息處理了。而第一行告訴DefDlgProc,向消息的發送者(這裡是列表視圖控件)返回TRUE。如果你忘記這樣做,則你希望返回的值可能不會被列表視圖控件收到。

另外需要注意的地方是,DefDlgProc會在發送消息之前將DWLP_MSGRESULT設置為0,所以,如果對話框窗口過程忘記設置它,則消息處理的結果會為0。

基於上面的分析,從對話框窗口過程函數返回之前調用SetWindowLongPtr是非常重要的。如果你在設置DWLP_MSGRESULT值和返回TRUE之前做了其他的操作,則可能會觸發某一條消息發送給窗口過程,就會導致消息的處理結果恢復為默認的0。

一些注意的地方

還有一小部分的特殊消息沒有遵循上面的原則,具體可以參考DialogProc的幫助文檔。為什麼會有這些例外存在呢?

因為在最初設計對話框管理器(Dialog Manager)時,設計者認為對這些特殊的消息進行特殊的處理,可以使得對話框窗口過程更加容易編寫,因為你可能不希望在從窗口過程返回時還需要額外的設置一下DWLP_MSGRESULT。幸運的是,從那個時候開始,後面沒有人再添加新的例外消息了。

畢竟,比起不需要再編寫SetWindowLongPtr(hdlg, DWLP_MSGRESULT, desiredResult),記住這些例外的消息心理負擔可難多了。

對話框窗口過程返回值的解釋

轉載請超鏈接註明:頭條資訊 » 對話框窗口過程返回值的解釋
免責聲明
    :非本網註明原創的信息,皆為程序自動獲取互聯網,目的在於傳遞更多信息,並不代表本網贊同其觀點和對其真實性負責;如此頁面有侵犯到您的權益,請給站長發送郵件,並提供相關證明(版權證明、身份證正反面、侵權鏈接),站長將在收到郵件24小時內刪除。
加載中...