第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

高手能不能幫我徹底剖析下這個函數(shù) 和 UpDateData函數(shù) 我比較笨 最好能詳細(xì)和通俗點

高手能不能幫我徹底剖析下這個函數(shù) 和 UpDateData函數(shù) 我比較笨 最好能詳細(xì)和通俗點

C++
互換的青春 2022-12-21 19:15:26
我對這個函數(shù)不是很了解 我明白是負(fù)責(zé)控件數(shù)據(jù)和內(nèi)部某個變量的雙向交換的函數(shù) 但是我實在不懂他的機理 似乎很神秘 而且是在UpDateData函數(shù)中調(diào)用的 程序員一般不怎么調(diào)用 就更神秘了 小弟謝謝高手了
查看完整描述

2 回答

?
陪伴而非守候

TA貢獻(xiàn)1757條經(jīng)驗 獲得超8個贊

關(guān)于對話框數(shù)據(jù)交換及驗證 

對話框的數(shù)據(jù)交換和驗證機制(DDX、DDV)可以使對話框上控件與對象數(shù)據(jù)成員間協(xié)調(diào)工作。 

包括控件窗口與控件對象間的連接,控件窗口與對話框數(shù)據(jù)成員間的連接,以及數(shù)據(jù)成員的合法性驗證等等。 

在 virtual void DoDataExchange(CDataExchange* pDX);中記錄了這些關(guān)系: 
例如: 

DDX_Control(pDX, IDC_BUTTON1, m_btn); //CButton對象到控件窗口IDC_BUTTON1的關(guān)聯(lián) 
DDX_Text(pDX, IDC_EDIT1, m_int); //整型數(shù)據(jù)到編輯窗口的關(guān)聯(lián) 
DDV_MinMaxInt(pDX, m_int, 0, 40); //整型數(shù)據(jù)的范圍驗證 

必要時,可以自己編寫驗證函數(shù)實現(xiàn)特定內(nèi)容檢驗。 

相關(guān)的成員函數(shù): 

CDialog::OnInitDialog(); 
CWnd::DoDataExchange(); 
CDialog::DoDataExchange(); 

1 .控件關(guān)聯(lián) 

DDX_Control實現(xiàn)控件窗口和C++控件對象的關(guān)聯(lián)。 
由于對話框是以模板的方式建立的,故控件窗口都是事先建立好的。 
C++控件對象用SubClassWindow的方法附著在控件窗口上,管理窗口的行為。 
內(nèi)部流程分析: 

①OnInitDialog 時調(diào)用基類CDialog::OnInitDialog(); 

BOOL CDialog::OnInitDialog() 

..... 
// 執(zhí)行UpdateData(),參數(shù)為FALSE,表示初始化 
if (!UpdateData(FALSE)) 

.... 

..... 


②UpdateData() 

BOOL CWnd::UpdateData(BOOL bSaveAndValidate) 

.... 

//調(diào)用虛函數(shù)DoDataExchange 
CDataExchange dx(this, bSaveAndValidate); 
.... 
TRY 

DoDataExchange(&dx); 
bOK = TRUE; // it worked 

..... 


③DoDataExchange 
void C????Dlg::DoDataExchange(CDataExchange* pDX) 

.... 
//對象到窗口的關(guān)聯(lián)。 
DDX_Control(pDX, IDC_BUTTON1, m_btn); 
.... 


④DDX_Control void AFXAPI DDX_Control(CDataExchange* pDX, int nIDC, CWnd& rControl) 

if (rControl.m_hWnd == NULL) //若還未關(guān)聯(lián) 

//窗口句柄 
HWND hWndCtrl = pDX->PrepareCtrl(nIDC); 
// SubclassWindow 實現(xiàn)關(guān)聯(lián)。 
if (!rControl.SubclassWindow(hWndCtrl)) 

.... 

.... 



至此,控件對象與對話框上的子窗口關(guān)聯(lián)上了,可以通過對控件對象的操作來管理該子窗口。 

2 .數(shù)據(jù)關(guān)聯(lián) 

大致流程與前相似。在對話框OnOK()時將調(diào)用Update(TRUE),參數(shù)TRUE表示讀出及校驗數(shù)據(jù)。 

另可根據(jù)需要,隨時調(diào)用Update(TRUE)完成窗口內(nèi)容到成員數(shù)據(jù)的校驗及轉(zhuǎn)換。 

流程分析(以編輯框到整數(shù)的關(guān)聯(lián)為例) 

①DoDataExchange 

void C???Dlg::DoDataExchange(CDataExchange* pDX) 

.... 
DDX_Text(pDX, IDC_EDIT1, m_int); 
.... 


②DDX_Text 

void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, int& value) 


if (pDX->m_bSaveAndValidate) //讀取及校驗 
_Afx_DDX_TextWithFormat(pDX, nIDC, _T("%d"), AFX_IDP_PARSE_INT, &value); 
else //初始化 
_Afx_DDX_TextWithFormat(pDX, nIDC, _T("%d"), AFX_IDP_PARSE_INT, value); 


③_Afx_DDX_TextWithFormat 

在對話框初始化時,m_bSaveAndValidate參數(shù)為FALSE; 

在進行數(shù)據(jù)讀取時,m_bSaveAndValidate參數(shù)為TRUE; 

AFX_STATIC void AFX_CDECL _Afx_DDX_TextWithFormat(CDataExchange* pDX, int nIDC, 
LPCTSTR lpszFormat, UINT nIDPrompt, ...) 
// only supports windows output formats - no floating point 

.... 
//窗口句柄 
HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC); 
TCHAR szT[32]; 
if (pDX->m_bSaveAndValidate) 

//讀取 
// the following works for %d, %u, %ld, %lu 
::GetWindowText(hWndCtrl, szT, _countof(szT)); 
if (!_AfxSimpleScanf(szT, lpszFormat, pData)) 

AfxMessageBox(nIDPrompt); 
pDX->Fail(); // throws exception 


else //對話框初始化時,以成員數(shù)據(jù)內(nèi)容初始窗口內(nèi)容。 


//初始化窗口內(nèi)容。 
wvsprintf(szT, lpszFormat, pData); 
AfxSetWindowText(hWndCtrl, szT); 

.... 


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

流程分析(以整數(shù)數(shù)值范圍驗證為例) 

void C????Dlg::DoDataExchange(CDataExchange* pDX) 

.... 
DDV_MinMaxInt(pDX, m_int, 0, 40); 
.... 

void AFXAPI DDV_MinMaxInt(CDataExchange* pDX, int value, int minVal, int maxVal) 

ASSERT(minVal <= maxVal); 

//驗證 
if (value < minVal || value > maxVal) 
//報錯返回 
_AfxFailMinMaxWithFormat(pDX, (long)minVal, (long)maxVal, _T("%ld"), 
AFX_IDP_PARSE_INT_RANGE); 
}

 


查看完整回答
反對 回復(fù) 2022-12-25
?
慕蓋茨4494581

TA貢獻(xiàn)1850條經(jīng)驗 獲得超11個贊

UpdateData函數(shù)內(nèi)部以this和UpdateData的參數(shù)為參數(shù),構(gòu)造了一個CDataExchange變量,以類變量的形式保存?zhèn)魅霕?gòu)造的參數(shù)。
然后調(diào)用DoDataExchange,傳入上面的變量。
由于DoDataExchange是虛函數(shù),這就回到了你的類的DoDataExchange中了。
DoDataExchange里面的宏很簡單,簡單看看就明白了。

查看完整回答
反對 回復(fù) 2022-12-25
  • 2 回答
  • 0 關(guān)注
  • 112 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號