CDialog

CDialog

CDialog類是在螢幕上顯示的對話框基類。對話框有兩類:模態對話框和非模態對話框。模態對話框在套用繼續進行之前必須關閉。

介紹

繼承圖表 繼承圖表

一個CDialog對象是對話框模板與一個CDialog派生類的組合。使用對話框編輯器創建對話框並存入資源之中,然後使用ClassWizard創建一個CDialog派生類。

同其它視窗一樣,對話框從Windows 中獲取信息。在對話框中你會對來自對話框控制項的處理訊息感興趣,因為它說明了對話框是如何與用戶互動的。ClassWizard觀察對話框每個控制項可能產生的訊息,可以選擇你所希望處理的訊息。ClassWizard 將適當的訊息映射器入口和訊息處理成員函式加到一個新類中。你只需為成員函式編寫套用的代碼。

如果喜歡,在使用ClassWizard時可以編寫自己的訊息映射器入口和成員函式。

對於大多數普通對話框,可以向對話框派生類中添加成員變數以存儲數據。數據是用戶向對話框中輸入的,或者為用戶顯示數據。ClassWizard觀察對話框中與數據映射的控制項並提示為每一控制項創建一個成員變數。同時,為每一變數選擇變數類型和取值範圍。ClassWizard將成員變數加入對話框派生類中。

然後,ClassWizard寫入成員函式與對話框控制項之間的交換數據自動映射的數據。數據映射使函式可以為對話框控制項提供適當的初始值。檢索數據並對數據進行有效性檢測。

要建立模態對話框,先使用構造程式為對話框派生類構造一個對象。然後調用DoModal創建對話框視窗及其控制項。如果要建立非模態對話框,在構造程式中為對話框類調用Create即可。

還可使用DLGTEMPLATE數據結構在記憶體中建立模板,該結構在在線上文檔“Win32 SDK”中有描述。當構造了一個CDialog對象之後,調用CreateIndirect創建非模態對話框,或調用InitModalIndirect和DoModal來創建模態對話框。

CDialog CDialog

ClassWizard在覆蓋它為新對話框類加入的CWnd::DoDataExchange之後寫入交換和有效性規則的數據映射。請參閱CWnd中的DoDataExchange成員函式。

程式和框架都通過調用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 <afxwin.h>

成員函式

構造函式

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。

相關詞條

相關搜尋

熱門詞條

聯絡我們