?? vcc89.htm
字號:
<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>在對話框中進行數據交換和數據檢查</div>
</td>
</tr>
<tr valign=top>
<td class=H1 height=51>
<p align="left"> <span class="unnamed1">MFC提供兩種方法在對話框中進行數據交換和數據檢查(Dialog
data exchange/Dialog data validation),數據交換和數據檢查的思想是將某一變量和對話框中的一個子窗口進行關聯,然后通過調用BOOL
UpdateData( BOOL bSaveAndValidate = TRUE )來指示MFC將變量中數據放入子窗口還是將子窗口中數據取到變量中并進行合法性檢查。</span></small></p>
<p class="unnamed1"><small>在進行數據交換時一個子窗口可以和兩種類型的變量相關聯,一種是控件(Control)對象,比如說按鈕子窗口可以和一個CButton對象相關聯,這種情況下你可以通過該對象直接控制子窗口,而不需要象上節中講的一樣使用GetDlgItem(IDC_CONTROL_ID)來得到窗口指針;一種是內容對象,比如說輸入框可以和一個CString對象關聯,也可以和一個UINT類型變量關聯,這種情況下你可以直接設置/獲取窗口中的輸入內容。</small></p>
<p class="unnamed1"> 而數據檢查是在一個子窗口和一個內容對象相關聯時在存取內容時對內容進行合法性檢查,比如說當一個輸入框和一個CString對象關聯時,你可以設置檢查CString的對象的最長/最小長度,當輸入框和一個UINT變量相關聯時你可以設置檢查UINT變量的最大/最小值。在BOOL
UpdateData( BOOL bSaveAndValidate = TRUE )被調用后,合法性檢查會自動進行,如果無法通過檢查MFC會彈出消息框進行提示,并返回FALSE。</small></p>
<p class="unnamed1"><small>設置DDX/DDV在VC中非常簡單,ClassWizard可以替你完成所有的工作,你只需要打開ClassWizard并選中Member
Variables頁,你可以看到所有可以進行關聯的子窗口ID列表,雙擊一個ID會彈出一個添加變量的對話框,填寫相關的信息后按下確定按鈕就可以了。然后選中你剛才添加的變量在底部的輸入框中輸入檢查條件,</small></p>
<p class="unnamed1"><small>下面我們看一個例子,對話框上的子窗口設置,各子窗口的ID和關聯的變量如下表: </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">關聯的變量</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">當前選擇的圓形按鈕的索引</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">輸入框中輸入的文本,最大長度為5</td>
</tr>
<tr>
<td class="unnamed1">IDC_LIST_TEST</td>
<td class="unnamed1">CListBox m_lbTest</td>
<td class="unnamed1">列表框對象</td>
</tr>
</tbody>
</table>
<small>這時候ClassWizard會自動生成變量定義和相關代碼,在對話框的構造函數中可以對變量的初始值進行設置,此外在BOOL
CDialog::OnInitDialog()中會調用UpdateData(FALSE),即會將變量中的數據放入窗口中 。相關代碼如下: </small>
</span>
<pre class="unnamed1">//頭文件中的變量定義,ClassWizard自動產生
// 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
//構造函數中賦初值
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產生的關聯和檢查代碼
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中利用已經關聯過的變量m_lbTest
BOOL CMy55_s1Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
...
// TODO: Add extra initialization here
//設置列表框中數據
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
}
//對兩個按鈕消息處理
//通過UpdateData(TRUE)得到窗口中數據
void CMy55_s1Dlg::OnGet()
{
if(UpdateData(TRUE))
{
//數據合法性檢查通過,可以使用變量中存放的數據
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 未通過檢查
}
//通過UpdateData(FALSE)將數據放入窗口
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)調用我們可以很方便的存取數據,而且也可以同時進行合法性檢查。</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>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -