除了執行訊息迴圈並讓您有機會初始化應用程式以及在結束後進行清理之外,CWinApp 還提供數個其他服務。
外殼註冊
根據預設,MFC 應用程式精靈使得使用者能夠在 [檔案總管] 或 [檔案管理員] 中按兩下開啟應用程式所建立的資料檔。 如果您的應用程式是 MDI 應用程式,並且您指定應用程式所創建檔案的副檔名,那麼 MFC 應用程式精靈會將 RegisterShellFileTypes 和 EnableShellOpen 成員函式的呼叫新增至 CWinApp 為您寫入的InitInstance覆寫。
RegisterShellFileTypes 向檔案總管或檔案管理員註冊應用程式的檔類型。 函式會將項目直接新增至 Windows 維護的註冊資料庫。 項目會註冊每個檔類型、將擴展名與檔類型產生關聯、指定要開啟應用程式的命令行,以及指定動態數據交換 (DDE) 命令以開啟該類型的檔。
EnableShellOpen 藉由允許應用程式從 [檔案總管] 或 [檔案管理員] 接收 DDE 命令,以開啟使用者所選擇的檔案,以完成此程式。
中的 CWinApp 這個自動註冊支援可免除向您的應用程式運送.reg檔案或執行特殊安裝工作的需求。
如果您想要為應用程式初始化 GDI+ (藉由在 InitInstance 函式中呼叫 GdiplusStartup),您必須隱藏 GDI+ 背景線程。
若要這樣做,您可以將 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 成員函式 InitInstance 的呼叫。 如果您不想要實作拖放功能,可以移除該呼叫。
備註
您也可以使用 OLE,實作更一般的拖放功能—在文件之間或內拖曳數據。 如需詳細資訊,請參閱 OLE 拖放一文。
追蹤最近使用的文件
當使用者開啟和關閉檔案時,應用程式對象會追蹤最近使用的四個檔案。 這些檔案的名稱會新增至 [檔案] 功能表,並在變更時更新。 架構會將這些檔名儲存在登錄或 .ini 檔案中,與您的專案同名,並在應用程式啟動時從檔案讀取它們。
InitInstance MFC 應用程式精靈為您建立的覆寫包含對 CWinApp 成員函式 LoadStdProfileSettings 的呼叫,它會從登錄或 .ini 檔案載入資訊,包括最近使用的檔名。
這些項目會儲存如下:
在 Windows NT、Windows 2000 及更新版本中,值會儲存至登錄機碼。
在 Windows 3.x 中,此值會儲存在 WIN 中。INI 檔案。
在 Windows 95 和更高版本中,此值會儲存在快取的 WIN.INI 版本中。