DoModal

DoModal

DoModal是一個調用函式。DoModal返回值:如果函式成功則返回IDOK或IDCANCEL;否則返回0或-1。如果此屬性表是作為一個嚮導建立的,DoModal返回ID_WIZFINISH或IDCANCEL。

基本簡介

CPropertySheet::DoModal

virtual int DoModal();

返回值:如果函式成功則返回IDOK或IDCANCEL;否則返回0或-1。如果此屬性表是作為一個嚮導(參見SetWizardMode)建立的,DoModal返回ID_WIZFINISH或IDCANCEL。

備註:

此成員函式用來顯示一個模態對話框。其返回值對應於用來關閉對話框的控制項的ID。此函式返回後,Windows回響這個對話框,所有的屬性頁都會被銷毀。而這些對象本身仍然存在。通常,你將在DoModal返回IDOK之後從CPropertyPage對象檢取數據。

要顯示一個非模態對話框,請調用Create來代替此函式。

在一個屬性頁被第一次從它相應的對話框資源創建時,它有可能引發一個第一次機會(first-chance)異常。這是在創建此頁之前屬性頁將對話框資源的風格改變成了所需的風格的結果。因為資源通常來說是唯讀的,所以這導致了一個異常。這個異常由系統處理,系統會自動拷貝修改後的資源。這樣,第一次機會(first-chance)異常就被忽略了。

由於這個異常必須由作業系統來處理,所以不要用一個C++ try/catch塊來隱藏調用CPropertySheet::DoModal,因為在一個C++ try/catch塊中catch會處理所有的異常,比如,catch(...)。它將處理那些屬於作業系統的異常,這將導致不可預料的行為發生。但是,通過指定異常類型或結構化異常處理來處理C++異常就是安全的,在結構化異常處理中,訪問非法異常被傳遞給作業系統。

請參閱:

CDialog::DoModal, CPropertySheet::Create

CPrintDialog::DoModal();

virtual int DoModal();

回值明細

返回值

返回IDOK或IDCANCEL。如果返回的是IDCANCEL,則要調用WindowsCommDlgExtendedError函式來確定是否發生了一個錯誤。IDOK和IDCANCEL都是常量,它表明用戶選擇的是OK按鈕還是Cancel按鈕。

備註

此函式用來顯示Windows的通用列印對話框,並允許用戶選擇各個列印選項,例如備份的數目、頁範圍和備份是否需要整理。

如果你想要提供設定m_pd結構的成員來初始化各個列印對話框選項,則應當在列印DoModal之前,但在對話框對象構造之後進行。

在調用了DoModal之後,你就可以調用其它的成員函式來檢取各個設定或用戶在對話框中輸入的信息了。

請參閱:

CPrintDialog::CPrintDialog, CDialog::DoModal

COlePropertiesDialog::DoModal

virtual int DoModal();

返回值

如果成功則返回IDOK或IDCANCEL;否則返回0。IDOK和IDCANCEL都是常量,它們指示用戶是選擇了OK按鈕還是Cancel按鈕。

如果返回的是IDCANCEL,你可以調用函式Windows CommDlgExtendedError來確定是否發生了一個錯誤。

備註

這個成員函式用來顯示Windows通用OLE Object Properties對話框,並允許用戶查看或改變文檔項的各個屬性。

請參閱:

COlePropertiesDialog::OnApplyScale, COlePropertiesDialog::m_psh

COleUpdateDialog::DoModal

virtual int DoModal();

返回值

對話框的完成狀態。是下列值之一: · IDOK 如果對話框成功返回。

· IDCANCEL 如果當前文檔中不存在需要更新的連結項或嵌入項。

· IDABORT 如果發生了一個錯誤。如果返回的是IDABORT,調用COleDialog::GetLastError成員函式來獲取更多有關所發生的錯誤類型的信息。可能發生的錯誤的列表,參見“OLE 2.01用戶接口庫”中的OleUIEditLinks函式。

備註

此函式以更新方式顯示Edit Links對話框。除非用戶選擇了Cancel按鈕,所有的連結項和/或嵌入項都會被更新。

請參閱:

COleDialog::GetLastError,COleLinksDialog::DoModal

CPageSetupDialog::DoModal

virtual int DoModal();

返回值

則調用Windows CommDlgExtendedError函式來確定是否發生了一個錯誤。

IDOK和IDCANCEL都是常量,它們用來表明用戶選擇的是OK按鈕還是Cancel按鈕。

備註

此函式用來顯示Windows通用OLE Page Setup對話框,並允許用戶選擇不同的列印設定選項,比如列印邊距、頁面大小、頁面方向,和印表機目標。另外,用戶頁可以訪問如網路位置和所選印表機的屬性等印表機設定選項。

如果你希望通過設定m_psd結構的成員來初始化不同的Page Setup對話框選項,你必須在調用DoModal之前和構造此對話框之後進行。在調用DoModal之後,調用其它的成員函式來獲取用戶在對話框中輸入的設定和信息。

如果你想傳送用戶輸入的當前設定,請調用CWinApp::SelectPrinter。這個函式讀取來自CPageSetupDialog對象的信息並初始化和選擇一個具有適當屬性的新印表機DC。

AfxGetApp()->SelectPrinter(dlg.m_psd.hDevNames, dlg.m_psd.hDevMode );

請參閱:CPageSetupDialog::m_psd

COleLinksDialog::DoModal

virtual int DoModal();

返回值

對話框的完成狀態。它可以是下面的值: · IDOK 如果對話框被成功顯示則返回此值。

· IDCANCEL 如果用戶取消了對話框則返回此值。

· IDABORT 如果發生了錯誤則返回此值。如果返回的是IDABORT,則調用成員函式COleDialog::GetLastError來獲取有關所發生錯誤的類型的進一步信息。可能發生的錯誤的列表,請參見“OLE 2.01用戶接口庫”中的OleUIEditLinks函式。

備註

此函式用來顯示OLE Edit Links對話框。

如果你要通過設定m_el結構的成員來初始化不同的對話框控制項,你必須要在調用DoModal之前,對話框對象被銷毀之後進行。

請參閱:

COleLinksDialog::m_el

COlePasteSpecialDialog::DoModal

virtual int DoModal();

返回值

對話框完成的狀態。它可以是下列值之一: · IDOK 如果成功顯示了對話框。

· IDCANCEL 如果用戶取消了對話框。

· IDABORT 如果返回的是IDABORT,則要調用COleDialog::GetLastError成員函式來獲取有關所發生的錯誤類型的進一步信息。可能發生的錯誤的列表,請參見“OLE 2.01用戶接口庫”中的OleUIPasteSpecial函式。

備註

此函式用來顯示OLE Paste Special 對話框。

如果你想通過設定m_ps結構的成員函式來初始化不同的對話框控制項,則你必須在調用DoModal之前,但在構造了對話框對象之後進行。

如果DoModal返回IDOK,則你可以調用其它成員函式來獲取各個設定或由用戶在對話框中輸入的信息。

請參閱:

COleDataObject, COlePasteSpecialDialog::COlePasteSpecialDialog, COlePasteSpecialDialog::GetDrawAspect, COlePasteSpecialDialog::GetIconicMetafile, COlePasteSpecialDialog::GetPasteIndex, COlePasteSpecialDialog::GetSelectionType

COleInsertDialog::DoModal

virtual int DoModal( );

int DoModal( DWORD dwFlags );

返回值

返回對話框的完成狀態。可以是下列值之一: · IDOK 如果對話框被成功顯示。

· IDCANCEL 如果用戶取消了對話框。

· IDABORT 如果發生了一個錯誤。如果返回的是IDABORT,調用COleDialog::GetLastError成員函式來獲取更多有關所發生的錯誤的類型的信息。可能發生的錯誤的列表,參見“OLE 2.01用戶接口庫”中的OleUIInsertObject。

參數

dwFlags 是下列值之一: ·COleInsertDialog::DocObjectOnly 將只插入DocObjects。

·COleInsertDialog::ControlsOnly 將只插入ActiveX控制項。

如果是零,則DoModal將既不插入一個DocObjects,也不插入一個ActiveX控制項;它的返回值與上面所列的第一種原形的返回值一樣。

備註

此函式用來顯示該OLE Insert Object對話框。

如果你想通過設定m_io結構的成員來初始化不同的對話框控制項,你應該在第一DoModal之前,但在對話框對象被構造之後進行。

如果DoModal返回的是IDOK,則你可以調用其它的成員函式來獲取用戶輸入到此對話框中的設定或信息。

請參閱:

COleInsertDialog::GetSelectionType, COleInsertDialog::GetClassID, COleInsertDialog::GetDrawAspect, COleInsertDialog::GetIconicMetafile, COleInsertDialog::GetPathName, COleInsertDialog::m_io

COleConvertDialog::DoModal

virtual int DoModal( );

返回值

對話框的完成狀態。它可以是下列值: · IDOK 若對話框成功顯示。

· IDCANCEL 如果用戶取消了該對話框。

· 請參閱OLE文檔中的OleUIConvert函式。

備註

調用該函式,以顯示OLE 轉換對話框。

如果要通過調整m_cv結構的值來初始化對話框中的控制項狀態,

請參閱:

COleConvertDialog::m_cv, COleConvertDialog::DoConvert, COleConvertDialog::GetSelectionType, COleConvertDialog::GetClassID, COleConvertDialog::GetDrawAspect, COleConvertDialog::GetIconicMetafile

COleChangeSourceDialog::DoModal

virtual int DoModal( );

返回值

對話框的完成狀態。它可以是下列值: · IDOK 若對話框成功顯示。

· IDCANCEL 如果用戶取消了該對話框。

(User InterfaceLibrary)”中的OleUIChangeSource函式。

備註

調用該函式,以顯示OLE變換資源對話框。

如果要通過調整m_cs結構的值來初始化對話框中的控制項狀態,

如果DoModal返回IDOK, 可以調用其它成員函式獲取用戶在對話框中輸入的設定或信息。下面所列的是典型的查詢函式:

·GetFileName

·GetDisplayName

·GetItemName

請參閱:COleChangeSourceDialog::COleChangeSourceDialog

COleChangeIconDialog::DoModal

virtual int DoModal( );

返回值

對話框的完成狀態。它可以是下列值: · IDOK 若對話框成功顯示。

· IDCANCEL 如果用戶取消了該對話框。

·(User InterfaceLibrary)”中的OleUIChangeIcon函式。

備註

調用該函式,以顯示OLE變換圖示對話框。

如果要通過調整m_cs結構的值來初始化對話框中的控制項狀態,

請參閱:

COleChangeIconDialog::m_ci, COleChangeIconDialog::DoChangeIcon, COleChangeIconDialog::GetIconicMetafile

COleBusyDialog::DoModal

virtual int DoModal( ) const;

返回值

對話框的完成狀態。它可以是下列值: · IDOK 若對話框成功顯示。

· IDCANCEL 如果用戶取消了該對話框。

· InterfaceLibrary)”中的OleUIBusy函式。

備註

調用該函式,以顯示OLE伺服器忙或伺服器沒有回響對話框。

如果要通過調整m_bz結構的值來初始化對話框中的控制項狀態,

請參閱:

COleBusyDialog::GetSelectionType, COleBusyDialog::m_bz

CFontDialog::DoModal

virtual int DoModal( );

返回值

IDOK或IDCANCEL。如果返回IDCANCEL,則調用WindowsCommDlgExtendedError函式判斷是否發生了錯誤。

備註

調用此成員函式顯示一個Windows通用字型對話框,並允許用戶選擇一種字型。

如果想用設定m_cf結構成員的方法初始化各種字型對話控制項,則應在調用DoModal之前,及創建了對話對象之後進行。

如果DoModal返回IDOK,可用其它成員函式獲得用戶輸入對話框的設定或信息。

請參閱:CDialog::DoModal,CFontDialog::CFontDialog

CFileDialog::DoModal

virtual int DoModal( );

返回值

IDOK或IDCANCEL。如果返回IDCANCEL,調用CommDlgExtendedError函式來判斷是否是發生錯誤。

IDOK或IDCANCEL是表明用戶選擇了OK還是Cancel按鈕的常數。

備註

調用此成員函式前顯示一個Windows常用檔案對話框,使用戶瀏覽檔案和目錄並輸入一個檔案名稱。

如果想通過設定m_ofn結構的成員來初始化各種檔案對話框選項,則應在調用DoModal之前,創建對話對象之後進行。

當用戶單擊對話框的OK或Cancel按鈕或選擇對話框控制項選單中的關閉,則控制項返回你的套用,然後可以調用其它成員函式獲取用戶輸入對話框中的更多信息和設定。

DoModal是從CDialog類復蓋得到的虛函式。

請參閱:CDialog::DoModal, CFileDialog::CFileDialog

說明

DoModal()函式調用失敗的原因分析:

對話框DoModal()函式調用失敗一般而言有兩種表現形式:一是對話框彈不出來,但是沒有錯誤提示;二是對話框彈不出來,同時伴隨記憶體訪問錯誤的提示框出現。 第一種表現主要是因為沒有對資源句柄進行切換造成的,以在DLL中彈出對話框中最為常見。解決辦法是:如果是MFC規則DLL,可以使用所有導出函式的開始處添加 AFX_MANAGE_STATE宏,具體代碼為:AFX_MANAGE_STATE(AfxGetStaticModuleState( )),如果是MFC擴展DLL,具體做法是 1. 在DLL中定義兩個全局變數, HINSTANCE hResOld; // 舊的資源句柄 HINSTANCE hDll; // DLL資源句柄 2. 在DllMain函數裡初始化hDll hDll = hInstance; 3. 在調用對話框DoModal()函式之前進行資源句柄切換 HINSTANCE hResOld = AfxGetResourceHandle(); AfxSetResourceHandle(hDll); …… CYourDlg dlg; dlg.DoModal(); …… AfxSetResourceHandle(hResOld); 若是第二種表現,即對話框彈不出來,同時伴隨記憶體訪問錯誤的提示框出現,那么問題很可能出現在初始化對話框界面的代碼方面,具體是在OnInitDialog函式,即使它是在DLL中彈出對話框。事實上在在DLL中彈出對話框如果不進行資源句柄切換,頂多是彈不出對話框,並不會出現記憶體訪問方面的錯誤。在解決這方面的錯誤,一個誤區是單步進入DoModal()函式調試,直至定位DoModal函式內部哪一句出錯。後來我發現這純粹是浪費時間,就算定位了在DoModal函式內部哪一句出錯,你依然不知道為什麼會出錯。實際上調用DoModal()函式,激發的卻是OnInitDialog函式。因此你只需確定OnInitDialog函式哪一句出錯了(這裡的OnInitDialog函式是指派生對話框類的OnInitDialog函式)。

相關詞條

相關搜尋

熱門詞條

聯絡我們