⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chap5_3.htm

📁 很不错的一本关于VC的书
💻 HTM
📖 第 1 页 / 共 5 页
字号:
    handler code here</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>    <p><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">//更新数据</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">UpdateData(TRUE);</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">//检查数据是否有效</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">if(m_strName==&quot;&quot; || m_nSex&lt;0     || m_nWork&lt;0 || m_strUnit==&quot;&quot; </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">|| m_strKind==&quot;&quot; ||     m_strIncome==&quot;&quot;)</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">{</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">AfxMessageBox(&quot;请输入有效数据&quot;);</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">return;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">}</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">CString str;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">//获取编辑正文</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">m_pParent-&gt;GetWindowText(str);</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">//换行</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=&quot;\r\n&quot;;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=&quot;姓名:&quot;;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=m_strName;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=&quot;\r\n&quot;;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=&quot;性别:&quot;;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=m_nSex?&quot;女&quot;:&quot;男&quot;;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=&quot;\r\n&quot;;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=&quot;年龄:&quot;;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">CString str1;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">//将数据格式输出到字符串对象中</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str1.Format(&quot;%d&quot;,m_nAge);</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=str1;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=&quot;\r\n&quot;;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=&quot;婚否:&quot;;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=m_bMarried?&quot;已婚&quot;:&quot;未婚&quot;;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=&quot;\r\n&quot;;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=&quot;就业状况:&quot;;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=m_nWork?&quot;下岗&quot;:&quot;在职&quot;;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=&quot;\r\n&quot;;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=&quot;工作单位:&quot;;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=m_strUnit;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=&quot;\r\n&quot;;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=&quot;单位性质:&quot;;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=m_strKind;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=&quot;\r\n&quot;;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=&quot;工资收入:&quot;;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=m_strIncome;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=&quot;\r\n&quot;;</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">//更新编辑视图中的正文</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">m_pParent-&gt;SetWindowText(str);</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">}</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">CRegisterDialog的构造函数有一个参数pParent,该参数是一个指向CWnd对象的指针,用于指定对话框的父窗口或拥有者窗口。在CRegisterView::     OnEditRegister函数中,在构建CRegisterDialog对象时指定了this参数,this指针指向CRegisterView对象本身。这样在调用CRegisterDialog的构造函数时,this指针值被赋给了CRegisterDialog的成员m_pParent。OnAdd函数可利用m_pParent来访问对话框的拥有者即CRegisterView对象。</span></p>    <div align="center"><center><table border="2" cellpadding="2" cellspacing="0" width="90%"    bgcolor="#99B7EE">      <tr>        <td width="100%"><span style="font-size: 9pt">提示:术语父窗口(Parent)是相对于子窗口而言。若某一个窗口拥有一个子窗口(Child),则该窗口就被称为子窗口的父窗口。子窗口就是具有WS_CHILD风格的窗口,子窗口依赖于父窗口且完全被限制在父窗口内部。拥有者窗口(owner)相对于被拥有者窗口而言。若某一个窗口拥有一个非子窗口,则该窗口被称为拥有者窗口。被拥有窗口(owned)不具有WS_CHILD风格,可在屏幕上任意移动。</span></td>      </tr>    </table>    </center></div><p ALIGN="JUSTIFY"><span style="font-size: 9pt">当用户用鼠标点击IDC_ADD按钮时,该按钮的BN_CLICKED消息处理函数CRegisterDialog::OnAdd将被调用。在OnAdd中,首先调用了UpdateData(TRUE)以把数据从控件传给对话框的数据成员变量。然后,程序要对数据的有效性进行检查,如果输入的数据不完全有效,则会显示一个消息对话框,提示用户输入有效的数据。接下来进行的工作是在视图中输出数据,这部分代码与清单5.4类似,读者应该比较熟悉了。</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">完成上述工作后,登录数据对话框就变得较为实用了。打开对话框后,用户可以方便地输入多人的数据,只有按了取消按钮后,对话框才会关闭。</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">接下来让我们来解决第二个问题。解决该问题的关键在于当用户点击“在职”或“下岗”单选按钮时,程序要对收到的BN_CLICKED消息作出响应。有些读者可能会想到为两个单选按钮分别创建BN_CLICKED消息处理函数,这在只有两个单选按钮的情况下是可以的,但如果一组内有多个单选按钮,则分别创建消息处理函数就比较麻烦了。利用MFC提供的消息映射宏ON_CONTROL_RANGE可以避免这种麻烦,该映射宏把多个ID连续的控件发出的消息映射到同一个处理函数上。这样,我们只要编写一个消息处理函数,就可以对“在职”和“下岗”两个单选按钮的BN_CLICKED消息作出响应。ClassWizard不支持ON_CONTROL_RANGE宏,所以我们必须手工创建单选按钮的消息映射和消息处理函数。</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">首先,在CRegisterDialog类的头文件中加入消息处理函数的声明,该函数名为OnWorkClicked,如清单5.7所示。</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">清单5.7 BN_CLICKED消息处理函数OnWorkClicked的声明</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">. . . . . . </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">protected:</span></p>    <p><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">void OnWorkClicked(UINT nCmdID);</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">// Generated message map functions</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">//{{AFX_MSG(CRegisterDialog)</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">virtual BOOL OnInitDialog();</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">afx_msg void OnAdd();</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">//}}AFX_MSG</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">. . . . . .</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">然后,在CRegisterDialog类的消息映射中加入ON_CONTROL_RANGE映射,如清单5.8所示。ON_CONTROL_RANGE映射的形式是ON_CONTROL_RANGE</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">清单5.8 在CRegisterDialog类的消息映射中加入ON_CONTROL_RANGE映射</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">BEGIN_MESSAGE_MAP(CRegisterDialog,     CDialog)</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">//{{AFX_MSG_MAP(CRegisterDialog)</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">ON_BN_CLICKED(IDC_ADD, OnAdd)</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">//}}AFX_MSG_MAP</span></p>    <p><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">ON_CONTROL_RANGE(BN_CLICKED, IDC_WORK,     IDC_WORK1, OnWorkClicked)</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">END_MESSAGE_MAP()</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">ON_CONTROL_RANGE消息映射宏的第一个参数是控件消息码,第二和第三个参数分别指明了一组连续的控件ID中的头一个和最后一个ID,最后一个参数是消息处理函数名。如果读者是按表5.2的顺序放置控件的则IDC_WORK和IDC_WORK1应该是连续的。这样,无论用户是在IDC_WORK还是在IDC_WORK1单选按钮上单击,都会调用OnWorkClicked消息处理函数。</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">提示:如果不能确定两个ID是否是连续的,请用File-&gt;Open命令打开resource.h文件,在该文件中有对控件ID值的定义。如果发现两个ID是不连续的,读者可以改变对ID的定义值使之连续,但要注意改动后的值不要与别的ID值发生冲突。</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">最后,在CRegisterDialog类所在CPP文件的最后插入消息处理函数CRegisterDialog::OnWorkClicked,如清单5.9所示。</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">清单5.9 CRegisterDialog::OnWorkClicked消息处理函数</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">void CRegisterDialog::OnWorkClicked(UINT     nCmdID) </span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">{</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">//判断“在职”单选按钮是否被选中</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">if(IsDlgButtonChecked(IDC_WORK))</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">{</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">//使控件允许</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">GetDlgItem(IDC_UNIT)-&gt;EnableWindow(TRUE);</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">GetDlgItem(IDC_KIND)-&gt;EnableWindow(TRUE);</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">GetDlgItem(IDC_INCOME)-&gt;EnableWindow(TRUE);</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">}</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">else</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">{</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">//清除编辑框的内容并使之禁止</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">GetDlgItem(IDC_UNIT)-&gt;SetWindowText(&quot;&quot;);</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">GetDlgItem(IDC_UNIT)-&gt;EnableWindow(FALSE);</span></p>    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -