VC实用小知识总结 (二)

太平洋电脑网 2005年01月07日 15:55

      在本页浏览全文

      (26) 如何编程结束应用程序?
      这是个很简单又是编程中经常要遇到的问题.
      向窗口发送 WM_CLOSE消息,调用 CWnd::OnClose成员函数.允许对用户提示是否保存修改过的数据.
      系列文章:VC实用小知识总结(一)

      Example: AfxGetMainWindow()->SendMessage(WM_CLOSE)

      还可以创建一个自定义的函数 Terminate Window

      void Terminate Window(LPCSTR pCaption)
      {
      CWnd *pWnd=Cwnd::FindWindow(NULL,pCaption)

      if (pWnd)

      pWnd ->SendMessage(WM_CLOSE)
      }

      说明: FindWindow函数不是提倡的做法,因为它无法处理标题栏自动改变,比如我们要检测 Notepad是不是已运行而事先不知道Notepad的标题栏,这时FindWindow就无能为力了,可以通过枚举 windows任务列表的办法来实现。在机械出版社"Windows 95 API开发人员指南"一书有比较详细的介绍,这里就不再多说乐。

      (27) 如何创建和使用无模式对话框
      MFC将模式和无模式对话封装在同一个类中,但是使用无模式对话需要几个对话需要几个额处的步骤。首先,使用资源编辑器建立对话资源并使用ClassWizard创建一个CDialog的派生类。模式和无模式对话的中止是不一样的:模式对话通过调用CDialog : : EndDialog 来中止,无模式对话则是调用CWnd: : DestroyWindow来中止的,函数CDialog : : OnOK和CDialog : : OnCancel调用EndDialog ,所以需要调用DestroyWindow并重置无模式对话的函数。

      void CSampleDialog : : OnOK ( )
      {
      // Retrieve and validate dialog data .
      if (! UpdateData (TRUE) )
      {
      // the UpdateData rountine
      will set focus to correct item TRACEO (" UpdateData failed during dialog termination .\n")
      return
      }

      //Call DestroyWindow instead of EndDialog .
      DestroyWindow ( )
      }

      void CSampleDialog : : OnCancel ( )
      {
      //Call DestroyWindow instead of EndDialog .
      DestroyWindow ( )
      }

      其次,需要正确删除表示对话的C++对象。对于模式对来说,这很容易,需要创建函数返回后即可删除C++对象;无模式对话不是同步的,创建函数调用后立即返回,因而用户不知道何时删除C++对象。撤销窗口时工作框调用CWnd : : PostNcDestroy,可以重置该函数并执行清除操作,诸如删除this指针。

      void CSampleDialog : : PostNcDestroy ( )
      {
      // Declete the C++ object that represents this dialog.
      delete this

      最后,要创建无模式对话。可以调用CDialog : : DoModal创建一个模式对放,要创建一个无模式对话则要调用CDialog: : Create。下面的例子说明 了应用程序是如何创建无模式对话的: 象;无模式对话不是同步的,创建函数调用后立即返回,

      void CMainFrame : : OnSampleDialog ( )
      {
      //Allocate a modeless dialog object .
      CSampleDilog * pDialog =new CSampleDialog
      ASSERT_VALID (pDialog) Destroy ( )

      //Create the modeless dialog . represents this dialog.
      BOOL bResult = pDialog —> Creste (IDD_IDALOG)
      ASSERT (bResult )
      }

      (28) 如何防止主框窗口在其说明中显示活动的文档名
      创建主框窗口和MDI子窗口进通常具有FWS_ADDTOTITLE风格位,如果不希望在说明中自动添加文档名, 必须禁止该风格位, 可以使用ClassWizard重置

      CWnd: : PreCreateWindow并关闭FWS_ADDTOTITLE风格。
      BOOL CMainFrame : : PreCreateWindow (CREATESTRUCT&cs)
      {
      //Turn off FWS_ADDTOTITLE in main frame .
      cs.styel & = ~FWS_ADDTOTITLE  
      return CMDIFrameWnd : : PreCreateWindow (cs )
      }


      关闭MDI子窗口的FWS _ADDTOTITLE风格将创建一个具有空标题的窗口,可以调用CWnd: : SetWindowText来设置标题。记住自己设置标题时要遵循接口风格指南。

1/6