問題
在MFC編程中,我們經常會使用到模態對話框,模態對話框的一個典型特徵是當對話框彈出後,其父窗口將不接受任何UI響應,直到關閉當前的模態對話框後才能繼續。然而,非模態對話框就沒有這個限制,今天我們就來講講如何在MFC中使用非模態對話框。
Step by step
1) 在VS的資源管理器中新建一個對話框資源。
2) 為這個對話框新建對話框類,這裡將對話框類命名為CTestDlg。
3) 對話框資源及對話框類創建好之後,需要在父窗口類中定義一個指向對話框對象的指針。例如,我們的對話框類名為CTestDlg,那麼我們就需要在父窗口類中定義一個CTestDlg指針。
4) 在父窗口類的構造函數中初始化m_pTestDlg為空。
5) 創建並顯示非模態對話框。
6) 對話框關閉並銷毀
對話框的關閉:
可以使用DestroyWindow函數實現。
對話框的銷毀:
由於對話框是動態在堆內存上創建的,當我們不再使用到這個對話框後,我們需要手動銷毀對話框並釋放內存,否則會造成內存洩漏。方法如下:重寫CTestDlg的PostNcDestroy虛函數,其函數實現為delete this,也即在非模態對話框窗口銷毀之後,自動釋放對話框對象的內存。
7) OnOK和OnCancel的處理
當用戶在對話框上點擊OK按鈕或者敲擊回車,系統會自動調用OnOK虛函數。當用戶在對話框上點擊Cancel按鈕或者敲擊ECS,系統會自動調用OnCancel虛函數,如果我們需要在這些事件發生時做一些自定義處理,則可以重寫這兩個虛函數。
8) WM_SIZE消息處理
當對話框上有子控制項時,我們需要映射對話框的WM_SIZE消息並編寫子控制項的自適應代碼。
9) 客戶區拖動
當我們希望用戶通過拖動對話框的客戶區來改變對話框的位置時,可以重寫OnNcHitTest方法。
總結
今天主要講解了如何使用MFC中的模塊對話框,有了這個技能,就可以做出一些比較有意思的界面了。