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

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
對(duì)話框的數(shù)據(jù)交換
 
對(duì)話框數(shù)據(jù)交換指以下兩種動(dòng)作,或者是把內(nèi)存數(shù)據(jù)寫入對(duì)應(yīng)的控制窗口,或者是從控制窗口讀取數(shù)據(jù)并保存到內(nèi)存變量中。MFC為了簡化這些操作,以CDataExchange類和一些數(shù)據(jù)交換函數(shù)為基礎(chǔ),提供了一套數(shù)據(jù)交換和校驗(yàn)的機(jī)制。
  1. 數(shù)據(jù)交換的方法
    首先,定義保存數(shù)據(jù)的內(nèi)存變量──給對(duì)話框添加成員變量,每個(gè)控制窗口可以對(duì)應(yīng)一個(gè)成員變量,或者是控制窗口類型,或者是控制窗口表示的數(shù)據(jù)的類型。例如,對(duì)于對(duì)話框的一個(gè)編輯控制窗口,可以定義一個(gè)CEdit類型的成員變量,或者一個(gè)CString類型的成員變量。
    其次,覆蓋對(duì)話框的虛擬函數(shù)DoDataExchange,實(shí)現(xiàn)數(shù)據(jù)交換和驗(yàn)證。
    ClassWizard可以協(xié)助程序員自動(dòng)地添加成員變量,修改DoDataExchange。例如,一個(gè)對(duì)話框有兩個(gè)控制窗口,其中的一個(gè)編輯框表示姓名,ID是IDC_NAME,另一個(gè)編輯框表示年齡,ID是IDC_AGE,ClassWizard添加如下的成員變量:
    // Dialog Data
    //{{AFX_DATA(CExDialog)
    enum { IDD = IDD_DIALOG2 };
    CEdit m_name;
    int m_iAge;
    //}}AFX_DATA
    使用ClassWizard添加成員變量中,一個(gè)定義為CEdit,另一個(gè)定義為int。這些定義被“//{{AFX_DATA”和“//}}AFX_DATA”引用,表示是ClassWizard添加的,程序員不必修改它們。
    相應(yīng)的DoDataExchange的實(shí)現(xiàn)如下:
        
    void CExDialog::DoDataExchange(CDataExchange* pDX)    
    {    
    	CDialog::DoDataExchange(pDX);    
    	//{{AFX_DATA_MAP(CFtpDialog)    
    	DDX_Control(pDX, IDC_NAME, m_name);    
    	DDX_Text(pDX, IDC_AGE, m_nAge);    
    	DDV_MinMaxInt(pDX, m_nAge, 1, 100);    
    	//}}AFX_DATA_MAP    
    }
    DDX_ Control表示把IDC_NAME子窗口的內(nèi)容傳輸?shù)酱翱趍_name,或者相反。
    DDX_ Text表示把IDC_AGE子窗口的內(nèi)容按整數(shù)類型保存到m_nAge,或者相反。
    DDV_MinMaxInt表示m_nAge應(yīng)該在1和100之間取值。
  2. CDataExchange
    上文中提到DDX_Xxxxx數(shù)據(jù)交換函數(shù)可以進(jìn)行雙向的數(shù)據(jù)交換,那么它們?nèi)绾沃罃?shù)據(jù)傳輸?shù)姆较蚰兀窟@通過DDX_Xxxxx函數(shù)的第一個(gè)參數(shù)pDX(也就是DoDataEx change的參數(shù)pDX)所指的CDataExchange對(duì)象來決定,pDX指向一個(gè)CdataExchange對(duì)象。CDataExchange定義如下:
        
    class CDataExchange    
    {    
    // Attributes    
    public:    
    BOOL m_bSaveAndValidate; // TRUE 則 保存和驗(yàn)證數(shù)據(jù)    
    CWnd* m_pDlgWnd; // 指向一個(gè)對(duì)話框    
    // Operations (for implementors of DDX and DDV procs)    
    HWND PrepareCtrl(int nIDC); //返回指定ID的控制窗口的句柄    
    HWND PrepareEditCtrl(int nIDC); //返回指定ID的編輯控制窗口句柄    
    // Implementation    
    CDataExchange(CWnd* pDlgWnd, BOOL bSaveAndValidate);    
    };    
        
    DoDataExchange類似于Serialize函數(shù),CDataExchange類似于CArchive。CDataExchange使用成員變量m_pDlgWnd保存要進(jìn)行數(shù)據(jù)交換的對(duì)話框,使用成員變量m_bSaveAndValidate指示數(shù)據(jù)傳輸?shù)姆较颍绻撟兞空?,則從控制窗口讀取數(shù)據(jù)到成員變量,如果假,則從成員變量寫數(shù)據(jù)到控制窗口。
  3. 在構(gòu)造一個(gè)CDataExchange對(duì)象時(shí),將保存有關(guān)信息在對(duì)象的成員變量中。構(gòu)造函數(shù)如下:
        
    CDataExchange::CDataExchange(CWnd* pDlgWnd, BOOL bSaveAndValidate)    
    {    
    ASSERT_VALID(pDlgWnd);    
    m_bSaveAndValidate = bSaveAndValidate;    
    m_pDlgWnd = pDlgWnd;    
    m_hWndLastControl = NULL;    
        
    }
    構(gòu)造函數(shù)參數(shù)指定了進(jìn)行數(shù)據(jù)交換的對(duì)話框pDlgWnd和數(shù)據(jù)傳輸方向bSaveAndValidate。
    1. UpdateData函數(shù)
    有了數(shù)據(jù)交換類和數(shù)據(jù)交換函數(shù),怎么來使用它們呢?MFC設(shè)計(jì)了UpdateData函數(shù)來完成上述數(shù)據(jù)交換和驗(yàn)證的處理。
    首先,UpdateData創(chuàng)建CDataExchange對(duì)象,然后調(diào)用DoDataExchange函數(shù)。其實(shí)現(xiàn)如下:
        
    BOOL CWnd::UpdateData(BOOL bSaveAndValidate)    
    {    
    	ASSERT(::IsWindow(m_hWnd)); // calling UpdateData before DoModal?    
    	//創(chuàng)建CDataChange對(duì)象    
    	CDataExchange dx(this, bSaveAndValidate);    
    	BOOL bOK = FALSE; // assume failure    
    	TRY    
    	{    
    		//數(shù)據(jù)交換                DoDataExchange(&dx);    
    		bOK = TRUE; // it worked    
    	}    
    	CATCH(CUserException, e)//例外    
    	{    
    	}    
    	END_CATCH_ALL    
    		//恢復(fù)原來的值    
    		return bOK;    
    }
    UpdataDate根據(jù)參數(shù)創(chuàng)建CDataExchange對(duì)象dx,如果參數(shù)為TRUE,dx用來寫數(shù)據(jù),否則dx用來讀數(shù)據(jù);然后調(diào)用DoDataExchange進(jìn)行數(shù)據(jù)交換。
    1. 數(shù)據(jù)交換和驗(yàn)證函數(shù)
    在進(jìn)行數(shù)據(jù)交換或者驗(yàn)證時(shí),首先使用PrePareCtrl或者PrePareEditCtrl得到控制窗口的句柄,然后使用::GetWindowsText從控制窗口讀取數(shù)據(jù),或者使用::SetWindowsText寫入數(shù)據(jù)到控制窗口。下面討論幾個(gè)例子:
              
      static void AFX_CDECL DDX_TextWithFormat(CDataExchange* pDX,        
      int nIDC,LPCTSTR lpszFormat, UINT nIDPrompt, ...)        
      {        
      va_list pData; //用來處理個(gè)數(shù)可以變化的參數(shù)        
      va_start(pData, nIDPrompt);//得到參數(shù)        
      //得到編輯框的句柄        
      HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);        
      TCHAR szT[32];        
      if (pDX->m_bSaveAndValidate) //TRUE,從編輯框讀出數(shù)據(jù)        
      {        
      // the following works for %d, %u, %ld, %lu        
      //從編輯框得到內(nèi)容        
      ::GetWindowText(hWndCtrl, szT, _countof(szT));        
      //轉(zhuǎn)換編輯框內(nèi)容為指定的格式,支持“ %d, %u, %ld, %lu”        
      if (!AfxSimpleScanf(szT, lpszFormat, pData))        
      {       
      AfxMessageBox(nIDPrompt);        
      pDX->Fail(); //數(shù)據(jù)交換失敗        
      }        
      }        
      else //FALSE,寫入數(shù)據(jù)到編輯框   
      {        
      //把要寫的內(nèi)容轉(zhuǎn)換成指定格式       
      wvsprintf(szT, lpszFormat, pData);//不支持浮點(diǎn)運(yùn)算        
      //設(shè)置編輯框的內(nèi)容        AfxSetWindowText(hWndCtrl, szT);       
      }     
      va_end(pData);//結(jié)束參數(shù)分析        
      }        
    • DDX_TextWithFormat用來按照一定的格式把數(shù)據(jù)寫入或者讀出編輯框。首先,它得到編輯框的句柄hWndCtrl,然后,根據(jù)傳輸方向從編輯框讀出內(nèi)容并轉(zhuǎn)換成指定格式(讀出時(shí)),或者轉(zhuǎn)換內(nèi)容為指定格式后寫入編輯框(寫入時(shí))。本函數(shù)可以處理個(gè)數(shù)不定的參數(shù),是多個(gè)數(shù)據(jù)交換和驗(yàn)證函數(shù)的基礎(chǔ)。
              
      void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, long& value)        
      {        
        if (pDX->m_bSaveAndValidate)        
          DDX_TextWithFormat(pDX, nIDC, _T("%ld"), AFX_IDP_PARSE_INT, &value);        
        else        DDX_TextWithFormat(pDX, nIDC, _T("%ld"), AFX_IDP_PARSE_INT, value);       
      }     
      上述DDX_TEXT用來在編輯框和long類型的數(shù)據(jù)成員之間交換數(shù)據(jù)。MFC提供了DDX_TEXT的多個(gè)重載函數(shù)處理編輯框和不同類型的數(shù)據(jù)成員之間的數(shù)據(jù)交換。
      DDX_Control
      • 下面的DDX_Control用于得到一個(gè)有效的控制類型窗口對(duì)象(MFC對(duì)象)。        
              
      void AFXAPI DDX_Control(CDataExchange* pDX, int nIDC, CWnd& rControl)        
      {      
      if (rControl.m_hWnd == NULL) // 還沒有子類化        
      {     
      ASSERT(!pDX->m_bSaveAndValidate);        
      //得到控制窗口句柄        
      HWND hWndCtrl = pDX->PrepareCtrl(nIDC);        
      //把hWndCtrl窗口和MFC窗口對(duì)象rControl捆綁在一起    
      if (!rControl.SubclassWindow(hWndCtrl))        {      
      ASSERT(FALSE); //不允許兩次子類化        
      AfxThrowNotSupportedException();     
      }     
      #ifndef _AFX_NO_OCC_SUPPORT//OLE控制相關(guān)的操作        
      else        
      {       
      // If the control has reparented itself (e.g., invisible control),        // make sure that the CWnd gets properly wired to its control site.        if (pDX->m_pDlgWnd->m_hWnd != ::GetParent(rControl.m_hWnd))        rControl.AttachControlSite(pDX->m_pDlgWnd);        
      }       
      #endif //!_AFX_NO_OCC_SUPPORT        
      }       
      }  
      DDX_Control用來把控制窗口(Windows窗口)和一個(gè)對(duì)話框成員(MFC窗口對(duì)象)捆綁在一起,這個(gè)過程是通過SubclassWindow函數(shù)完成的。這樣,程序員就可以通過成員變量來操作控制窗口,讀、寫、修改控制窗口的內(nèi)容。
    本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
    打開APP,閱讀全文并永久保存 查看更多類似文章
    猜你喜歡
    類似文章
    MFC中的DoDataExchange(CDataExchange *pDX)
    DDX 和 DDV 例程
    MFC淺析(6) 對(duì)話框數(shù)據(jù)交換及驗(yàn)證
    第十二章 對(duì)話框和對(duì)話框類CDialog
    CDhtmlDialog的粗淺使用
    VS2010/MFC編程入門之八(對(duì)話框:創(chuàng)建對(duì)話框類和添加控件變量)
    更多類似文章 >>
    生活服務(wù)
    分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
    綁定賬號(hào)成功
    后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
    如果VIP功能使用有故障,
    可點(diǎn)擊這里聯(lián)系客服!

    聯(lián)系客服