特殊 CWinApp 服務
除了執行訊息迴圈,並讓您有機會來初始化應用程式,並清除之後, CWinApp 提供許多其他服務。
殼層登錄
根據預設,MFC 應用程式精靈可讓使用者開啟您的應用程式所建立的按兩下檔案總管] 或 [檔案管理員中的資料檔案。 如果您的應用程式是 MDI 應用程式,且您指定應用程式所建立之檔案的副檔名,MFC 應用程式精靈會將呼叫 RegisterShellFileTypes 和 EnableShellOpen 成員函式的 CWinApp 到InitInstance它會為您撰寫的覆寫。
RegisterShellFileTypes使用檔案總管] 或 [檔案管理員,請註冊您的應用程式的文件類型。 此函式會將項目加入 Windows 會維護系統註冊資料庫。 這些項目註冊每個文件類型、 將檔案副檔名與檔案類型相關聯、 指定命令列以開啟 [應用程式,和指定動態資料交換 (DDE) 命令以開啟該類型的文件。
EnableShellOpen藉由使用您的應用程式接收來自 [檔案總管或檔案管理員,以開啟 [選擇使用者的檔案的 DDE 命令完成程序。
這項支援自動註冊在CWinApp就不需要附隨您的應用程式的.reg 檔案,或執行特殊的安裝工作。
如果您想要初始化 GDI+ 應用程式 (藉由呼叫 GdiplusStartup 在您 InitInstance 函式),您必須隱藏 GDI+ 背景執行緒。
您可以藉由設定 SuppressBackgroundThread 成員的 GdiplusStartupInput 結構以 ,則為 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 指令可以提前結束之前,發送至應用程式已建立其主視窗。 Shell 所發出的 DDE 指令會過早中止,因而導致錯誤訊息。
檔案管理員拖放
檔案可以從 [檔案管理員] 或 [檔案總管] 中的 [檔案] 檢視視窗拖曳至您的應用程式的視窗。 比方說,則您可以,啟用一或多個檔案,以拖曳至 MDI 應用程式的主視窗,其中應用程式無法擷取檔案名稱,而開啟之檔案的 MDI 子視窗。
若要啟用檔案拖曳並放在您的應用程式,MFC 應用程式精靈會將呼叫 CWnd 成員函式 DragAcceptFiles 為您的主框架視窗,在您InitInstance。 如果您不想要實作拖放功能,您可以移除該呼叫。
![]() |
---|
您也可以實作更一般化的拖放功能 — 拖曳之間,或在文件內的資料 — 使用 OLE。如需資訊,請參閱文章拖放 」 (OLE)。 |
持續追蹤的最大最近使用的文件
當使用者開啟或關閉檔案,應用程式物件會追蹤的四個最近使用過的檔案。 這些檔案的名稱會加入至 [檔案] 功能表,並且有變更時更新。 架構會儲存這些檔案名稱,在其中一個登錄或.ini 檔案中,您的專案名稱相同,您的應用程式啟動時從檔案讀取它們。 InitInstance覆寫 MFC 應用程式精靈建立的您都會呼叫 CWinApp 成員函式 LoadStdProfileSettings,它會從登錄載入資訊或.ini 檔案,包括最近使用檔案名稱。
這些項目會儲存,如下所示:
在 Windows NT,Windows 2000 和更新版本,值會儲存到登錄機碼。
在 [Windows 3.x 中,值會儲存 win。INI 檔案。
在 Windows 95 及更新的版本,值會儲存在快取獲勝所需的版本。INI。