特定CWinApp服务
除了运行消息外请循环,并提供您有机会初始化应用程序并在它后面清理,CWinApp 提供一些其他服务。
Shell注册
默认情况下,MFC应用程序向导使用户可以打开数据文件应用程序通过双击来创建了文件资源管理器或文件管理器。 如果应用程序是MDI应用程序,并为应用程序创建的文件中指定的扩展,MFC应用程序向导添加对 RegisterShellFileTypes ,并 EnableShellOpenCWinApp 的成员函数。InitInstance 的重写其自己编写。
RegisterShellFileTypes 注册您的应用程序的文件资源管理器或文件管理器的文件类型。 函数将项添加到Windows维护的注册数据库。 每项注册文件类型,将文件扩展名的文件类型,指定命令行打开应用程序,并指定动态数据交换(dde) (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命令可以过早地发送到应用程序,在其主窗口创建之前。 shell问题的DDE命令可以过早地被中止,导致错误消息。
文件管理器拖放
文件可从文件管理器或文件资源管理器的文件视图窗口拖动到应用程序的窗口。 您可能,例如,使一个或多个文件拖动到MDI应用程序的主窗口,应用程序可以检索文件名和打开这些文件的MDI子窗口。
若要启用文件的拖放到您的应用程序,MFC应用程序向导写入 CWnd 成员函数 DragAcceptFiles 的调用您在您的 InitInstance的主框架窗口中。 您可以移除调用,如果您不希望实现拖放功能。
备注
您还可以实现更常规的拖放功能拖动的数据之间或中的文档与OLE。有关信息,请参见中的文章 拖放(OLE)。
记录最近使用过的文档
当用户打开并关闭该文件,应用程序对象记录四最近使用过的文件。 这些文件的名称添加到"文件"菜单和更新它们何时更改。 ,当应用程序启动时,框架存储这些文件名称在注册表或在.ini文件,并将名称与项目名称相同并从磁盘读取文件。 MFC应用程序向导"为您创建的 InitInstance 重写包括对包含最近使用的文件名称的 CWinApp 成员函数 LoadStdProfileSettings,从注册表或.ini文件加载信息,请参见。
存储这些项如下所示:
在Windows NT,Windows 2000,然后再转换,值存储为注册表项。
在Windows 3.x;值在WIN.INI文件中。
在Windows 95和更高版本;值在WIN.INI中缓存的版本存储。