對話框及其子控件的內部創建過程之詳細分析

創建非模態對話框時,首先程序最先開始調用CreateDialogIndirectParam函數來創建對話框  ,
 在CreateDialogIndirectParam中調用CreateWindowEx函數創建對話框主框架,
這時 CreateWindowEx函數發出WM_CREATEX消息,開始調用OnCreate函數。
注意這時所有對話框的子控件都還沒創建 ,所以在OnCreate函數中對子控件所作的任何操作都會導致內存非法訪問。
 OnCreate函數成功返回後,創建主對話框的CreateWindowEx接着返回。 注意:這時纔開始創建對話框子窗口控件。
 接着根據對話框模板中子控件的信息,開始依次調用CreateWindowEx創建子控件,
 比如這時,對話框模板中的子控件的位置和大小信息將作爲CreateWindowEx函數的參數被傳進函數, 子控件的默認位置,就在這時被確定下來了。
這裏對話框模板中有幾個子控件,CreateDialogIndirectParam就將調用幾次CreateWindowEx函數。
等所有子控件創建完畢後,CreateDialogIndirectParam發出WM_INITDIALOG消息, 調用對話框的OnInitDialog的函數,
這時仍需注意: 否則極易出錯,比如這時你將對話框基類的OnInitDialog函數註釋掉, 那麼這時你對子控件的操作將會失敗,
 因爲在對話框基類的OnInitDialog函數中調用了UpdateData,UpdateData又調用了DoDataExchange,DoDataExchange又調用了DDX_Control,來子類化控件。
 所以如果對話框基類的OnInitDialog函數沒有得到調用,控件就無法完成子類化, (Toto我猜想你昨天說的控件句柄爲NULL,估計是這種情況),
那麼這時如果你通過控件的包裝類來操作子控件比如MoveWindow移動子控件,
你會發現 控件句柄爲NULL當然還有可能是你把對話框基類的OnInitDialog函數放在了後面來調用了,
在這個函數之前操作 子控件,那麼也會出現控件句柄爲NULL的現象。
 最後OnInitDialog返回後,CreateDialogIndirectParam接着返回,就進入模態循環了~~ 完畢!

發佈了49 篇原創文章 · 獲贊 4 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章