【MFC】CDialog类详解
00. 目錄
文章目錄
- 00. 目錄
- 01. 概述
- 02. 繼承層次結(jié)構(gòu)
- 03. 成員方法
- 04. 常用成員方法描述
- 4.1 構(gòu)造函數(shù)
- 4.2 Create函數(shù)
- 4.3 DoModal函數(shù)
- 4.4 EndDialog函數(shù)
- 4.5 OnCancel函數(shù)
- 4.6 OnInitDialog函數(shù)
- 4.7 OnOK函數(shù)
- 05. 附錄
01. 概述
用于在屏幕上顯示對(duì)話框的基類。
對(duì)話框分為兩種類型:模式和無(wú)模式。 在應(yīng)用程序繼續(xù)之前,用戶必須關(guān)閉模式對(duì)話框。 無(wú)模式對(duì)話框允許用戶在不取消或刪除對(duì)話框的情況下顯示對(duì)話框并返回到其他任務(wù)。
CDialog對(duì)象是對(duì)話框模板和 CDialog 派生類的組合。 使用對(duì)話框編輯器創(chuàng)建對(duì)話框模板并將其存儲(chǔ)在資源中,然后使用添加類向?qū)?chuàng)建派生自的類 CDialog 。
對(duì)話框與任何其他窗口一樣,接收來(lái)自 Windows 的消息。 在對(duì)話框中,您特別希望處理來(lái)自對(duì)話框的控件發(fā)出的通知消息,因?yàn)檫@是用戶與您的對(duì)話框進(jìn)行交互的方式。 使用 類向?qū)?可以選擇要處理的消息,并將相應(yīng)的消息映射項(xiàng)和消息處理程序成員函數(shù)添加到類。 只需在處理程序成員函數(shù)中編寫(xiě)特定于應(yīng)用程序的代碼即可。
如果您愿意,您始終可以手動(dòng)編寫(xiě)消息映射項(xiàng)和成員函數(shù)。
在除最普通對(duì)話框以外的所有對(duì)話框中,您可以向派生對(duì)話框類添加成員變量,以存儲(chǔ)用戶在對(duì)話框控件中輸入的數(shù)據(jù)或顯示用戶的數(shù)據(jù)。 您可以使用 “添加變量向?qū)А?創(chuàng)建成員變量并將其與控件相關(guān)聯(lián)。 同時(shí),為每個(gè)變量選擇變量類型和允許的值范圍。 代碼向?qū)⒊蓡T變量添加到您的派生對(duì)話框類。
系統(tǒng)將生成數(shù)據(jù)映射,以自動(dòng)處理成員變量與對(duì)話框控件之間的數(shù)據(jù)交換。 數(shù)據(jù)映射提供了一些函數(shù),這些函數(shù)用適當(dāng)?shù)闹党跏蓟瘜?duì)話框中的控件,檢索數(shù)據(jù)并驗(yàn)證數(shù)據(jù)。
若要?jiǎng)?chuàng)建模式對(duì)話框,請(qǐng)使用派生對(duì)話框類的構(gòu)造函數(shù)在堆棧上構(gòu)造對(duì)象,然后調(diào)用 DoModal 以創(chuàng)建對(duì)話框窗口及其控件。 如果希望創(chuàng)建無(wú)模式對(duì)話框,請(qǐng) Create 在對(duì)話框類的構(gòu)造函數(shù)中調(diào)用。
還可以使用 DLGTEMPLATE 數(shù)據(jù)結(jié)構(gòu)在內(nèi)存中創(chuàng)建模板,如 Windows SDK 中所述。 構(gòu)造 CDialog 對(duì)象后,調(diào)用 CreateIndirect 創(chuàng)建無(wú)模式對(duì)話框,或調(diào)用 InitModalIndirect 和 DoModal 創(chuàng)建模式對(duì)話框。
交換和驗(yàn)證數(shù)據(jù)映射是用 CWnd::DoDataExchange 添加到新對(duì)話框類的的重寫(xiě)編寫(xiě)的。 CWnd 有關(guān) exchange 和驗(yàn)證功能的詳細(xì)信息,請(qǐng)參閱中的 DoDataExchange 成員函數(shù)。
程序員和框架 DoDataExchange 通過(guò)調(diào)用 CWnd::UpdateData間接調(diào)用。
UpdateData當(dāng)用戶單擊 “確定” 按鈕關(guān)閉模式對(duì)話框時(shí),框架會(huì)調(diào)用。 (如果單擊 “取消” 按鈕,則不檢索數(shù)據(jù)。 ) OnInitDialog 的默認(rèn)實(shí)現(xiàn)也會(huì)調(diào)用 UpdateData 來(lái)設(shè)置控件的初始值。 通常會(huì)重寫(xiě) OnInitDialog 以進(jìn)一步初始化控件。 OnInitDialog 在所有對(duì)話框控件都創(chuàng)建之后,在對(duì)話框顯示之前調(diào)用。
CWnd::UpdateData在執(zhí)行模式對(duì)話框或無(wú)模式對(duì)話框的過(guò)程中,您可以隨時(shí)調(diào)用。
如果手動(dòng)開(kāi)發(fā)一個(gè)對(duì)話框,則需要自行向派生對(duì)話框類添加必要的成員變量,并添加成員函數(shù)以設(shè)置或獲取這些值。
當(dāng)用戶按 “確定” 或 “取消” 按鈕時(shí),或者當(dāng)你的代碼調(diào)用成員函數(shù)時(shí),模式對(duì)話框?qū)⒆詣?dòng)關(guān)閉 EndDialog 。
實(shí)現(xiàn)無(wú)模式對(duì)話框時(shí),請(qǐng)始終重寫(xiě) OnCancel 成員函數(shù)并 DestroyWindow 從該函數(shù)中調(diào)用。 請(qǐng)勿調(diào)用基類 CDialog::OnCancel ,因?yàn)樗?EndDialog 會(huì)調(diào)用,這會(huì)使對(duì)話框不可見(jiàn),但不會(huì)銷毀它。 還應(yīng) PostNcDestroy 為無(wú)模式對(duì)話框重寫(xiě),以便刪除 this ,因?yàn)闊o(wú)模式對(duì)話框通常是用分配的 new 。 模式對(duì)話框通常是在框架上構(gòu)造的,無(wú)需 PostNcDestroy 清除。
有關(guān)的詳細(xì)信息 CDialog ,請(qǐng)參閱 對(duì)話框。
02. 繼承層次結(jié)構(gòu)
CObject └CCmdTarget └CWnd └CDialog 頭文件 afxwin.h03. 成員方法
構(gòu)造函數(shù)
| CDialog::CDialog | 構(gòu)造 CDialog 對(duì)象。 |
公有成員方法
| CDialog::Create | 初始化 CDialog 對(duì)象。 創(chuàng)建無(wú)模式對(duì)話框并將其附加到 CDialog 對(duì)象。 |
| CDialog::CreateIndirect | 從內(nèi)存中的對(duì)話框模板創(chuàng)建無(wú)模式對(duì)話框 (基于資源的) 。 |
| CDialog::DoModal | 調(diào)用模式對(duì)話框并在完成時(shí)返回。 |
| CDialog::EndDialog | 關(guān)閉模式對(duì)話框。 |
| CDialog::GetDefID | 獲取對(duì)話框的默認(rèn)按鈕控件的 ID。 |
| CDialog::GotoDlgCtrl | 將焦點(diǎn)移到對(duì)話框中的指定對(duì)話框控件。 |
| CDialog::InitModalIndirect | 從內(nèi)存中的對(duì)話框模板創(chuàng)建一個(gè)模式對(duì)話框, (不是基于資源的) 。 在調(diào)用函數(shù)之前,將存儲(chǔ)參數(shù) DoModal 。 |
| CDialog::MapDialogRect | 將矩形的對(duì)話框單位轉(zhuǎn)換為屏幕單位。 |
| CDialog::NextDlgCtrl | 將焦點(diǎn)移到對(duì)話框中的下一個(gè)對(duì)話框控件。 |
| CDialog::OnInitDialog | 重寫(xiě)以增加對(duì)話框初始化。 |
| CDialog::OnSetFont | 重寫(xiě)以指定對(duì)話框控件在繪制文本時(shí)使用的字體。 |
| CDialog::PrevDlgCtrl | 將焦點(diǎn)移到對(duì)話框中的上一個(gè)對(duì)話框控件。 |
| CDialog::SetDefID | 將對(duì)話框的默認(rèn)按鈕控件更改為指定的按鈕。 |
| CDialog::SetHelpID | 為對(duì)話框設(shè)置區(qū)分上下文的幫助 ID。 |
受保護(hù)的方法
| CDialog::OnCancel | 重寫(xiě)以執(zhí)行 “取消” 按鈕或 ESC 鍵操作。 默認(rèn)關(guān)閉對(duì)話框并 DoModal 返回 IDCANCEL。 |
| CDialog::OnOK | 重寫(xiě)以在模式對(duì)話框中執(zhí)行 “確定” 按鈕操作。 默認(rèn)關(guān)閉對(duì)話框并 DoModal 返回 IDOK。 |
04. 常用成員方法描述
4.1 構(gòu)造函數(shù)
explicit CDialog(LPCTSTR lpszTemplateName,CWnd* pParentWnd = NULL);explicit CDialog(UINT nIDTemplate,CWnd* pParentWnd = NULL);CDialog();參數(shù) lpszTemplateName包含一個(gè)以 null 結(jié)尾的字符串,它是對(duì)話框模板資源的名稱。 nIDTemplate包含對(duì)話框模板資源的 ID 號(hào)。 pParentWnd指向?qū)υ捒驅(qū)ο?所屬) 類型 的父或所有者窗口對(duì)象 (。 如果為 NULL,則對(duì)話框?qū)ο蟮母复翱趯⒃O(shè)置為主應(yīng)用程序窗口。4.2 Create函數(shù)
virtual BOOL Create(LPCTSTR lpszTemplateName,CWnd* pParentWnd = NULL);virtual BOOL Create(UINT nIDTemplate,CWnd* pParentWnd = NULL); 功能: 調(diào)用 Create 以使用資源的對(duì)話框模板創(chuàng)建無(wú)模式對(duì)話框。 參數(shù): lpszTemplateName包含一個(gè)以 null 結(jié)尾的字符串,它是對(duì)話框模板資源的名稱。 pParentWnd指向?qū)υ捒驅(qū)ο?所屬) 類型 的父窗口對(duì)象 (。 如果為 NULL,則對(duì)話框?qū)ο蟮母复翱趯⒃O(shè)置為主應(yīng)用程序窗口。 nIDTemplate包含對(duì)話框模板資源的 ID 號(hào)。 返回值如果對(duì)話框創(chuàng)建和初始化成功,兩個(gè)窗體都將返回非零值;否則為0。 示例: void CMyDialog::OnMenuShowSimpleDialog() {//m_pSimpleDialog initialized to NULL in the constructor of CMyDialog classm_pSimpleDlg = new CSimpleDlg();//Check if new succeeded and we got a valid pointer to a dialog objectif (m_pSimpleDlg != NULL){BOOL ret = m_pSimpleDlg->Create(IDD_SIMPLEDIALOG, this);if (!ret) //Create failed.{AfxMessageBox(_T("Error creating Dialog"));}m_pSimpleDlg->ShowWindow(SW_SHOW);}else{AfxMessageBox(_T("Error Creating Dialog Object"));} }4.3 DoModal函數(shù)
virtual INT_PTR DoModal(); 功能:調(diào)用此成員函數(shù)以調(diào)用模式對(duì)話框并在完成后返回對(duì)話框結(jié)果。 參數(shù):無(wú) 返回值:一個(gè) int 值,該值指定傳遞給 CDialog:: EndDialog成員函數(shù)的 n 結(jié)果 參數(shù)的值,該參數(shù)用于關(guān)閉對(duì)話框。 如果函數(shù)無(wú)法創(chuàng)建對(duì)話框,則返回值為-1; 如果發(fā)生其他錯(cuò)誤,則返回值為 IDABORT,在這種情況下,"輸出" 窗口將包含來(lái)自 GetLastError的錯(cuò)誤信息。 參考示例: void CMyDialog::OnMenuShowAboutDialog() {// Construct the dialog box passing the// ID of the dialog template resourceCDialog aboutDlg(IDD_ABOUTBOX);// Create and show the dialog boxINT_PTR nRet = -1;nRet = aboutDlg.DoModal();// Handle the return value from DoModalswitch (nRet){case -1:AfxMessageBox(_T("Dialog box could not be created!"));break;case IDABORT:// Do somethingbreak;case IDOK:// Do somethingbreak;case IDCANCEL:// Do somethingbreak;default:// Do somethingbreak;}; }4.4 EndDialog函數(shù)
void EndDialog(int nResult); 功能:調(diào)用此成員函數(shù)以終止模式對(duì)話框。 參數(shù): N 結(jié)果包含要從對(duì)話框返回給調(diào)用方的值 DoModal 。參考示例: void CMyDialog::OnMenuShowSimpleModal() {CSimpleDlg myDlg;INT_PTR nRet = myDlg.DoModal();if (nRet == IDOK || nRet == 5){AfxMessageBox(_T("Dialog closed successfully"));} }void CSimpleDlg::OnRButtonUp(UINT nFlags, CPoint point) {UNREFERENCED_PARAMETER(nFlags);// Do somethingint nRet = point.x; // Just any value would do!EndDialog(nRet); // This value is returned by DoModal!// Do somethingreturn; // Dialog closed and DoModal returns only here! }4.5 OnCancel函數(shù)
virtual void OnCancel(); 功能:當(dāng)用戶在模式對(duì)話框或無(wú)模式對(duì)話框中單擊 " 取消 " 或按 ESC 鍵時(shí),框架會(huì)調(diào)用此方法。參考示例: void CSimpleDlg::OnCancel() {// TODO: Add extra cleanup here// Ensure that you reset all the values back to the// ones before modification. This handler is called// when the user doesn't want to save the changes.if (AfxMessageBox(_T("Are you sure you want to abort the changes?"),MB_YESNO) == IDNO){// Give the user a chance if he has unknowingly hit the// Cancel button. If he says No, return. Don't reset. If// Yes, go ahead and reset the values and close the dialog.return;}m_nMyValue = m_nPrevValue;m_pMyString = NULL;CDialog::OnCancel(); }4.6 OnInitDialog函數(shù)
virtual BOOL OnInitDialog(); 功能:調(diào)用此方法以響應(yīng) WM_INITDIALOG 消息。 參數(shù):返回值:指定應(yīng)用程序是否已將輸入焦點(diǎn)設(shè)置到對(duì)話框中的某個(gè)控件。 如果 OnInitDialog 返回非零值,則 Windows 將輸入焦點(diǎn)設(shè)置到對(duì)話框中的第一個(gè)控件的默認(rèn)位置。 僅當(dāng)應(yīng)用程序已將輸入焦點(diǎn)顯式設(shè)置到對(duì)話框中的某個(gè)控件時(shí),應(yīng)用程序才能返回0。參考示例: BOOL CSimpleDlg::OnInitDialog() {CDialog::OnInitDialog();// TODO: Add extra initialization herem_cMyEdit.SetWindowText(_T("My Name")); // Initialize control valuesm_cMyList.ShowWindow(SW_HIDE); // Show or hide a control, etc.return TRUE; // return TRUE unless you set the focus to a control// EXCEPTION: OCX Property Pages should return FALSE }4.7 OnOK函數(shù)
virtual void OnOK(); 功能:當(dāng)用戶單擊 "確定" 按鈕時(shí)調(diào)用 () ID 為 IDOK 的按鈕。參考示例: void CSimpleDlg::OnOK() {// TODO: Add extra validation here// Ensure that your UI got the necessary input// from the user before closing the dialog. The// default OnOK will close this.if (m_nMyValue == 0) // Is a particular field still empty?{// Inform the user that he can't close the dialog without// entering the necessary values and don't close the// dialog.AfxMessageBox(_T("Please enter a value for MyValue"));return;}CDialog::OnOK(); // This will close the dialog and DoModal will return. }05. 附錄
總結(jié)
以上是生活随笔為你收集整理的【MFC】CDialog类详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【MFC】MFC对话框类
- 下一篇: 【Tools】Visual Studio