木有页眉
首先我们产生编辑好一个对话框,如图,
在对话框中使用的控件和ID号如下表:
ID IDC_RADIO_TEST_1 IDC_RADIO_TEST_2 IDC_BUTTON_TEST IDC_CHECK_TEST IDC_TREE_TEST IDC_LIST_CTRL IDC_TAB_CTRL IDC_LIST_TEST IDC_COMBO_TEST IDC_EDIT_TEST 类型 圆形按钮 圆形按钮 按钮 检查按钮 树形控件 List Ctrl Tab Ctrl 列表框 组合框 输入框 首先我们需要在对话框的OnInitDialog()函数中对各个控件进行初始化,这里我们使用CWnd*
GetDlgItem( int nID )来通过ID号得到子窗口指针。(类似的函数还有UINT GetDlgItemInt( int nID, BOOL* lpTrans = NULL, BOOL bSigned = TRUE ) 通过ID号得到子窗口中输入的数字,int
GetDlgItemText( int nID, CString& rString ) 通过ID号得到子窗口中输入的文字)。代码如下: BOOL CMy54_s1Dlg::OnInitDialog() {
61
木有页眉
CDialog::OnInitDialog(); /*添加初始化代码*/ //初始化输入框 ((CEdit*)GetDlgItem(IDC_EDIT_TEST))->SetWindowText(\ //初始化列表框 CListBox* pListB=(CListBox*)GetDlgItem(IDC_LIST_TEST); pListB->AddString(\ pListB->AddString(\ pListB->AddString(\ //初始化组合框 CComboBox* pCB=(CComboBox*)GetDlgItem(IDC_COMBO_TEST); pCB->AddString(\ pCB->AddString(\ pCB->AddString(\ //初始化Tab Ctrl CTabCtrl* pTab=(CTabCtrl*)GetDlgItem(IDC_TAB_TEST); pTab->InsertItem(0,\ pTab->InsertItem(1,\ pTab->InsertItem(2,\ //初始化ListCtrl CListCtrl* pList=(CListCtrl*)GetDlgItem(IDC_LIST_CTRL); pList->InsertColumn(0,\ pList->InsertItem(0,\ pList->InsertItem(1,\ pList->InsertItem(2,\ //初始化TreeCtrl CTreeCtrl* pTree=(CTreeCtrl*)GetDlgItem(IDC_TREE_TEST); pTree->InsertItem(\ HTREEITEM hNode=pTree->InsertItem(\ pTree->InsertItem(\ pTree->InsertItem(\ pTree->Expand(hNode,TVE_EXPAND); return TRUE; // return TRUE unless you set the focus to a control }
接下来我们需要利用ClassWizard对控件所产生的消息进行映射,打开ClassWizard对话框,选中相关控件的ID,在右边的列表中就会显示出可用的消息。如我们对按钮的消息进行映射,在选中按钮ID(IDC_BUTTON_TEST)后,会看到两个消息,如图,
62
木有页眉
一个是BN_CLICKED,一个是BN_DOUBLECLICKED。双击BN_CLICKED后在弹出的对话框中输入函数名,ClassWizard会产生按钮被按的消息映射。
然后我们看看对TabCtrl的TCN_SELCHANGE消息进行映射,如图,
在TabCtrl的当前页选择发生改变时这个消息会被发送,所以通过映射该消息可以在当前页改变时及时得到通知。
63
木有页眉
最后我们对输入框的EN_CHANGE消息进行映射,如图,
在输入框中的文本改变后该消息会被发送。相关的代码如下:
//头文件中相关的消息处理函数定义 afx_msg void OnButtonTest(); afx_msg void OnSelchangeTabTest(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnChangeEditTest(); //}}AFX_MSG DECLARE_MESSAGE_MAP()
//CPP文件中消息映射代码 ON_BN_CLICKED(IDC_BUTTON_TEST, OnButtonTest) ON_NOTIFY(TCN_SELCHANGE, IDC_TAB_TEST, OnSelchangeTabTest) ON_EN_CHANGE(IDC_EDIT_TEST, OnChangeEditTest) //}}AFX_MSG_MAP END_MESSAGE_MAP()
//消息处理函数
void CMy54_s1Dlg::OnButtonTest() { AfxMessageBox(\}
void CMy54_s1Dlg::OnSelchangeTabTest(NMHDR* pNMHDR, LRESULT* pResult) { TRACE(\ *pResult = 0; }
64
木有页眉
void CMy54_s1Dlg::OnChangeEditTest() { TRACE(\ }
对于其他的控件都可以采取类似的方法进行消息映射,下载例子。此外如果你对各种控件可以使用的消息不熟悉,你可以通过使用对话框,然后利用ClassWizard产生相关代码的方法来进行学习,你也可以将ClassWizard产生的代码直接拷贝到其他需要的地方(不瞒你说,我最开始就是这样学的 :-D 这也算一个小窍门)。
5.5 在对话框中进行数据交换和数据检查
MFC提供两种方法在对话框中进行数据交换和数据检查(Dialog data exchange/Dialog data validation),数据交换和数据检查的思想是将某一变量和对话框中的一个子窗口进行关联,然后通过调用BOOL UpdateData( BOOL bSaveAndValidate = TRUE )来指示MFC将变量中数据放入子窗口还是将子窗口中数据取到变量中并进行合法性检查。
在进行数据交换时一个子窗口可以和两种类型的变量相关联,一种是控件(Control)对象,比如说按钮子窗口可以和一个CButton对象相关联,这种情况下你可以通过该对象直接控制子窗口,而不需要象上节中讲的一样使用GetDlgItem(IDC_CONTROL_ID)来得到窗口指针;一种是内容对象,比如说输入框可以和一个CString对象关联,也可以和一个UINT类型变量关联,这种情况下你可以直接设置/获取窗口中的输入内容。
而数据检查是在一个子窗口和一个内容对象相关联时在存取内容时对内容进行合法性检查,比如说当一个输入框和一个CString对象关联时,你可以设置检查CString的对象的最长/最小长度,当输入框和一个UINT变量相关联时你可以设置检查UINT变量的最大/最小值。在BOOL UpdateData( BOOL bSaveAndValidate = TRUE )被调用后,合法性检查会自动进行,如果无法通过检查MFC会弹出消息框进行提示,并返回FALSE。 设置DDX/DDV在VC中非常简单,ClassWizard可以替你完成所有的工作,你只需要打开ClassWizard并选中Member Variables页,如图,
65