複製鏈接
請複製以下鏈接發送給好友

DoModal

鎖定
DoModal是一個函數,可以用來顯示一個模態對話框。此成員函數用來顯示一個模態對話框。其返回值對應用於來關閉對話框的控件的ID。此函數返回後,Windows響應這個對話框,所有的屬性頁都會被銷燬。
而這些對象本身仍然存在。通常,你將在DoModal返回IDOK之後從CPropertyPage對象檢取數據。要顯示一個非模態對話框,請調用Create來代替此函數。
外文名
DoModal
返回值
返回IDOK或IDCANCEL
類    型
函數
領    域
計算機
意    義
用來顯示一個模態對話框

DoModal簡介

CPropertySheet::DoModal
virtual int DoModal();
返回值:如果函數成功則返回IDOK或IDCANCEL;否則返回0或-1。如果此屬性表是作為一個嚮導(參見SetWizardMode)建立的,DoModal返回ID_WIZFINISH或IDCANCEL。
備註:
在一個屬性頁被第一次從它相應的對話框資源創建時,它有可能引發一個第一次機會(first-chance)異常。這是在創建此頁之前屬性頁將對話框資源的風格改變成了所需的風格的結果。因為資源通常來説是隻讀的,所以這導致了一個異常。這個異常由系統處理,系統會自動拷貝修改後的資源。這樣,第一次機會(first-chance)異常就被忽略了。
由於這個異常必須由操作系統來處理,所以不要用一個C++ try/catch塊來隱藏調用CPropertySheet::DoModal,因為在一個C++ try/catch塊中catch會處理所有的異常,比如,catch(...)。它將處理那些屬於操作系統的異常,這將導致不可預料的行為發生。但是,通過指定異常類型或結構化異常處理來處理C++異常就是安全的,在結構化異常處理中,訪問非法異常被傳遞給操作系統。
請參閲:
CDialog::DoModal, CPropertySheet::Create
CPrintDialog::DoModal();
virtual int DoModal();

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之前,對話框對象被銷燬之後進行。
請參閲:
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程序

CDialog::DoModal
virtual int DoModal();

DoModal整數值

整數值,指定了傳遞給CDialog::EndDialog(該函數用於關閉對話框) 的nResult參數值。如果函數不能創建對話框,則返回-1;如果出現其它錯誤,則返回IDABORT。

DoModal備註

調用該成員函數使用模態對話框並返回對話框結果。當對話框處於活動狀態時,該函數處理與用户的交互。這使得對話框是模態的,使用户在關閉對話框之前不能與其它窗口交互。
如果用户單擊了對話框中的按鈕,如OK或Cancel,那麼消息處理函數如OnOK或OnCancel被調用,從而關閉對話框。缺省的OnOK成員函數會對對話框數據進行有效性檢驗和更新,並關閉它得到結果IDOK。缺省OnCancel函數關閉對話框得到結果IDCANCEL,而不對對話框數據檢驗或更新,可以覆蓋這些消息函數並改變它們的行為。注意 PreTransMessage被調用來處理模態對話框的消息。
請參閲:::DialogBox, CWnd::IsDialogMessage

DoModal異常檢測

CColorDialog::DoModal
virtual int DoModal( );

DoModal返回值

IDOK或者IDCANCEL。如果返回了IDCANCEL,則可以調用Windows函數CommDlgExtendedError來檢測是否發生了錯誤。

DoModal其他信息

本函數用於顯示Windows通用顏色對話框並接收用户的選擇。
如果想通過設置m_cc結構的各個成員來初始化不同的顏色對話框,應在對話框對象構造之後,調用DoModal之前進行。
在調用DoModal之後,可以調用其它的成員函數檢索設置信息和用户輸入的信息。
請參閲:CDialog::DoModal,CColorDialog::CColorDialog

DoModal説明

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函數)。