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

📄 chap5_4.htm

📁 着重介绍基于C++的web编程技术
💻 HTM
📖 第 1 页 / 共 2 页
字号:
    <p ALIGN="JUSTIFY"></font><font SIZE="3"> </p>
    <p ALIGN="JUSTIFY">清单</font><font FACE="Times New Roman" SIZE="3">5.11 CRegisterDialog</font><font SIZE="3">的部分代码</font></b><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY">void CRegisterDialog::PostNcDestroy() </p>
    <p ALIGN="JUSTIFY">{</p>
    <p ALIGN="JUSTIFY">// TODO: Add your specialized code here and/or call the base class</p>
    <p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY">delete this; //</font><font SIZE="3">删除对话框对象</font></b><font FACE="Times New Roman" SIZE="3"></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 CRegisterDialog::OnCancel() </p>
    <p ALIGN="JUSTIFY">{</p>
    <p ALIGN="JUSTIFY">// TODO: Add extra cleanup here</p>
    <p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY">((CRegisterView*)m_pParent)-&gt;m_pRegisterDlg=NULL;</p>
    <p ALIGN="JUSTIFY">DestroyWindow(); //</font><font SIZE="3">删除对话框 </font></b><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY">}</p>
    <p ALIGN="JUSTIFY">CRegisterView::OnEditRegister</font><font SIZE="3">函数判断登录数据对话框是否已打开,若是,就激活对话框,否则,就创建该对话框。该函数中主要调用了下列函数:</p>
    <blockquote>
      <blockquote>
        <p ALIGN="JUSTIFY">调用</font><font FACE="Times New Roman" SIZE="3">CWnd::SetActiveWindow</font><font SIZE="3">激活对话框,该函数的声明为<br>
        </font><font FACE="Times New Roman" SIZE="3">CWnd* SetActiveWindow( );<br>
        </font><font SIZE="3">该函数使本窗口成为活动窗口,并返回原来活动的窗口。</p>
        <p ALIGN="JUSTIFY">调用</font><font FACE="Times New Roman" SIZE="3">CDialog::Create</font><font SIZE="3">来显示对话框,该函数的声明为<br>
        </font><font FACE="Times New Roman" SIZE="3">BOOL Create( UINT nIDTemplate, CWnd* 
        pParentWnd = NULL );<br>
        </font><font SIZE="3">参数</font><font FACE="Times New Roman" SIZE="3">nIDTemplate</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">pParentWnd</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">CRegisterDialog::OnCancel</font><font SIZE="3">将被调用,在该函数中调用</font><font FACE="Times New Roman" SIZE="3">CWnd::DestroyWindow</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">m_pRegisterDlg</font><font SIZE="3">置为</font><font FACE="Times New Roman" SIZE="3">NULL</font><font SIZE="3">以表明对话框被关闭了。调用</font><font FACE="Times New Roman" SIZE="3">DestroyWindow</font><font SIZE="3">导致了对</font><font FACE="Times New Roman" SIZE="3">CRegisterDialog::PostNcDestroy</font><font SIZE="3">的调用,在该函数中用</font><font FACE="Times New Roman" SIZE="3">delete</font><font SIZE="3">操作符删除了</font><font FACE="Times New Roman" SIZE="3">CRegisterDialog</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"></p>
    <b><p ALIGN="JUSTIFY"></b></font><font color="#3973DE" FACE="Times New Roman" SIZE="3">5.4.2 
    </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">MFC</font><font SIZE="3">窗口对象包括两方面的内容:一是窗口对象封装的窗口,即存放在</font><font FACE="Times New Roman" SIZE="3">m_hWnd</font><font SIZE="3">成员中的</font><font FACE="Times New Roman" SIZE="3">HWND</font><font SIZE="3">(窗口句柄),二是窗口对象本身是一个</font><font FACE="Times New Roman" SIZE="3">C++</font><font SIZE="3">对象。要删除一个</font><font FACE="Times New Roman" SIZE="3">MFC</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">CWnd::DestroyWindow</font><font SIZE="3">或</font><font FACE="Times New Roman" SIZE="3">::DestroyWindow</font><font SIZE="3">,前者封装了后者的功能。前者不仅会调用后者,而且会使成员</font><font FACE="Times New Roman" SIZE="3">m_hWnd</font><font SIZE="3">保存的</font><font FACE="Times New Roman" SIZE="3">HWND</font><font SIZE="3">无效</font><font FACE="Times New Roman" SIZE="3">(NULL)</font><font SIZE="3">。如果</font><font FACE="Times New Roman" SIZE="3">DestroyWindow</font><font SIZE="3">删除的是一个父窗口或拥有者窗口,则该函数会先自动删除所有的子窗口或被拥有者,然后再删除父窗口或拥有者。在一般情况下,在程序中不必直接调用</font><font FACE="Times New Roman" SIZE="3">DestroyWindow</font><font SIZE="3">来删除窗口,因为</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">会自动调用</font><font FACE="Times New Roman" SIZE="3">DestroyWindow</font><font SIZE="3">来删除窗口。例如,当用户退出应用程序时,会产生</font><font FACE="Times New Roman" SIZE="3">WM_CLOSE</font><font SIZE="3">消息,该消息会导致</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">自动调用</font><font FACE="Times New Roman" SIZE="3">CWnd::DestroyWindow</font><font SIZE="3">来删除主框架窗口,当用户在对话框内按了</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">MFC</font><font SIZE="3">会自动调用</font><font FACE="Times New Roman" SIZE="3">CWnd::DestroyWindow</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">MFC</font><font SIZE="3">编程中,会使用大量的窗口对象,有些窗口对象以变量的形式嵌入在别的对象内或以局部变量的形式创建在堆栈上,有些则用</font><font FACE="Times New Roman" SIZE="3">new</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">C++</font><font SIZE="3">编程时,对</font><font FACE="Times New Roman" SIZE="3">new</font><font SIZE="3">操作符的使用往往不太踏实,因为用</font><font FACE="Times New Roman" SIZE="3">new</font><font SIZE="3">在堆中创建对象,就不能忘记用</font><font FACE="Times New Roman" SIZE="3">delete</font><font SIZE="3">删除对象。读者在学习</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">的例程时,可能会产生这样的疑问,为什么有些程序用</font><font FACE="Times New Roman" SIZE="3">new</font><font SIZE="3">创建了一个窗口对象,却未显式的用</font><font FACE="Times New Roman" SIZE="3">delete</font><font SIZE="3">来删除它呢?问题的答案就是有些</font><font FACE="Times New Roman" SIZE="3">MFC</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">CWnd::DestroyWindow</font><font SIZE="3">或</font><font FACE="Times New Roman" SIZE="3">::DestroyWindow</font><font SIZE="3">删除一个窗口时,被删除窗口的</font><font FACE="Times New Roman" SIZE="3">PostNcDestroy</font><font SIZE="3">成员函数会被调用。缺省的</font><font FACE="Times New Roman" SIZE="3">PostNcDestroy</font><font SIZE="3">什么也不干,但有些</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">窗口类会覆盖该函数并在新版本的</font><font FACE="Times New Roman" SIZE="3">PostNcDestroy</font><font SIZE="3">中调用</font><font FACE="Times New Roman" SIZE="3">delete this</font><font SIZE="3">来删除对象,从而具有了自动清除的功能。此类窗口对象通常是用</font><font FACE="Times New Roman" SIZE="3">new</font><font SIZE="3">操作符创建在堆中的,但程序员不必操心用</font><font FACE="Times New Roman" SIZE="3">delete</font><font SIZE="3">操作符去删除它们,因为一旦调用</font><font FACE="Times New Roman" SIZE="3">DestroyWindow</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">Windows</font><font SIZE="3">控件类。</p>
        <p ALIGN="JUSTIFY">从</font><font FACE="Times New Roman" SIZE="3">CWnd</font><font SIZE="3">类直接派生出来的子窗口对象(如用户定制的控件)。</p>
        <p ALIGN="JUSTIFY">切分窗口类</font><font FACE="Times New Roman" SIZE="3">CSplitterWnd</font><font SIZE="3">。</p>
        <p ALIGN="JUSTIFY">缺省的控制条类(包括工具条、状态条和对话条)。</p>
        <p ALIGN="JUSTIFY">模态对话框类。</font></p>
      </blockquote>
    </blockquote>
    <p><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">CFrameWnd</font><font SIZE="3">类派生)。</p>
        <p ALIGN="JUSTIFY">视图类(直接或间接从</font><font FACE="Times New Roman" SIZE="3">CView</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"></p>
    <p ALIGN="JUSTIFY"></font><font SIZE="3">综上所述,对于</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">窗口类及其派生类来说,在程序中一般不必显式删除窗口对象。也就是说,既不必调用</font><font FACE="Times New Roman" SIZE="3">DestroyWindow</font><font SIZE="3">来删除窗口对象封装的窗口,也不必显式地用</font><font FACE="Times New Roman" SIZE="3">delete</font><font SIZE="3">操作符来删除窗口对象本身。只要保证非自动清除的窗口对象是以变量的形式创建的,自动清除的窗口对象是在堆中创建的,</font><font FACE="Times New Roman" SIZE="3">MFC</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">CWnd::DestroyWindow</font><font SIZE="3">)删除窗口,然后再删除窗口对象.对于以变量形式创建的窗口对象,窗口对象的删除是框架自动完成的.对于在堆中动态创建了的非自动清除的窗口对象,必须在窗口被删除后,显式地调用</font><font FACE="Times New Roman" SIZE="3">delete</font><font SIZE="3">来删除对象(一般在拥有者或父窗口的析构函数中进行).对于具有自动清除功能的窗口对象,只需调用</font><font FACE="Times New Roman" SIZE="3">CWnd::DestroyWindow</font><font SIZE="3">即可删除窗口和窗口对象。注意,对于在堆中创建的窗口对象,不要在窗口还未关闭的情况下就用</font><font FACE="Times New Roman" SIZE="3">delete</font><font SIZE="3">操作符来删除窗口对象.</font><font FACE="Times New Roman" SIZE="3"></p>
    </font><font SIZE="3"><b><div align="center"><center><table border="2" cellpadding="2" cellspacing="0" width="90%" bgcolor="#A3BDEF">
      <tr>
        <td width="100%"></b>提示:在非模态对话框的</font><font FACE="Times New Roman" SIZE="3">OnCancel</font><font SIZE="3">函数中可以不调用</font><font FACE="Times New Roman" SIZE="3">CWnd::DestroyWindow</font><font SIZE="3">,取而代之的是调用</font><font FACE="Times New Roman" SIZE="3">CWnd::ShowWindow(SW_HIDE)</font><font SIZE="3">来隐藏对话框.在下次打开对话框时就不必调用</font><font FACE="Times New Roman" SIZE="3">Create</font><font SIZE="3">了,只需调用</font><font FACE="Times New Roman" SIZE="3">CWnd::ShowWindow(SW_SHOW)</font><font SIZE="3">来显示对话框.这样做的好处在于对话框中的数据可以保存下来,供以后使用.由于拥有者窗口在被关闭时会调用</font><font FACE="Times New Roman" SIZE="3">DestroyWindow</font><font SIZE="3">删除每一个所属窗口,故只要非模态对话框是自动清除的,程序员就不必担心对话框对象的删除问题.<b></b></font></td>
      </tr>
    </table>
    </center></div><p ALIGN="JUSTIFY"><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
    </font><div align="center"><center><table border="0" cellpadding="0" cellspacing="0" width="615">
      <tr>
        <td><a href="chap5_3.htm">上一页</a></td>
        <td><p align="right"><a href="chap5_5.htm">下一页</a></td>
      </tr>
    </table>
    </center></div><font SIZE="5"><hr noshade color="#3973DE" size="1">
    <p align="center"></font><font size="2" color="#000000">本教程由<a href="http://vcdynasty.yeah.net">Visual C++王朝(Where programmers come together)</a>协助制作<br>
    未经许可,请勿以任何形式复制</font></td>
    <b>
  </tr>
</table>
</center></div>

<p ALIGN="CENTER"></b><font SIZE="5"> </font><font FACE="Times New Roman" SIZE="5"></p>
</font><font FACE="Times New Roman" SIZE="3">

<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
</font></b>

<p><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>

<p></font> </p>
</body>
</html>

⌨️ 快捷键说明

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