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

📄 chap06.html

📁 利用软件开发
💻 HTML
📖 第 1 页 / 共 5 页
字号:
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER"><IMG SRC="Image372.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image372.gif" WIDTH=481 HEIGHT=314></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>6. 5 ClassWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>对话框</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">单击</FONT><FONT SIZE=3>Member Variables</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>选项卡,确信在</FONT><FONT SIZE=3>Project</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>处选择了</FONT><FONT SIZE=3>DialogDemo</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,在</FONT><FONT SIZE=3>Class name</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>处选择了</FONT><FONT SIZE=3>CDialogDemoDlg</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。现在我们为刚才添加的编辑框控件</FONT><FONT SIZE=3>IDC_EDIT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>添加一个数据映射入口。在</FONT><FONT SIZE=3>Control IDs</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>处选择</FONT><FONT SIZE=3>IDC_EDIT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,单击右边的</FONT><FONT SIZE=3>Add Viable</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>按钮。打开如图</FONT><FONT SIZE=3>6.6</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示的对话框。</P>
<P ALIGN="JUSTIFY">在</FONT><FONT SIZE=3>Member variable name</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>处链接变量名</FONT><FONT SIZE=3>m_strEdit (</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>这里</FONT><FONT SIZE=3>m</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>表示该变量为类</FONT><FONT SIZE=3>CDialogDemoDlg</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的一个成员变量,</FONT><FONT SIZE=3>str</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>表明其类型为字符串,即类</FONT><FONT SIZE=3>CString)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,在</FONT><FONT SIZE=3>Category</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>下拉列表中选择</FONT><FONT SIZE=3>Value (</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>另一种选择是</FONT><FONT SIZE=3>Control</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,两种选择的不同将在后面的内容中讲述</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,在</FONT><FONT SIZE=3>Variable type</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>下拉列表中选择</FONT><FONT SIZE=3>CString (</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>还有其它很多数据类型可供选择,但由于这里编辑框中的内容为一字符串,因此</FONT><FONT SIZE=3>CString</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>是最恰当的选择</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。单击</FONT><FONT SIZE=3>OK</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>关闭对话框。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER"><IMG SRC="Image373.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image373.gif" WIDTH=275 HEIGHT=226></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>6. 6 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>为控件映射添加成员变量</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">5.&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>检查一下现在的</FONT><FONT SIZE=3>ClassWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对话框</FONT><FONT SIZE=3>(</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>图</FONT><FONT SIZE=3>6.7)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>与图</FONT><FONT SIZE=3>6.5</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>相比有何不同。在图</FONT><FONT SIZE=3>6.7</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示的对话框中下方的</FONT><FONT SIZE=3>Maximum characters</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>文本框中输入</FONT><FONT SIZE=3>50</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。由字面意思可以很容易猜出其含义,即将编辑框</FONT><FONT SIZE=3>IDC_EDIT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中可能的最长字符串的大小限制为</FONT><FONT SIZE=3>50</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。单击</FONT><FONT SIZE=3>OK</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>关闭对话框。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER"><IMG SRC="Image374.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image374.gif" WIDTH=481 HEIGHT=314></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>6. 7 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>使用</FONT><FONT SIZE=1>ClassWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>设置数据验证方案</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">6.&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>从</FONT><FONT SIZE=3>Workspace</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>窗口的</FONT><FONT SIZE=3>ClassView</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中双击类</FONT><FONT SIZE=3>CDialogDemoDlg</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的</FONT><FONT SIZE=3>OnInitDialog</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数,使用下面的代码来代替位于语句</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>return TRUE;</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">前的</FONT><FONT SIZE=3>// TODO</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>注释:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>m_strEdit="您好! 请在这里输入一些字符串。";</P>
<P>UpdateData(FALSE);</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">7.&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在</FONT><FONT SIZE=3>ClassView</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中双击类</FONT><FONT SIZE=3>CDialogDemoApp</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的</FONT><FONT SIZE=3>InitInstance</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数,使用下面的代码来找替位于选择支</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>if (nResponse == IDOK)</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">下的</FONT><FONT SIZE=3>//TODO</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>注释:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>AfxMessageBox(dlg.m_strEdit);</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">然后将同一成员函数中的下面的代码行删掉</FONT><FONT SIZE=3>(</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>或注释掉</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>m_pMainWnd = &amp;dlg;</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">8.&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>编译并运行该应用程序。显示如图</FONT><FONT SIZE=3>6.8</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示的对话框。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER"><IMG SRC="Image375.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image375.gif" WIDTH=184 HEIGHT=106></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>6. 8 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>示例程序</FONT><FONT SIZE=1>DialogDemo</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>的运行结果</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">在图</FONT><FONT SIZE=3>6.8</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示的文本框中输入一些字符,单击“确定”。随即弹出如图</FONT><FONT SIZE=3>6.9</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示的消息框。该消息框复述了用户在图</FONT><FONT SIZE=3>6.8</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示的对话框中的输入。我们还发现,在图</FONT><FONT SIZE=3>6.8</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示的对话框中,当输入字符串达到一定的长度之后,我们不可以再输入更多的字符,这是我们在前面设置了</FONT><FONT SIZE=3>Maximum characters</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为</FONT><FONT SIZE=3>50</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的结果。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER"><IMG SRC="Image376.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image376.gif" WIDTH=228 HEIGHT=74></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>6. 9 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>以消息框的形式反馈输入的字符串</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">下面我们来看在上面的步骤中都完成了什么。首先我们使用资源编辑器向对话框模板中添加这些标准控件,这一步的概念很清晰,因此并不难理解。</P>
<P ALIGN="JUSTIFY">然后,我们打开了所绘制的编辑框的</FONT><FONT SIZE=3>Properties (</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>属性</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对话框。先将其控件</FONT><FONT SIZE=3>ID</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>设置为</FONT><FONT SIZE=3>IDC_EDIT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。这时如果打开头文件</FONT><FONT SIZE=3>Resource.h</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,就会发现宏</FONT><FONT SIZE=3>IDC_EDIT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>被定义为常量</FONT><FONT SIZE=3>1001</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。不过,事实上在很多情况下我们并不需要关心每一控件的</FONT><FONT SIZE=3>ID</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的具体值,而只需要记住相应的助记符。对于这里的编辑框控件,我们只需要记住</FONT><FONT SIZE=3>IDC_EDIT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>即可,而不需要关心它等于</FONT><FONT SIZE=3>1001</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。接着,我们在</FONT><FONT SIZE=3>Styles</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>选项卡中设置了</FONT><FONT SIZE=3>Multiline</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>属性,同时清除了</FONT><FONT SIZE=3>Auto HScroll</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>属性,两者共同作用使用得编辑框</FONT><FONT SIZE=3>IDC_EDIT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>支持多行文本,并且如文本行的长度超过编辑框宽度时自动回行。</P>
<P ALIGN="JUSTIFY">下面的步骤是最重要的一步,我们动用了功能强大的工具</FONT><FONT SIZE=3>ClassWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。首先,我们将编辑框与一个</FONT><FONT SIZE=3>CString</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象相关联,这使用了一种被称为</FONT><FONT SIZE=3>Dialog Data Exchange (DDX)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的机制。在这种机制中,我们先在处理函数</FONT><FONT SIZE=3>OnInitDialog</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>或对话框类的构造函数中对对话框对象的成员变量进行初始化,在对话框显示之前,框架的</FONT><FONT SIZE=3>DDX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>机制将成员变量的值传递给对话框中的控件。这个过程在成员函数</FONT><FONT SIZE=3>DoModal</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>或</FONT><FONT SIZE=3>Create</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>被调用的过程中发生。类</FONT><FONT SIZE=3>CDialog</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中对</FONT><FONT SIZE=3>OnInitDialog</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数的默认实现调用了类</FONT><FONT SIZE=3>CWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数</FONT><FONT SIZE=3>UpdateData</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来初始化对话框中的控件。这时我们就可以看到前面的第</FONT><FONT SIZE=3>6</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>步还可在具有下面的几种变通方案:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">1.&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>将代码行</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>m_strEdit="您好! 请在这里输入一些字符串。";</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">移到对基类的</FONT><FONT SIZE=3>OnInitDialog</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数的调用之前,即位于下面的代码之前:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>CDialog::OnInitDialog();</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>将代码</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>m_strEdit="您好! 请在这里输入一些字符串。";</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">移到类</FONT><FONT SIZE=3>CDialogDemoDlg</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的构造函数中。</P>
<P ALIGN="JUSTIFY">对于上面的两种方法,与前面第</FONT><FONT SIZE=3>6</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>步中使用的方法相比,我们没有必要调用类</FONT><FONT SIZE=3>CWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的成员函数</FONT><FONT SIZE=3>UpdateData</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。因为该函数在类</FONT><FONT SIZE=3>CDialog</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的成员函数</FONT><FONT SIZE=3>OnInitDialog</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中将被调用。</P>
<P ALIGN="JUSTIFY">这三种方法之间并没有明确的优劣之分,在很多情况下,它们分别适用于不同的场合。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">这里我们说一下成员函数</FONT><FONT SIZE=3>UpdateData</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。该函数带有一个布尔类型的参数,如果该参数为</FONT><FONT SIZE=3>FALSE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,函数</FONT><FONT SIZE=3>UpdateData</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>将成员变量的值传递给对话框的变量;而如果该参数为</FONT><FONT SIZE=3>TRUE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,函数</FONT><FONT SIZE=3>UpdateData</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>将进行相反的过程。</P>
<P ALIGN="JUSTIFY">如果用户单击了对话框中</FONT><FONT SIZE=3>ID</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为</FONT><FONT SIZE=3>IDOK</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的按钮,或者以</FONT><FONT SIZE=3>TRUE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为参数调用函数</FONT><FONT SIZE=3>UpdateData</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,</FONT><FONT SIZE=3>DDX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>机制从控件中将值传递到成员变量,同时对话框数据验证</FONT><FONT SIZE=3>(dialog data validation</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,</FONT><FONT SIZE=3>DDV)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>机制根据设定的验证规则验证所有数据项。</P>
<P ALIGN="JUSTIFY">在数据交换的过程中,成员函数</FONT><FONT SIZE=3>UpdateData</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>先创建一个</FONT><FONT SIZE=3>CDataExchange</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象,然后调用对话框对类</FONT><FONT SIZE=3>CDialog</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数</FONT><FONT SIZE=3>DoDataExchange</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的重载版本。该</FONT><FONT SIZE=3>CDataExchange</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象将作为成员函数</FONT><FONT SIZE=3>DoDataExchange</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的一个参数,该参数定义了数据交换的上下文。</P>
<P ALIGN="JUSTIFY">在</FONT><FONT SIZE=3>DoDataExchange</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中,我们为每一个数据成员指定了一个对</FONT><FONT SIZE=3>DDX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数的调用。每一个函数定义了基于由成员函数</FONT><FONT SIZE=3>UpdateData</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所提供的</FONT><FONT SIZE=3>CDataExchange</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>参数所确定的上下文而进行的双向数据交换。</P>
<P ALIGN="JUSTIFY">下面的代码摘自实现文件</FONT><FONT SIZE=3>DialogDemo.cpp</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中对函数</FONT><FONT SIZE=3>DoDataExchange</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的定义:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>void CDialogDemoDlg::DoDataExchange(CDataExchange* pDX)</P>
<P>{</P>
<P>&#9;CDialog::DoDataExchange(pDX);</P>
<P>&#9;//{{AFX_DATA_MAP(CDialogDemoDlg)</P>
<P>&#9;DDX_Text(pDX, IDC_EDIT, m_strEdit);</P>
<P>&#9;DDV_MaxChars(pDX, m_strEdit, 50);</P>
<P>&#9;//}}AFX_DATA_MAP</P>
<P>}</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">在两行注释</FONT><FONT SIZE=3>//{{AFX_DATA_MAP</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>//}}AFX_DATA_MAP</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>之间的代码部分称作数据映射。函数</FONT><FONT SIZE=3>DDX_Text</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>使用</FONT><FONT SIZE=3>CString</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象</FONT><FONT SIZE=3>m_strEdit</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>与</FONT><FONT SIZE=3>ID</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为</FONT><FONT SIZE=3>IDC_EDIT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的编辑框控件相关联。函数</FONT><FONT SIZE=3>DDV_MaxChars</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>设置与编辑框控件</FONT><FONT SIZE=3>IDC_EDIT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>相关联</FONT><FONT SIZE=3>CString</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象</FONT><FONT SIZE=3>m_strEdit</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的最大长度为</FONT><FONT SIZE=3>50</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
<P ALIGN="JUSTIFY">需要注意的是,如果用户在模式对话框中单击了“取消”</FONT><FONT SIZE=3>(Cancel)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>按钮,</FONT><FONT SIZE=3>DoModal</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数将返回值</FONT><FONT SIZE=3>IDCANCEL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,在这种情况下,在对话框和对话框对象之前的数据交换不会发生。</P>
<P ALIGN="JUSTIFY">由于这个原因,如果</FONT><FONT SIZE=3>DoModal</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数返回了值</FONT><FONT SIZE=3>IDOK</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,我们可以使用下面的代码来复述用户在对话框中所输入的值:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>AfxMessageBox(dlg.m_strEdit);</P>

<UL>
</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"><LI>注意:</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"><LI>在前面的第</FONT><FONT SIZE=3>7</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>步中有一个乍看起来有一些费解的过程,这就是我们为什么要将下面的代码从函数</FONT><FONT SIZE=3>OnInitDialog</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>中删除:</LI></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>m_pMainWnd = &amp;dlg;</LI></P></UL>
<DIR>
<DIR>

</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">这基于下面的一个事实:</P>
<P ALIGN="JUSTIFY">类</FONT><FONT SIZE=3>CWinThread</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>的数据成员</FONT><FONT SIZE=3>m_pMainWnd</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>有一个有用的特征,如果由该成员所引用的窗口被关闭的话,</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>库将自动的终止</FONT><FONT SIZE=3>CWinThread</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>对象所代表的线程。这样,如果我们将指向</FONT><FONT SIZE=3>dlg</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>的指针赋予了成员变量</FONT><FONT SIZE=3>m_pMainWnd</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>,那么,无论我们单击了“确认”还是“取消”,应用程序的主线程都将被自动终止,之后的代码当然不会得到执行。而在本示例中,我们希望在对话框被关闭后程序继续运行</FONT><FONT SIZE=3>(</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>即弹出一个消息重述用户所输入的内容</FONT><FONT SIZE=3>)</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>,因此不应该将</FONT><FONT SIZE=3>dlg</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>对象的指针赋予成员变量</FONT><FONT SIZE=3>m_pMainWnd</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>,从而需要将前面的代码从函数</FONT><FONT SIZE=3>OnInitDialog</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>中删除。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"> </P></DIR>
</DIR>

</FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4><P ALIGN="CENTER"><A NAME="_Toc425697418">第二节</FONT><FONT SIZE=4> </FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4>所有窗口类的基类:</FONT><FONT SIZE=4>CWnd</A></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">在</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中类</FONT><FONT SIZE=3>CWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>是一个很重要的类,它封装了</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>窗口句柄</FONT><FONT SIZE=3>HWND</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。在</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>编程中,窗口句柄唯一的标识了一个窗口。然而,尽管类</FONT><FONT SIZE=3>CWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的对象和窗口句柄之间有着如此紧密的联系,但两者并不是等同的概念。</FONT><FONT SIZE=3>CWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象通过类</FONT><FONT SIZE=3>CWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的构造函数和析构函数创建和消毁,而</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>窗口是</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>内部的一种数据结构,在类</FONT><FONT SIZE=3>CWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中,它通过</FONT><FONT SIZE=3>Create</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数创建,通过其析构函数消毁。除此之外,成员函数</FONT><FONT SIZE=3>DestroyWindow</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>可以消毁</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>窗口,而不需要消毁</FONT><FONT SIZE=3>CWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象。</P>
<P ALIGN="JUSTIFY">传统的</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序中,消息是通过一个称作窗口过程</FONT><FONT SIZE=3>(window procedure</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,通常具有</FONT><FONT SIZE=3>WndProc</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>之类的函数名</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的回调函数来处理的。这种方式在</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中仍然使用,但为</FONT><FONT SIZE=3>CWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类及其消息映射所隐藏。在类</FONT><FONT SIZE=3>CWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中,</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>通知消息会被自动的通过消息映射传递到类</FONT><FONT SIZE=3>CWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中合适的</FONT><I><FONT SIZE=3>OnMessage</I></FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数</FONT><FONT SIZE=3>(</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>这里</FONT><I><FONT SIZE=3>OnMessage</I></FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>是指这些函数具有的以</FONT><FONT SIZE=3>On</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为前缀的函数名,如</FONT><FONT SIZE=3>OnPaint</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和前面接触到的</FONT><FONT SIZE=3>OnInitDialog</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>等</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>进行处理。通常我们都在类</FONT><FONT SIZE=3>CWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的派生类中重载需要处理的特定消息所对应的</FONT><I><FONT SIZE=3>OnMessage</I></FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数。除了直接从</FONT><FONT SIZE=3>CWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>派生新的窗口类以外,我们更倾向于从</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中定义的其它类,如</FONT><FONT SIZE=3>CFrameWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>CMIDFrameWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>CMDIChileWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>CView</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>CDialog</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>以及</FONT><FONT SIZE=3>CButton</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>之类的控件类派生新的窗口类。在</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中定义的这些类本身也是从</FONT><FONT SIZE=3>CWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>派生的。</P>
<P ALIGN="JUSTIFY">通常我们使用两个步骤来创建一个窗口:首先,调用类</FONT><FONT SIZE=3>CWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的构造函数来构造一个</FONT><FONT SIZE=3>CWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象,然后调用其成员函数</FONT><FONT SIZE=3>Create</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来创建窗口并将该窗口与所创建的</FONT><FONT SIZE=3>CWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象相关联。</P>
<P ALIGN="JUSTIFY">当用户终止该窗口时,消毁与之相关联的</FONT><FONT SIZE=3>CWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象,或者调用</FONT><FONT SIZE=3>CWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象的成员函数</FONT><FONT SIZE=3>DestroyWindow</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>删除窗口并消毁其数据结构。</P>

⌨️ 快捷键说明

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