?? vcc89.htm
字號(hào):
<html>
<head>
<title>c++系列</title>
<meta content="text/html; charset=gb2312" http-equiv=Content-Type>
</head>
<p align="center"><script src="../../1.js"></script></a>
<body bgcolor="#ffffff" leftmargin="5" topmargin="1" marginheight="5" marginwidth="5">
<div align=center>
<table border=0 cellpadding=0 cellspacing=0 width=680 align="center">
<tbody>
<tr>
<td width=200 height="59">
</tr>
</tbody>
</table>
<table border=1 bordercolordark=#ffffff bordercolorlight=#ffffff cellpadding=0
cellspacing=0 width=685 align="center" height="70">
<tbody>
<tr>
<td bgcolor=#F9D23C height=14>
<div align=center class=unnamed1>在對(duì)話框中進(jìn)行數(shù)據(jù)交換和數(shù)據(jù)檢查</div>
</td>
</tr>
<tr valign=top>
<td class=H1 height=51>
<p align="left"> <span class="unnamed1">MFC提供兩種方法在對(duì)話框中進(jìn)行數(shù)據(jù)交換和數(shù)據(jù)檢查(Dialog
data exchange/Dialog data validation),數(shù)據(jù)交換和數(shù)據(jù)檢查的思想是將某一變量和對(duì)話框中的一個(gè)子窗口進(jìn)行關(guān)聯(lián),然后通過(guò)調(diào)用BOOL
UpdateData( BOOL bSaveAndValidate = TRUE )來(lái)指示MFC將變量中數(shù)據(jù)放入子窗口還是將子窗口中數(shù)據(jù)取到變量中并進(jìn)行合法性檢查。</span></small></p>
<p class="unnamed1"><small>在進(jìn)行數(shù)據(jù)交換時(shí)一個(gè)子窗口可以和兩種類型的變量相關(guān)聯(lián),一種是控件(Control)對(duì)象,比如說(shuō)按鈕子窗口可以和一個(gè)CButton對(duì)象相關(guān)聯(lián),這種情況下你可以通過(guò)該對(duì)象直接控制子窗口,而不需要象上節(jié)中講的一樣使用GetDlgItem(IDC_CONTROL_ID)來(lái)得到窗口指針;一種是內(nèi)容對(duì)象,比如說(shuō)輸入框可以和一個(gè)CString對(duì)象關(guān)聯(lián),也可以和一個(gè)UINT類型變量關(guān)聯(lián),這種情況下你可以直接設(shè)置/獲取窗口中的輸入內(nèi)容。</small></p>
<p class="unnamed1"> 而數(shù)據(jù)檢查是在一個(gè)子窗口和一個(gè)內(nèi)容對(duì)象相關(guān)聯(lián)時(shí)在存取內(nèi)容時(shí)對(duì)內(nèi)容進(jìn)行合法性檢查,比如說(shuō)當(dāng)一個(gè)輸入框和一個(gè)CString對(duì)象關(guān)聯(lián)時(shí),你可以設(shè)置檢查CString的對(duì)象的最長(zhǎng)/最小長(zhǎng)度,當(dāng)輸入框和一個(gè)UINT變量相關(guān)聯(lián)時(shí)你可以設(shè)置檢查UINT變量的最大/最小值。在BOOL
UpdateData( BOOL bSaveAndValidate = TRUE )被調(diào)用后,合法性檢查會(huì)自動(dòng)進(jìn)行,如果無(wú)法通過(guò)檢查MFC會(huì)彈出消息框進(jìn)行提示,并返回FALSE。</small></p>
<p class="unnamed1"><small>設(shè)置DDX/DDV在VC中非常簡(jiǎn)單,ClassWizard可以替你完成所有的工作,你只需要打開ClassWizard并選中Member
Variables頁(yè),你可以看到所有可以進(jìn)行關(guān)聯(lián)的子窗口ID列表,雙擊一個(gè)ID會(huì)彈出一個(gè)添加變量的對(duì)話框,填寫相關(guān)的信息后按下確定按鈕就可以了。然后選中你剛才添加的變量在底部的輸入框中輸入檢查條件,</small></p>
<p class="unnamed1"><small>下面我們看一個(gè)例子,對(duì)話框上的子窗口設(shè)置,各子窗口的ID和關(guān)聯(lián)的變量如下表: </small>
<table align=center border=1 bordercolor=#0080c0
bordercolordark=#0080c0 bordercolorlight=#0080c0 cellpadding=3
cellspacing=0 width="100%">
<tbody>
<tr>
<td class="unnamed1">ID</td>
<td class="unnamed1">關(guān)聯(lián)的變量</td>
<td class="unnamed1">作用</td>
</tr>
<tr>
<td class="unnamed1">IDC_CHECK_TEST</td>
<td class="unnamed1">BOOL m_fCheck</td>
<td class="unnamed1">檢查框是否被選中</td>
</tr>
<tr>
<td class="unnamed1">IDC_RADOI_TEST_1</td>
<td class="unnamed1">int m_iSel</td>
<td class="unnamed1">當(dāng)前選擇的圓形按鈕的索引</td>
</tr>
<tr>
<td class="unnamed1">IDC_COMBO_TEST</td>
<td class="unnamed1">CString m_szCombo</td>
<td class="unnamed1">組合框中選中的文本或是輸入的文本</td>
</tr>
<tr>
<td class="unnamed1">IDC_EDIT_TEST</td>
<td class="unnamed1">CString m_szEdit</td>
<td class="unnamed1">輸入框中輸入的文本,最大長(zhǎng)度為5</td>
</tr>
<tr>
<td class="unnamed1">IDC_LIST_TEST</td>
<td class="unnamed1">CListBox m_lbTest</td>
<td class="unnamed1">列表框?qū)ο?lt;/td>
</tr>
</tbody>
</table>
<small>這時(shí)候ClassWizard會(huì)自動(dòng)生成變量定義和相關(guān)代碼,在對(duì)話框的構(gòu)造函數(shù)中可以對(duì)變量的初始值進(jìn)行設(shè)置,此外在BOOL
CDialog::OnInitDialog()中會(huì)調(diào)用UpdateData(FALSE),即會(huì)將變量中的數(shù)據(jù)放入窗口中 。相關(guān)代碼如下: </small>
</span>
<pre class="unnamed1">//頭文件中的變量定義,ClassWizard自動(dòng)產(chǎn)生
// Dialog Data
//{{AFX_DATA(CMy55_s1Dlg)
enum { IDD = IDD_MY55_S1_DIALOG };
CListBox m_lbTest;
int m_iSel;
CString m_szEdit;
CString m_szCombo;
BOOL m_fCheck;
//}}AFX_DATA
//構(gòu)造函數(shù)中賦初值
CMy55_s1Dlg::CMy55_s1Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CMy55_s1Dlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMy55_s1Dlg)
m_iSel = -1;
m_szEdit = _T("");
m_szCombo = _T("");
m_fCheck = FALSE;
//}}AFX_DATA_INIT
.....
}
//ClassWizard產(chǎn)生的關(guān)聯(lián)和檢查代碼
void CMy55_s1Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMy55_s1Dlg)
DDX_Control(pDX, IDC_LIST_TEST, m_lbTest);
DDX_Radio(pDX, IDC_RADIO_TEST_1, m_iSel);
DDX_Text(pDX, IDC_EDIT_TEST, m_szEdit);
DDV_MaxChars(pDX, m_szEdit, 5);
DDX_CBString(pDX, IDC_COMBO_TEST, m_szCombo);
DDX_Check(pDX, IDC_CHECK_TEST, m_fCheck);
//}}AFX_DATA_MAP
}
//在OnInitDialog中利用已經(jīng)關(guān)聯(lián)過(guò)的變量m_lbTest
BOOL CMy55_s1Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
...
// TODO: Add extra initialization here
//設(shè)置列表框中數(shù)據(jù)
m_lbTest.AddString("String 1");
m_lbTest.AddString("String 2");
m_lbTest.AddString("String 3");
m_lbTest.AddString("String 4");
return TRUE; // return TRUE unless you set the focus to a control
}
//對(duì)兩個(gè)按鈕消息處理
//通過(guò)UpdateData(TRUE)得到窗口中數(shù)據(jù)
void CMy55_s1Dlg::OnGet()
{
if(UpdateData(TRUE))
{
//數(shù)據(jù)合法性檢查通過(guò),可以使用變量中存放的數(shù)據(jù)
CString szOut;
szOut.Format("radio =%d \ncheck is %d\nedit input is %
s\ncomboBox input is %s\n",
m_iSel,m_fCheck,m_szEdit,m_szCombo);
AfxMessageBox(szOut);
}
//else 未通過(guò)檢查
}
//通過(guò)UpdateData(FALSE)將數(shù)據(jù)放入窗口
void CMy55_s1Dlg::OnPut()
{
m_szEdit="onPut test";
m_szCombo="onPut test";
UpdateData(FALSE);
}
</pre>
<p></p>
<p class="unnamed1"><small>在上面的例子中我們看到利用DDX/DDV和UpdateData(BOOL)調(diào)用我們可以很方便的存取數(shù)據(jù),而且也可以同時(shí)進(jìn)行合法性檢查。</small></p>
<p></p>
<p></p>
<p></p>
<div align="left"> </div>
</td>
</tr>
</tbody>
</table>
</div>
<p align="center"><script src="../../2.js"></script></a>
</body>
</html>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -