共用方式為


特殊 CWinApp 服務

除了執行訊息迴圈,並讓您有機會初始化應用程式並在應用程式之後清除, CWinApp 還提供數個其他服務。

殼層註冊

根據預設,MFC 應用程式精靈可讓使用者在檔案總管或檔案管理員中,按兩下開啟您的應用程式所建立的資料檔案。 如果您的應用程式是 MDI 應用程式,而且您為應用程式建立的檔案指定擴充功能,MFC 應用程式精靈會將 CWinApp 的 RegisterShellFileTypes EnableShellOpen 成員函 式的呼叫新增至 InitInstance 它為您寫入的覆寫。

RegisterShellFileTypes 將您的應用程式的文件類型註冊於檔案總管或檔案管理員。 此函式會將項目加入至 Windows 維護的註冊資料庫。 項目會註冊每個文件類型,將副檔名與檔案類型建立關聯,指定命令列以開啟應用程式,並指定動態資料交換 (DDE) 命令以開啟該類型的文件。

EnableShellOpen 可讓您的應用程式接收來自檔案總管或檔案管理員的 DDE 命令,以開啟使用者選擇的檔案,來完成處理序。

CWinApp 中的此項自動註冊支援,不需要以應用程式傳輸 .reg 檔案或執行特殊安裝工作。

如果您想要為應用程式初始化 GDI+ (藉由在 InitInstance 函式中 呼叫 GdiplusStartup ),您必須隱藏 GDI+ 背景執行緒。

若要這樣做,您可以將 GdiplusStartupInput 結構的成員 設定 SuppressBackgroundThread TRUE 。 隱藏 GDI+ 背景執行緒時, NotificationHook 應該在進入和結束應用程式的訊息迴圈之前進行 和 NotificationUnhook 呼叫。 如需這些呼叫的詳細資訊,請參閱 GdiplusStartupOutput 。 因此,呼叫的好位置 GdiplusStartup ,而攔截通知函式將會在虛擬函 式 CWinApp::Run 的覆寫中,如下所示:

int CMyWinApp::Run()
{
   GdiplusStartupInput gdiSI;
   GdiplusStartupOutput gdiSO;
   ULONG_PTR gdiToken;
   ULONG_PTR gdiHookToken;

   gdiSI.SuppressBackgroundThread = TRUE;
   GdiplusStartup(&gdiToken, &gdiSI, &gdiSO);
   gdiSO.NotificationHook(&gdiHookToken);
   int nRet = CWinApp::Run();

   gdiSO.NotificationUnhook(gdiHookToken);
   GdiplusShutdown(gdiToken);

   return nRet;
}

如果您不要隱藏背景 GDI+ 執行緒,DDE 命令可以在其主視窗建立之前提早發行至應用程式。 殼層發出的 DDE 命令可能會提前中止,造成錯誤訊息。

檔案管理員拖放

檔案可以從 [檔案管理員] 或 [檔案總管] 中的檔案檢視拖曳至應用程式中的視窗。 比方說,您可以將一個或多個檔案拖曳到 MDI 應用程式的主視窗,使應用程式可以在此擷取檔案名稱和開啟這些檔案的 MDI 子視窗。

若要在應用程式中啟用檔案拖放功能,MFC 應用程式精靈會在 中為您的主框架視窗寫入 CWnd 成員函 式 DragAcceptFiles 的呼叫 。 InitInstance 如果不要實作拖放功能,您可以移除該呼叫。

注意

您也可以實作多個一般拖放功能,在文件內或之間以 OLE 拖曳資料。 如需詳細資訊,請參閱 OLE 拖放 一文

追蹤最近使用的檔

使用者開啟和關閉檔案時,應用程式物件會記錄最近四個最常使用的檔案。 這些檔案名稱會新增至 [檔案] 功能表,當檔案變更時則會更新。 架構會使用與專案相同的名稱將這些檔案名稱儲存在登錄或 .ini 檔案中,並在應用程式啟動時從檔案讀取這些名稱。 InitInstanceMFC 應用程式精靈為您建立的 覆寫包含對 CWinApp 成員函 式 LoadStdProfile 的呼叫設定 ,它會從登錄或 .ini 檔案載入資訊,包括最近使用的檔案名。

這些項目儲存如下:

  • 在 Windows NT、Windows 2000 和更新版本中,值會儲存到登錄機碼。

  • 在 Windows 3.x 中,值會儲存到 WIN.INI 檔案中。

  • 在 Windows 95 和更新版本中,值會儲存到快取版本的 WIN.INI 中。

另請參閱

CWinApp:應用程式類別