国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
對話框簡介

對話框簡介

發(fā)表于2013/12/26 16:29:07  311人閱讀

分類: MFC

一、模態(tài)對話框和非模態(tài)對話框區(qū)別

1、創(chuàng)建方法不同。模態(tài)對話框一般通過聲明對話框類對象,然后,直接調(diào)用DoModal即可創(chuàng)建成功;而非模態(tài)對話框一般通過Create函數(shù)創(chuàng)建。

2、銷毀方法不同。當(dāng)模態(tài)對話框創(chuàng)建函數(shù)DoModal返回時,對話框自動銷毀;而銷毀非態(tài)對話框時則要人工干預(yù),一般調(diào)用函數(shù)DestroyWindow。

3、對“確定”、“取消”按鈕的響應(yīng)不同。對于模態(tài)對話框,則直接重載基類的版本即可,并且要求在重載的版本中調(diào)用基類的實現(xiàn);而對于非模態(tài)對話框,則不可以調(diào)用基類的實現(xiàn),因為基類的版本將調(diào)用EndDialog,而此函數(shù)只適用于模態(tài)對話框。

4、消息的處理途徑不同。模態(tài)對話框有自己的消息循環(huán),而非模態(tài)對話框的消息要經(jīng)過應(yīng)用的消息隊列。如果想把這些消息傳送給對話框窗口過程,則必須更改消息隊列。

5、對于默認(rèn)的對話框模板,其Visible 屬性默認(rèn)為空,這不會對創(chuàng)建模態(tài)對話框產(chǎn)生任何影響,因為在消息循環(huán)中將會對此作出處理,從而創(chuàng)建完畢后即是可見的;而對于非模態(tài)對話框,就有所不同,如果沒有選中Visible 的話,則創(chuàng)建對話框后,必須調(diào)用ShowWindow 以便確保對話框可見。

二、對話框數(shù)據(jù)交換和驗證

1、CDataExchange類簡介

CDataExchange類提供了用于進(jìn)行DDX和DDV所必需的上下文信息。當(dāng)m_bSaveAndValidate為FALSE時,DDX將使用對話框數(shù)據(jù)成員值填充對話框控件的初始值;而當(dāng)其為TRUE時,DDX將會把控件的當(dāng)前值置入成員變量,并用DDV驗證此值是否符合所設(shè)定的標(biāo)準(zhǔn)。如果DDV失敗,那么DDV過程將會彈出一個用于解釋輸入錯誤的對話框。接著,DDV過程將會調(diào)用Fail,把焦點設(shè)置為產(chǎn)生錯誤的控件,并拋出異常以終止驗證過程。

CDataExchange類共有2個成員變量以及3個成員函數(shù)

1)m_bSaveAndValidate:用于DDX和DDV方向的標(biāo)志。

2)m_pDlgWnd:發(fā)生數(shù)據(jù)交換的對話框或者窗口(任何從CWnd 類派生的均可以進(jìn)行數(shù)據(jù)交換)。

3)PrepareCtrl以及PrepareEditCtrl:準(zhǔn)備用于數(shù)據(jù)交換的對話框控件。它存儲控件的句柄以便當(dāng)驗證失敗時設(shè)置控件的輸入焦點。

前者用于非編輯控件,后者用于編輯控件。

4)Fail:驗證失敗時調(diào)用。恢復(fù)前一個控件的輸入焦點并且拋出異常。

2、數(shù)據(jù)交換和驗證

如果使用DDX機(jī)制,通常在OnInitDialog函數(shù)或者對話框構(gòu)造函數(shù)中,設(shè)置對話框?qū)ο蟮某蓡T變量值。在對話框?qū)⒁@示的前一刻,

框架的DDX機(jī)制立即將成員變量值傳輸?shù)綄υ捒虻目丶?,而?dāng)用DoModal或者Create創(chuàng)建對話框并顯示時,即可看到那些控件值。

對話框成員函數(shù)OnInitDialog缺省實現(xiàn)是:調(diào)用CWnd 的成員函數(shù)UpdateData 以初始化對話框的控件。

當(dāng)用戶單擊了“確定”按鈕時,或者在任何時候以參數(shù)TRUE調(diào)用UpdateData時,DDX機(jī)制就會把數(shù)據(jù)從控件傳輸?shù)匠蓡T變量中。

此時,DDV機(jī)制按照事先指定的驗證規(guī)則對傳輸?shù)臄?shù)據(jù)進(jìn)行驗證。

A.數(shù)據(jù)更新——UpdateData

當(dāng)按下“確定”按鈕時,用戶的輸入變量將會傳輸?shù)娇丶鶎?yīng)的變量中,而且DoModal返回IDOK。在DoModal中調(diào)用函數(shù)CreateDlgIndirect創(chuàng)建對話時,產(chǎn)生了WM_INITDIALOG消息,從而引起對函數(shù)CDialog::OnInitDialog的調(diào)用,在初始化對話框資源后,立即就調(diào)用了函數(shù)UpdateData,此函數(shù)正是開始數(shù)據(jù)交換的起點。它是CWnd類的成員函數(shù),其定義如下:

//對話框數(shù)據(jù)支持BOOL CWnd::UpdateData(BOOL bSaveAndValidate){    ASSERT(::IsWindow(m_hWnd));    //提供用于數(shù)據(jù)交換所必需的上下文    CDataExchange dx(this, bSaveAndValidate);    …    DoDataExchange(&dx);    …    return bOK;}

它首先以傳進(jìn)來的bSaveAndValidate值為參數(shù)構(gòu)造CDataExchange對象,然后調(diào)用CWnd的虛擬成員函數(shù)DoDataExchange,此函數(shù)為空,而且它什么也不做,而對話框類CModalDlg已經(jīng)重載了此函數(shù),接下來對它進(jìn)行介紹。

B.數(shù)據(jù)交換——DoDataExchange

下面是DoDataExchange函數(shù)的具體實現(xiàn):

void CModalDlg::DoDataExchange(CDataExchange* pDX){    CDialog::DoDataExchange(pDX);    //{{AFX_DATA_MAP(CModalDlg)    DDX_Text(pDX, IDC_TITTLE, m_strTittle);     DDV_MaxChars(pDX, m_strTittle, 15);    …    //}}AFX_DATA_MAP}
它首先調(diào)用基類的版本,而基類版本的實現(xiàn)為空,所以不需要理它。然后調(diào)用了DDX_Text,此函數(shù)用于管理對話框、表單視以及控件視中的編輯控件與int、UINT、long、DWORD、CString、float 或者double數(shù)據(jù)類型之間的傳輸,或者管理對話框、表單視以及控件視中的CString數(shù)據(jù)成員之間的數(shù)據(jù)傳輸?shù)?。它的具體定義如下:
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, CString& value){    //準(zhǔn)備用于數(shù)據(jù)交換的對話框控件    HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);    //如果是從控件向成員變量傳輸    if (pDX->m_bSaveAndValidate)    {        int nLen = ::GetWindowTextLength(hWndCtrl);        //獲取文本        ::GetWindowText(hWndCtrl, value.GetBufferSetLength(nLen), nLen+1);        value.ReleaseBuffer();    }    else    {        //從成員變量向控件傳輸        AfxSetWindowText(hWndCtrl, value);    }}

此函數(shù)有三個參數(shù),其含義分別如下。

1)參數(shù)pDX:該參數(shù)表示CDataExchange對象的指針。

2)參數(shù)nIDC:該參數(shù)表示編輯控件的ID值。

3)參數(shù)value:對話框數(shù)據(jù)成員的引用,其類型取決于用戶使用的DDX_Text版本,這里為CString類型。

DDX_Text 主要根據(jù)m_bSaveAndValidate的值決定控件和成員變量交換數(shù)據(jù)的方向。

當(dāng)m_bSaveAndValidate為FALSE中,則將從對話框成員變量向?qū)υ捒蚩丶鬏敂?shù)據(jù),即調(diào)用函數(shù)AfxSetWindowText,其定義如下:

void AFXAPI AfxSetWindowText(HWND hWndCtrl, LPCTSTR lpszNew){    int nNewLen = lstrlen(lpszNew);    TCHAR szOld[256];    //快速檢測以便確認(rèn)文本是否真的發(fā)生變化    if (nNewLen > _countof(szOld) || ::GetWindowText(hWndCtrl, szOld, _countof(szOld)) != nNewLen || lstrcmp(szOld, lpszNew) != 0)    {        // 改變        //最終在控件上顯示出來        ::SetWindowText(hWndCtrl, lpszNew);    }}

C.數(shù)據(jù)驗證

在為控件IDC_TITTLE添加成員變量時,指定了允許輸入的最大字符數(shù),因此,當(dāng)m_bSaveAndValidate為TRUE時,DoDataExchange還將調(diào)用函數(shù)DDV_MaxChars,它的定義如下:

//最大字符的DDVvoid AFXAPI DDV_MaxChars(CDataExchange* pDX, CString const& value, int nChars){    // 確保非空    ASSERT(nChars >= 1);    //如果m_bSaveAndValidate 為TRUE 并且輸入的字符數(shù)大于最大值時    if (pDX->m_bSaveAndValidate && value.GetLength() > nChars)    {        TCHAR szT[32];        wsprintf(szT, _T("%d"), nChars);        CString prompt;        AfxFormatString1(prompt, AFX_IDP_PARSE_STRING_SIZE, szT);        AfxMessageBox(prompt, MB_ICONEXCLAMATION, AFX_IDP_PARSE_STRING_SIZE);        //異常準(zhǔn)備        prompt.Empty();        //拋出異常        pDX->Fail();    }    …}

此函數(shù)的3 個參數(shù)含義如下。

1)參數(shù)pDX:該參數(shù)表示CDataExchange對象的指針。

2)參數(shù)value:對話框等數(shù)據(jù)成員的引用,也是此函數(shù)進(jìn)行驗證的對象。

3)參數(shù)nChars:該參數(shù)表示編輯控件所能接受的最大字符數(shù)目。

此函數(shù)主要根據(jù)參數(shù)nChars對參數(shù)value進(jìn)行驗證。

三、通用對話框

除了CDialog類之外,MFC還提供了幾個派生于CDialog的類,它們主要用來封裝一些通用的對話框,如:“顏色選擇”、“字體選擇”以及“打開文件”等。它們是Windows通用對話框庫(庫為COMMDLG.DLL,頭文件為COMMDLG.H)的一部分。

1)CColorDialog:允許用戶選擇或者創(chuàng)建顏色。

2)CFileDialog:允許用戶打開或者保存一個文件。

3)CFindReplaceDialog:允許用戶將一個字符串替換為另一個字符串。

4)CFontDialog:允許用戶選擇字體。

5)CPrintDialog:允許用戶設(shè)置打印信息。

6)CPageSetupDialog:允許用戶設(shè)置頁面參數(shù)。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
MFC淺析(6) 對話框數(shù)據(jù)交換及驗證
MFC中的DoDataExchange(CDataExchange *pDX)
對話框的數(shù)據(jù)交換
CLRCDlg::CLRCDlg(CWnd* pParent /*=NULL*/): CDialog(CLRCDlg::IDD, pParent)
第十二章 對話框和對話框類CDialog
virtual void DoDataExchange(CDataExchange* pDX
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服