特殊 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 檔案中,並在應用程式啟動時從檔案讀取這些名稱。 InitInstance
MFC 應用程式精靈為您建立的 覆寫包含對 CWinApp 成員函 式 LoadStdProfile 的呼叫設定 ,它會從登錄或 .ini 檔案載入資訊,包括最近使用的檔案名。
這些項目儲存如下:
在 Windows NT、Windows 2000 和更新版本中,值會儲存到登錄機碼。
在 Windows 3.x 中,值會儲存到 WIN.INI 檔案中。
在 Windows 95 和更新版本中,值會儲存到快取版本的 WIN.INI 中。