Специальные службы CWinApp

Помимо выполнения цикла сообщений и предоставления возможности инициализировать приложение и очистить его после этого, CWinApp предоставляет несколько других служб.

Регистрация оболочки

По умолчанию мастер приложений MFC позволяет пользователю открывать файлы данных, созданные приложением, дважды щелкнув их в проводник или диспетчере файлов. Если приложение является приложением MDI, и вы указываете расширение для файлов, создаваемых приложением, мастер приложений MFC добавляет вызовы к функциям членов RegisterShellFileTypes и EnableShellOpen CWinApp в InitInstance переопределение, которое он записывает для вас.

RegisterShellFileTypesрегистрирует типы документов приложения с помощью проводник или диспетчера файлов. Функция добавляет записи в базу данных регистрации, поддерживаемую Windows. Записи регистрируют каждый тип документа, связывают расширение файла с типом файла, указывают командную строку для открытия приложения и указывают команду динамического обмена данными (DDE), чтобы открыть документ этого типа.

EnableShellOpenЗавершает процесс, позволяя приложению получать команды DDE из проводник или диспетчера файлов, чтобы открыть файл, выбранный пользователем.

Эта автоматическая поддержка CWinApp регистрации устраняет необходимость отправки REG-файла с приложением или выполнения специальной установки.

Если вы хотите инициализировать GDI+ для приложения (вызвав GdiplusStartup в функции InitInstance ), необходимо отключить фоновый поток GDI+ .

Это можно сделать, установив SuppressBackgroundThread для элемента структуры GdiplusStartupInput значение TRUE. При подавлении фонового потока NotificationHook GDI+ вызовы 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, включает вызов функции-члена CWinAppLoadStdProfileSettings, который загружает сведения из реестра или INI-файла, включая последний использовавшийся файл Фамили.

Эти записи хранятся следующим образом:

  • В Windows NT, Windows 2000 и более поздних версий значение сохраняется в разделе реестра.

  • В Windows 3.x значение хранится в WIN. INI-файл.

  • В Windows 95 и более поздних версий значение хранится в кэшированной версии WIN. INI.

См. также

CWinApp: класс приложений