CDialog
在屏幕上顯示的對話框基類
CDialog類是在屏幕上顯示的對話框基類。對話框有兩類:模態對話框和非模態對話框。模態對話框在應用繼續進行之前必須關閉。
繼承圖表
同其它窗口一樣,對話框從Windows 中獲取信息。在對話框中你會對來自對話框控制項的處理消息感興趣,因為它說明了對話框是如何與用戶交互的。ClassWizard觀察對話框每個控制項可能產生的消息,可以選擇你所希望處理的消息。ClassWizard 將適當的消息映射器入口和消息處理成員函數加到一個新類中。你只需為成員函數編寫應用的代碼。
如果喜歡,在使用ClassWizard時可以編寫自己的消息映射器入口和成員函數。
對於大多數普通對話框,可以向對話框派生類中添加成員變數以存儲數據。數據是用戶向對話框中輸入的,或者為用戶顯示數據。ClassWizard觀察對話框中與數據映射的控制項並提示為每一控制項創建一個成員變數。同時,為每一變數選擇變數類型和取值範圍。ClassWizard將成員變數加入對話框派生類中。
然後,ClassWizard寫入成員函數與對話框控制項之間的交換數據自動映射的數據。數據映射使函數可以為對話框控制項提供適當的初始值。檢索數據並對數據進行有效性檢測。
還可使用DLGTEMPLATE數據結構在內存中建立模板,該結構在聯機文檔“Win32 SDK”中有描述。當構造了一個CDialog對象之後,調用CreateIndirect創建非模態對話框,或調用InitModalIndirect和DoModal來創建模態對話框。
CDialog
程序和框架都通過調用CWnd::UpdateData間接調用DoDataExchange。當用戶單擊OK按鈕關閉模態對話框時,框架調用UpdateData(如果單擊了Cancel按鈕,將不能獲得數據)。OnInitDialog的預設方式也是設置控制項的初始值。為得到初始控制項,通常要覆蓋OnInitDialog。在所有對話框控制項建立且在對話框顯示之前,調用OnInitDialog。
在模態對話框與非模態對話框執行的任意時刻都可以調用CWnd::UpdateData。
如果要手工創建對話框,應為對話框派生類添加必需的成員變數,並添加已獲得數據值的成員函數。
關於ClassWizard的更多信息,請參閱聯機文檔“Visual C++程序員指南”中的“使用 ClassWizard”。
在應用中調用CWinApp::SetDialogBkColor為對話框設置背景色。
當用戶按下OK或Cancel按鈕,或者調用EndDialog時,模態對話框自動關閉。
當實現一個非模態對話框時,總是覆蓋OnCancel函數並從中調用DestroyWindows。不要調用CDialog::OnCancel基類。因為它會調用EndDialog,那會使對話框雖然存在但並不可視。模態對話框還應覆蓋PostNcDestory以防止刪除自身。模態對話框廠在框架中構造,不需要用PostNcDestory清除。
關於CDialog的更多信息,請參閱聯機文檔“Visual C++程序員指南”的“對話框主題”。
所需頭文件:#include
CDialog 構造CDialog對象
Create 初始化CDialog對象。創建非模態對話框和附在其上的對話框控制項
CreateIndirect 從內存中的對話框模板創建非模態對話框
InitModalIndirect 從內存中的對話框模板創建模態對話框。保存參數直到調用DoModal函數
操作 DoModal 調用模態對話框,使用后返回
MapDialogRect 將對話框的矩形單位轉換為屏幕單位
NextDlgCtrl 在對話框中將焦點移到下一個對話框控制項上
PrevDlgCtrl 在對話框中將焦點移到前一個對話框控制項上
GotoDlgCtrl 在對話框中將焦點移到指定的對話框控制項上
SetDefID 改變對話框的預設按鈕
GetDefID 獲得對話框的預設按鈕
SetHelpID 為對話框設置上下文的help ID
EndDialog 關閉模態對話框
OnInitDialog 覆蓋該函數可改變對話框初始設置
OnSetFont 覆蓋該函數可指定在對話框控制項中輸入文本時使用的字體
OnOK 覆蓋該函數可在對話框中進行OK按鈕操作。預設值是關閉對話框,DoModal返回IDOK
OnCancel 覆蓋該函數可在對話框中進行Cancel按鈕操作或按ESC鍵。預設值是關閉對話框,DoModal返回IDCANCEL
參數:
lpszTemplateName: 包含一個對話框模板資源的空終止字元串。
nIDTemplate: 包含對話框模板資源的ID號。
pParentWnd: 包含對話框的父窗口或所有者窗口對象的指針。如果其為NULL,則對話框對象的父窗口設置為主要應用程序窗口。
說明:
構造一個基於資源的模態對話框。調用構造程序的窗體,其中一個窗體通過模板便可訪問對話框。另一個一般使用帶IDD_前綴(如IDD_DIALOG1)的模板ID號實現訪問。
從內存中模板來構造模態對話框,首先需要參數和受保護的構造程序,然後調用InitModalIndirect。
使用上述方法之一構造好對話框之後,調用DoModal。
構造非模態對話框,使用CDialog構造程序中受保護的窗體。構造程序受到保護,因為必須從自己的對話框類中派生得到一個非模態對話框。
構造非模態對話框分兩步進行:首先調用構造程序,然後調用Create成員函數創建基於資源的對話框,或者從內存模板中調用CreateIndirect來創建對話框。
返回值:
如果對話框創建和初始化成功,則返回非零值,否則為0。
參數:
lpszTemplateName:包含一個對話框模板資源的空終止字元串。
nIDTemplate: 包含對話框模板資源的ID數。
說明:
調用Create,使用資源中對話框模板來創建非模態對話框。可將調用置於構造程序內部或者在構造程序啟動之後調用。
Create成員函數為訪問對話框模板資源提供了兩種方法,既可以通過模板名稱,也可以模板ID號(如IDD_DIALOG1)。
每種訪問方法都會給父窗口傳遞一個指針。如果pParentWnd為NULL,則應用的主窗口作為其父窗口或所有者窗口來進行創建。
當創建對話框后,Create成員函數應立即返回。
在父窗口中創建之後,如果要求對話框出現,則使用模板中的WS_VISIBLE風格。否則,必須調用ShowWindow。其它對話框風格及應用,請參閱聯機文檔“Win32 SDK”中的DIGTEMPLATE結構和“Microsoft Visual C++ 6.0 MFC類庫參考手冊(二)”中的“Windows風格”。使用CWnd::DestroyWindow函數來刪除由Create函數創建的對話框。
返回值:
如果對話框創建和初始化成功,則返回非零值,否則為0。
參數:
lpDialogTemplate:包含用於創建對話框的對話框模板的指針。該模板位於DLGTEMPLATE結構和控制項信息表單中。有關結構的更多信息,請參閱聯機文檔“Win32 SDK”。
hDialogTemplate:包含對話框模板的全局內存的句柄。模板使用DLGTEMPLATE結構的形式。
說明:
調用該成員函數從對話框模板中創建一個非模態對話框。
當創建對話框后,CreateIndirect成員函數立即返回。
在父窗口中創建之後,如果要求對話框出現,則使用模板中的WS_VISIBLE風格。否則,必須調用ShowWindow。其它對話框風格及應用,請參閱聯機文檔“Win32 SDK”中的DIATEMPLATE結構和“Microsoft Visual C++ 6.0 MFC類庫參考(二)”中的“Windows風格”。使用CWnd::DestroyWindow函數刪除由CreateIndirect創建的對話框。
返回值:
整數值,指定了傳遞給CDialog::EndDialog 的nResult參數值。該函數用於關閉對話框。如果函數不能創建對話框,則返回-1;如果出現其它錯誤,則返回IDABORT。
說明:
調用該成員函數使用模態對話框並返回對話框結果。當對話框處於活動狀態時,該函數處理與用戶的交互。這使得對話框是模態的,使用戶在關閉對話框之前不能與其它窗口交互。
如果用戶單擊了對話框中的按鈕,如OK或Cancel,那麼消息處理函數如OnOK或OnCancel被調用,從而關閉對話框。預設的OnOK成員函數會對對話框數據進行有效性檢驗和更新,並關閉它得到結果IDOK。預設OnCancel函數關閉對話框得到結果IDCANCEL,而不對對話框數據檢驗或更新,可以覆蓋這些消息函數並改變它們的行為。注意 PreTransMessage被調用來處理模態對話框的消息。
參數:
nResult:對話框返回的值,用於調用者DoModal。
說明:
調用該成員函數來中止一個模態對話框。該函數返回nResult。無論模態對話框是何時被創建的,必須使用EndDialog來結束處理。
可以隨時調用EndDialog,即使在使用OnInitDialog時,即在對話框顯示或獲得輸入焦點之前就關閉它。
EndDialog不會立即關閉對話框。它設置了一個標記,用以指定在當前消息處理程序返回時就關閉對話框。
返回值:
32位值(DWORD)。如果預設按鈕具有ID值,則高位字包括DC_HASDEFID ,低位字包含ID值。如果預設按鈕不具有ID值,則返回0。
說明:
調用該GetDefID成員函數獲得對話框預設按鈕的ID值。通常是一個OK按鈕。
參數:
pWndCtrl:接收焦點的窗口(控制項)標識。
說明:
在對話框內移動焦點至指定的控制項。
要得到作為pWndCtrl傳遞的控制項(子窗口)的指針。調用CWnd::GetDlgItem成員函數,它返回一個CWnd 對象指針。
返回值:
如果對話框對象創建和初始化成功,則返回非零值,否則為0。
說明:
調用該成員函數,使用內存中構造的對話框模板初始化模態對話框。
要間接創建一個模態對話框,首先應分配一塊全局內存用於存放對話框模板,然後調用空的CDialog構造程序構造對話框對象,再調用InitModalIndirect將句柄存入內存中的對話框模板。當調用DoModal成員函數后,Windows 對話框被創建並顯示。
說明:
將對話框單位轉換為屏幕單位。對話框單位是用當前對話框基本單位表示的。基本單位是從對話框文本的字元平均高度和寬度得到的。1個水平單位是1/4個對話框基本寬度單位,1個垂直單位是1/4個對話框基本高度單位。
GetDialogBaseUnits 返回系統字體的尺寸信息,但如果在資源定義文件中使用了DS_SETFONT風格,便可以為每個對話框指定不同的字體。MapDialogRect函數對話框使用適當的字體。
MapDialogRect用屏幕單位(像素)替代了lpRect中的對話框單位,以便矩形能用於創建對話框或者在框內為控制項確定位置。
說明:
在對話框內將焦點移到下一個控制項。如果焦點位於最後一個控制項,則移到第一個控制項上。
說明:
當用戶在模態對話框或非模態對話框內單擊Cancel按鈕或按ESC鍵時,窗體調用這個成員函數。
覆蓋該成員函數,執行Cancel按鈕動作,預設方式是調用EndDialog來簡單中止模態對話框,並使DoModal 返回IDCANCEL。
如果在非模態對話框中實現Cancel按鈕,必須覆蓋OnCancel成員函數,並在其中調用DestoryWindow。不能調用基類成員函數,那將會調用EndDialog,使對話框雖然存在但不可視。
返回值:
指定對話框是否對它的一個控制項設置輸入焦點。如果OnInitDialog返回非零值,Windows將輸入焦點設在對話框的第一個控制項上,只有在對話框明確將輸入焦點設在某控制項上,應用返回0。
說明:
調用這個成員函數是對WM_INITDIALOG消息作出的反應。這條消息是在對話框即將顯示之前,在Create ,CreateIndirect或DoModal調用期間發出的。
如果在對話框初始化后需要執行特別處理,覆蓋該函數。首先調用基類OnInitDialog,但不考慮其返回值。正常情況下,覆蓋的函數返回TRUE。Windows調用OnInitDialog函數是通過標準的全局對話框過程(它們對於所有的Microsoft基礎類庫的對話框是通用的),而不是通過消息映射。因此該函數不需要消息映射入口。
說明:
當用戶按OK按鈕(ID是IDOK)時調用。
覆蓋該函數執行OK按鈕動作。如果對話框包括自動數據檢驗和交換,預設方式是對應用的某些變數進行數據的檢驗和更新。
參數:
pFont | 字體指針。用作對話框中所有字體使用的預設值。 |
說明:
書寫文本時為對話框控制項指定字體。對話框控制項使用指定字體作為所有對話框控制項的預設值。
對話框編輯器設置字體,將其作為對話框模板資源的一部分。
說明:
把對話框中的焦點移到前一個控制項。如果焦點在第一個控制項上,則移到對話框中最後一個控制項上。
參數:
nID | 指定用作預設按鈕的按鈕控制項的ID。 |
說明:為對話框改變預設按鈕。
參數:
nIDR | 指定上下文幫助ID。 |
說明:為對話框指定上下文幫助ID。