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

📄 chap5_5.htm

📁 网络资源
💻 HTM
📖 第 1 页 / 共 4 页
字号:
        </font><font SIZE="3">当页被激活或被创建时,都会调用该函数。该函数的缺省行为是若页还未创建,就创建之,若页已经创建,则将其激活,并调用</font><font FACE="Times New Roman" SIZE="3">UpdateData(FALSE)</font><font SIZE="3">更新控件。用户可覆盖该函数完成一些刷新方面的工作。</p>
        </font><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">virtual BOOL OnKillActive( 
        );<br>
        </font><font SIZE="3">当原来可见的页被覆盖或被删除时,都会调用该函数。该函数的缺省行为是调用</font><font FACE="Times New Roman" SIZE="3">UpdateData(TRUE)</font><font SIZE="3">更新数据。用户可覆盖该函数完成一些特殊数据的有效性检查工作。</font></p>
      </blockquote>
    </blockquote>
    <p><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY"></font><font SIZE="3">需要说明的是,标签对话框中的所有页不一定都会被创建。实际上,那些从未打开过的页及其控件是不会被创建的。因此,在</font><font FACE="Times New Roman" SIZE="3">CPropertyPage</font><font SIZE="3">类的派生类中,只有在确定了页已存在后,才能调用与对话框及控件相关的函数(如</font><font FACE="Times New Roman" SIZE="3">UpdateData</font><font SIZE="3">)。如果收到控件通知消息,或</font><font FACE="Times New Roman" SIZE="3">OnSetActive</font><font SIZE="3">函数被调用,则说明页已经存在。正是由于上述原因,使得标签式对话框的内部数据交换只能在</font><font FACE="Times New Roman" SIZE="3">OnSetActive</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">OnKillActive</font><font SIZE="3">函数中进行。</font><font FACE="Times New Roman" SIZE="3"></p>
    <b><p ALIGN="JUSTIFY"></b></font><font color="#3973DE" FACE="Times New Roman" SIZE="3">5.5.3 
    </font><font SIZE="3" color="#3973DE">标签式对话框的具体实例</font><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY"></font><font SIZE="3">通过上面的分析,读者对标签式对话框已经比较了解了。现在,让我们在前面做过的</font><font FACE="Times New Roman" SIZE="3">Register</font><font SIZE="3">程序中加入一个标签式对话框来试验一下其功能。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY"></font><font SIZE="3">在</font><font FACE="Times New Roman" SIZE="3">Register</font><font SIZE="3">程序的登录数据对话框中有“个人情况”和“单位情况”两组控件,显然,我们可以创建一个标签式对话框并把两组控件分别放到两个页中。为了简单起见,我们仅要求输入姓名和单位名,简化后的标签式对话框如图</font><font FACE="Times New Roman" SIZE="3">5.11</font><font SIZE="3">所示。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="center"></font><img src="T5_11.gif" alt="T5_11.tif (172776 bytes)" WIDTH="556" HEIGHT="189"><font SIZE="3"></p>
    <p ALIGN="center">图</font><font FACE="Times New Roman" SIZE="3">5.11 </font><font SIZE="3">简化后的标签式对话框</font><font FACE="Times New Roman" SIZE="3"><b></p>
    <p ALIGN="JUSTIFY"></b></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY"></font><font SIZE="3">通过对标签式对话框的分析,读者已经知道</font><font FACE="Times New Roman" SIZE="3">CPropertySheet</font><font SIZE="3">类未对</font><font FACE="Times New Roman" SIZE="3">Apply</font><font SIZE="3">按钮的控件通知消息进行处理,这是一个不足之处。</font><font FACE="Times New Roman" SIZE="3">Register</font><font SIZE="3">的新版本将向读者演示如何在</font><font FACE="Times New Roman" SIZE="3">CPropertySheet</font><font SIZE="3">类的派生类中手工加入</font><font FACE="Times New Roman" SIZE="3">Apply</font><font SIZE="3">按钮的</font><font FACE="Times New Roman" SIZE="3">BN_CLICKED</font><font SIZE="3">消息处理函数。另外,新版本还演示了对话框与外部对象交流的一种较好办法,即通过发送用户定义消息来向外部对象传递信息。在登录数据对话框中,与外界交流的方法是在对话框内部直接访问派生的视图对象,这样做的优点是方便快捷,缺点则是对外界依赖较大,不利于移植。而用发送用户定义消息的方法则可以避免这个缺点。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY"></font><font SIZE="3">具体工作请按下面几步进行:</p>
    <blockquote>
      <blockquote>
        <p ALIGN="JUSTIFY">在菜单资源中的</font><font FACE="Times New Roman" SIZE="3">Edit</font><font SIZE="3">菜单的“登录数据</font><font FACE="Times New Roman" SIZE="3">...</font><font SIZE="3">”项的后面插入一个名为“标签式对话框</font><font FACE="Times New Roman" SIZE="3">...</font><font SIZE="3">”的菜单项,并指定其</font><font FACE="Times New Roman" SIZE="3">ID</font><font SIZE="3">为</font><font FACE="Times New Roman" SIZE="3">ID_EDIT_PROPDLG</font><font SIZE="3">。然后用</font><font FACE="Times New Roman" SIZE="3">ClassWizard</font><font SIZE="3">,在</font><font FACE="Times New Roman" SIZE="3">CRegisterView</font><font SIZE="3">类内为该菜单命令创建命令处理函数</font><font FACE="Times New Roman" SIZE="3">OnEditPropdlg</font><font SIZE="3">,该函数将用来显示标签式对话框。</p>
        <p ALIGN="JUSTIFY">为标签式对话框的第一页创建对话框模板。去掉缺省的</font><font FACE="Times New Roman" SIZE="3">OK</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">Cancel</font><font SIZE="3">按钮。注意应选择中文语种和宋体字体。在属性对话框中,指定对话框的</font><font FACE="Times New Roman" SIZE="3">ID</font><font SIZE="3">为</font><font FACE="Times New Roman" SIZE="3">IDD_PERSONAL</font><font SIZE="3">,标题为“个人情况”,在</font><font FACE="Times New Roman" SIZE="3">Styles</font><font SIZE="3">页中,选中</font><font FACE="Times New Roman" SIZE="3">TitleBar</font><font SIZE="3">项,并在</font><font FACE="Times New Roman" SIZE="3">Style</font><font SIZE="3">栏中选择</font><font FACE="Times New Roman" SIZE="3">Child</font><font SIZE="3">,在</font><font FACE="Times New Roman" SIZE="3">Border</font><font SIZE="3">栏中选择</font><font FACE="Times New Roman" SIZE="3">ThinBorder</font><font SIZE="3">。在</font><font FACE="Times New Roman" SIZE="3">More Styles</font><font SIZE="3">页中,选中</font><font FACE="Times New Roman" SIZE="3">Disable</font><font SIZE="3">。然后,在模板中加入控件,如图</font><font FACE="Times New Roman" SIZE="3">5.11</font><font SIZE="3">和表</font><font FACE="Times New Roman" SIZE="3">5.6</font><font SIZE="3">所示。</p>
        </font>
      </blockquote>
    </blockquote>
    <p><b><font SIZE="3"> </p>
    <p ALIGN="CENTER">表</font><font FACE="Times New Roman" SIZE="3">5.6</font></b></p>
    <table BORDER="1" CELLSPACING="1" CELLPADDING="1" WIDTH="579">
      <tr>
        <td WIDTH="33%"><font SIZE="3"><b><p ALIGN="JUSTIFY">控件类型</b></font></td>
        <td WIDTH="33%"><b><font SIZE="3"><p ALIGN="JUSTIFY">控件</font><font FACE="Times New Roman" SIZE="3">ID</font></b></td>
        <td WIDTH="33%"><font SIZE="3"><b><p ALIGN="JUSTIFY">控件标题</b></font></td>
      </tr>
      <tr>
        <td WIDTH="33%"><font SIZE="3"><p ALIGN="JUSTIFY">静态正文</font></td>
        <td WIDTH="33%"><font SIZE="3"><p ALIGN="JUSTIFY">缺省</font></td>
        <td WIDTH="33%"><font SIZE="3"><p ALIGN="JUSTIFY">姓名:</font></td>
      </tr>
      <tr>
        <td WIDTH="33%"><font SIZE="3"><p ALIGN="JUSTIFY">编辑框</font></td>
        <td WIDTH="33%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">IDC_NAME</font></td>
        <td WIDTH="33%"> </td>
      </tr>
    </table>
    <p><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
    <blockquote>
      <blockquote>
        </font><font SIZE="3"><p ALIGN="JUSTIFY">用</font><font FACE="Times New Roman" SIZE="3">ClassWizard</font><font SIZE="3">为模板</font><font FACE="Times New Roman" SIZE="3">IDD_PERSONAL</font><font SIZE="3">创建</font><font FACE="Times New Roman" SIZE="3">CPropertyPage</font><font SIZE="3">类的派生类,类名为</font><font FACE="Times New Roman" SIZE="3">CPersonalPage</font><font SIZE="3">。在该类中为控件</font><font FACE="Times New Roman" SIZE="3">IDC_NAME</font><font SIZE="3">加入对应的成员变量,变量名为</font><font FACE="Times New Roman" SIZE="3">m_strName</font><font SIZE="3">,类型为</font><font FACE="Times New Roman" SIZE="3">CString</font><font SIZE="3">。为控件</font><font FACE="Times New Roman" SIZE="3">IDC_NAME</font><font SIZE="3">加入</font><font FACE="Times New Roman" SIZE="3">EN_CHANGE</font><font SIZE="3">消息处理函数</font><font FACE="Times New Roman" SIZE="3">OnChangeName</font><font SIZE="3">,当编辑框的内容被改变时,控件会向对话框发出</font><font FACE="Times New Roman" SIZE="3">EN_CHANGE</font><font SIZE="3">消息。在</font><font FACE="Times New Roman" SIZE="3">OnChangeName</font><font SIZE="3">中,应该使</font><font FACE="Times New Roman" SIZE="3">Apply</font><font SIZE="3">按钮允许。</p>
        <p ALIGN="JUSTIFY">仿照步</font><font FACE="Times New Roman" SIZE="3">2</font><font SIZE="3">,为标签式对话框的第二页创建对话框模板。指定其</font><font FACE="Times New Roman" SIZE="3">ID</font><font SIZE="3">为</font><font FACE="Times New Roman" SIZE="3">IDD_UNIT</font><font SIZE="3">,标题为“单位情况”。在模板中加入的控件如图</font><font FACE="Times New Roman" SIZE="3">5.11</font><font SIZE="3">和表</font><font FACE="Times New Roman" SIZE="3">5.7</font><font SIZE="3">所示。</p>
        </font><b>
      </blockquote>
    </blockquote>
    <p><font SIZE="3"> </p>
    <p ALIGN="CENTER">表</font><font FACE="Times New Roman" SIZE="3">5.7</font></b></p>
    <table BORDER="1" CELLSPACING="1" CELLPADDING="1" WIDTH="579">
      <tr>
        <td WIDTH="33%"><font SIZE="3"><b><p ALIGN="JUSTIFY">控件类型</b></font></td>
        <td WIDTH="33%"><b><font SIZE="3"><p ALIGN="JUSTIFY">控件</font><font FACE="Times New Roman" SIZE="3">ID</font></b></td>
        <td WIDTH="33%"><font SIZE="3"><b><p ALIGN="JUSTIFY">控件标题</b></font></td>
      </tr>
      <tr>
        <td WIDTH="33%"><font SIZE="3"><p ALIGN="JUSTIFY">静态正文</font></td>
        <td WIDTH="33%"><font SIZE="3"><p ALIGN="JUSTIFY">缺省</font></td>
        <td WIDTH="33%"><font SIZE="3"><p ALIGN="JUSTIFY">工作单位:</font></td>
      </tr>
      <tr>
        <td WIDTH="33%"><font SIZE="3"><p ALIGN="JUSTIFY">编辑框</font></td>
        <td WIDTH="33%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">IDC_UNIT</font></td>
        <td WIDTH="33%"> </td>
      </tr>
    </table>
    <p><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
    <blockquote>
      <blockquote>
        </font><font SIZE="3"><p ALIGN="JUSTIFY">用</font><font FACE="Times New Roman" SIZE="3">ClassWizard</font><font SIZE="3">为模板</font><font FACE="Times New Roman" SIZE="3">IDD_UNIT</font><font SIZE="3">创建</font><font FACE="Times New Roman" SIZE="3">CPropertyPage</font><font SIZE="3">类的派生类,类名为</font><font FACE="Times New Roman" SIZE="3">CUnitPage</font><font SIZE="3">。在该类中为控件</font><font FACE="Times New Roman" SIZE="3">IDC_UNIT</font><font SIZE="3">加入对应的成员变量,变量名为</font><font FACE="Times New Roman" SIZE="3">m_strUnit</font><font SIZE="3">,类型为</font><font FACE="Times New Roman" SIZE="3">CString</font><font SIZE="3">。为控件</font><font FACE="Times New Roman" SIZE="3">IDC_UNIT</font><font SIZE="3">加入</font><font FACE="Times New Roman" SIZE="3">EN_CHANGE</font><font SIZE="3">消息处理函数</font><font FACE="Times New Roman" SIZE="3">OnChangeUnit</font><font SIZE="3">。</p>
        <p ALIGN="JUSTIFY">用</font><font FACE="Times New Roman" SIZE="3">ClassWizard</font><font SIZE="3">创建一个</font><font FACE="Times New Roman" SIZE="3">CPropertySheet</font><font SIZE="3">的派生类,类名为</font><font FACE="Times New Roman" SIZE="3">CRegisterSheet</font><font SIZE="3">。</p>
        <p ALIGN="JUSTIFY">在</font><font FACE="Times New Roman" SIZE="3">CRegisterApp</font><font SIZE="3">类的头文件的开头加入下面一行<br>
        </font><font FACE="Times New Roman" SIZE="3"><b>#define WM_USER_OUTPUT (WM_USER+200)<br>
        </b>WM_USER_OUTPUT</font><font SIZE="3">不是标准的</font><font FACE="Times New Roman" SIZE="3">Windows</font><font SIZE="3">消息,而是一个用户定义消息。在本例中,当标签式对话框的</font><font FACE="Times New Roman" SIZE="3">Apply</font><font SIZE="3">按钮被按下后,程序会向编辑视图发送该消息,编辑视图对应的消息处理函数应该输出对话框的数据。用户定义消息的编码范围是</font><font FACE="Times New Roman" SIZE="3">WM_USER</font><font SIZE="3">—</font><font FACE="Times New Roman" SIZE="3">0x7FFF</font><font SIZE="3">。</p>
        <p ALIGN="JUSTIFY">请读者按清单</font><font FACE="Times New Roman" SIZE="3">5.13</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">5.14</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">5.15</font><font SIZE="3">修改程序,限于篇幅,这里仅列出了需要修改的部分源代码。</p>
        </font>
      </blockquote>
    </blockquote>
    <p><b><font SIZE="3"> </p>
    <p ALIGN="JUSTIFY">清单</font><font FACE="Times New Roman" SIZE="3">5.13 CPersonalPage</font><font SIZE="3">类和</font><font FACE="Times New Roman" SIZE="3">CUnitPage</font><font SIZE="3">类的部分代码</font></b><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY">void CPersonalPage::OnChangeName() </p>
    <p ALIGN="JUSTIFY">{</p>
    <p ALIGN="JUSTIFY">// TODO: Add your control notification handler code here</p>
    <p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY">SetModified(TRUE); //</font><font SIZE="3">使</font><font FACE="Times New Roman" SIZE="3">Apply</font><font SIZE="3">按钮允许</font><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY">UpdateData(TRUE);</b></p>
    <p ALIGN="JUSTIFY">}</p>
    <p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY">void CUnitPage::OnChangeUnit() </p>
    <p ALIGN="JUSTIFY">{</p>
    <p ALIGN="JUSTIFY">// TODO: Add your control notification handler code here</p>
    <p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>

⌨️ 快捷键说明

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