|
楼主 |
发表于 2006-1-13 11:09:53
|
显示全部楼层
清单5.8 在CRegisterDialog类的消息映射中加入ON_CONTROL_RANGE映射 <BR><BR> BEGIN_MESSAGE_MAP(CRegisterDialog, CDialog) <BR><BR> //{{AFX_MSG_MAP(CRegisterDialog) <BR><BR> ON_BN_CLICKED(IDC_ADD, OnAdd) <BR><BR> //}}AFX_MSG_MAP <BR><BR> ON_CONTROL_RANGE(BN_CLICKED, IDC_WORK, IDC_WORK1, OnWorkClicked) <BR><BR> END_MESSAGE_MAP() <BR><BR> ON_CONTROL_RANGE消息映射宏的第一个参数是控件消息码,第二和第三个参数分别指明了一组连续的控件ID中的头一个和最后一个ID,最后一个参数是消息处理函数名。如果读者是按表5.2的顺序放置控件的则IDC_WORK和IDC_WORK1应该是连续的。这样,无论用户是在IDC_WORK还是在IDC_WORK1单选按钮上单击,都会调用OnWorkClicked消息处理函数。 <BR><BR> 提示:如果不能确定两个ID是否是连续的,请用File->Open命令打开resource.h文件,在该文件中有对控件ID值的定义。如果发现两个ID是不连续的,读者可以改变对ID的定义值使之连续,但要注意改动后的值不要与别的ID值发生冲突。 <BR><BR> 最后,在CRegisterDialog类所在CPP文件的最后插入消息处理函数CRegisterDialog::OnWorkClicked,如清单5.9所示。 <BR><BR> 清单5.9 CRegisterDialog::OnWorkClicked消息处理函数 <BR><BR> void CRegisterDialog::OnWorkClicked(UINT nCmdID) <BR><BR> { <BR><BR> //判断“在职”单选按钮是否被选中 <BR><BR> if(IsDlgButtonChecked(IDC_WORK)) <BR><BR> { <BR><BR> //使控件允许 <BR><BR> GetDlgItem(IDC_UNIT)->EnableWindow(TRUE); <BR><BR> GetDlgItem(IDC_KIND)->EnableWindow(TRUE); <BR><BR> GetDlgItem(IDC_INCOME)->EnableWindow(TRUE); <BR><BR> } <BR><BR> else <BR><BR> { <BR><BR> //清除编辑框的内容并使之禁止 <BR><BR> GetDlgItem(IDC_UNIT)->SetWindowText(""); <BR><BR> GetDlgItem(IDC_UNIT)->EnableWindow(FALSE); <BR><BR> //使组合框处于未选择状态并使之禁止 <BR><BR> CComboBox *pComboBox=(CComboBox *)GetDlgItem(IDC_KIND); <BR><BR> pComboBox->SetCurSel(-1); <BR><BR> pComboBox->EnableWindow(FALSE); <BR><BR> //使列表框处于未选择状态并使之禁止 <BR><BR> m_ctrlIncome.SetCurSel(-1); <BR><BR> m_ctrlIncome.EnableWindow(FALSE); <BR><BR> } <BR><BR> } <BR><BR> OnWorkClicked函数判断“在职”单选按钮是否被选中。若该按钮被选中,则使单位情况组中的控件允许,若该按钮未被选中,则说明“下岗”按钮被选中,这时应使控件禁止,清除编辑框中的正文, 并且使组合框和列表框处于未选中状态。 <BR><BR> 在OnWorkClicked函数中主要调用了下列函数: <BR><BR> CWnd::IsDlgButtonChecked函数,用来判断单选按钮或检查框是否被选择,该函数的声明为<BR>UINT IsDlgButtonChecked(int nIDButton) const;<BR>参数nIDButton为按钮的ID。若按钮被选择,则函数返回1,否则返回0,若按钮处于不确定状态,则返回值为2。 <BR><BR> CWnd::GetDlgItem函数,用来获得指向某一控件的指针,该函数的声明为<BR>CWnd* GetDlgItem(int nID) const;<BR>参数nID为控件的ID。该函数返回一个指定控件的CWnd对象指针,通过该指针,程序可以对控件进行控制。 <BR><BR> CWnd::EnableWindow函数,该函数使窗口允许或禁止,禁止的窗口呈灰色显示,不能接收键盘和鼠标的输入。该函数的声明是<BR>BOOL EnableWindow( BOOL bEnable = TRUE );<BR>若参数bEnable的值为TRUE,则窗口被允许,若bEnable的值为FALSE,则窗口被禁止。 <BR><BR> CListBox::SetCurSel和CComboBox::SetCurSel函数功能类似,用来使列表中的某一项被选中,选中的项呈高亮度显示。函数的声明是<BR>int SetCurSel(int nSelect);<BR>参数nSelect指定了新选项的索引,第一项的索引值为0,若nSelect的值为-1,那么函数将清除以前的选择,使列表处于未选择状态。 <BR><BR> 有时,需要将GetDlgItem返回的CWnd指针强制转换成控件对象的指针,以便调用控件对象专有的成员函数对控件进行控制。例如,在程序中GetDlgItem(IDC_KIND)返回的指针被强制转换成CComboBox类型,只有这样,才能调用CComboBox::SetCurSel成员函数。 <BR><BR> 为了对控件进行查询和控制,在程序中采用了两种访问控件的方法。一种方法是直接利用ClassWizard提供的控件对象,例如m_ctrlIncome列表框对象。另一种方法是利用CWnd类提供的一组管理对话框控件的成员函数,例如程序中用到的GetDlgItem和IsDlgButtonChecked。这两种方法是在对话框内访问控件的常用方法,读者都应该掌握。表5.5列出了管理对话框控件的Cwnd成员函数。 <BR><BR> <BR><BR> 表5.5 用来管理对话框控件的CWnd成员函数 <BR><BR> 函数名 <BR> 功能 <BR><BR> CheckDlgButton <BR> 选中或不选中按钮控件。 <BR><BR> CheckRadioButton <BR> 选择一个指定的单选按钮并使同组内的其它单选按钮不被选择。 <BR><BR> DlgDirList <BR> 往一个列表框中添加文件、目录或驱动器的列表。 <BR><BR> DlgDirListComboBox <BR> 往一个组合框中的列表框内添加文件、目录或驱动器的列表。 <BR><BR> DlgDirSelect <BR> 从一个列表框中获得当前选择的文件、目录或驱动器。 <BR><BR> DlgDirSelectBomboBox <BR> 从一个组合框中获得当前选择的文件、目录或驱动器。 <BR><BR> GetCheckedRadioButton <BR> 返回指定的单选按钮组中被选择的单选按钮的ID。 <BR><BR> GetDlgItem <BR> 返回一个指向一给定的控件的临时对象的指针。 <BR><BR> GetDlgItemInt <BR> 返回在一个指定的控件中由正文表示的数字值。 <BR><BR> GetDlgItemText <BR> 获得在一个控件内显示的正文。 <BR><BR> GetNextDlgGroupItem <BR> 返回一个指向一组控件内的下一个或上一个控件的临时对象的指针。 <BR><BR> GetNextDlgTabItem <BR> 返回下一个tab顺序的控件的临时对象的指针。 <BR><BR> IsDlgButtonChecked <BR> 返回一个按钮控件的状态。 <BR><BR> SendDlgItemMessage <BR> 把一个消息传送给一个控件。 <BR><BR> SetDlgItemInt <BR> 将一个整数转换为正文,并将此正文赋给控件。 <BR><BR> SetDlgItemText <BR> 设置一个控件显示的正文。 <BR><BR><BR> 编译并运行Register看看,现在的登录数据对话框已经比较令人满意了。 <BR> |
|