次の方法で共有


特殊な CWinApp サービス

メッセージ ループを実行し、アプリケーションを初期化し、その後にクリーンアップする機会を提供するだけでなく、 CWinApp には他のいくつかのサービスが用意されています。

シェルの登録

既定では、MFC アプリケーション ウィザードを使用すると、エクスプローラーまたはファイル マネージャーでダブルクリックして、アプリケーションによって作成されたデータ ファイルをユーザーが開く可能性があります。 アプリケーションが MDI アプリケーションであり、アプリケーションで作成するファイルの拡張子を指定すると、MFC アプリケーション ウィザードは、CWinAppRegisterShellFileTypes および EnableShellOpen メンバー関数への呼び出しを、ユーザーが書き込むInitInstanceオーバーライドに追加します。

RegisterShellFileTypes は、アプリケーションのドキュメントの種類をエクスプローラーまたはファイル マネージャーに登録します。 この関数は、Windows が保持する登録データベースにエントリを追加します。 エントリは、各ドキュメントの種類を登録し、ファイル拡張子をファイルの種類に関連付け、アプリケーションを開くコマンド ラインを指定し、その種類のドキュメントを開く動的データ交換 (DDE) コマンドを指定します。

EnableShellOpen は、アプリケーションがエクスプローラーまたはファイル マネージャーから DDE コマンドを受信して、ユーザーが選択したファイルを開くことができるため、プロセスを完了します。

CWinAppでのこの自動登録サポートにより、アプリケーションに.reg ファイルを送付したり、特別なインストール作業を行ったりする必要がなくなります。

(InitInstance 関数で GdiplusStartup を呼び出すことによって) アプリケーションの GDI+ を初期化する場合は、GDI+ バックグラウンド スレッドを抑制する必要があります。

これを行うには、SuppressBackgroundThread 構造体の メンバーを TRUE に設定します。 GDI+ バックグラウンド スレッドを抑制する場合は、アプリケーションのメッセージ ループに入って終了する直前に、 NotificationHookNotificationUnhook の呼び出しを行う必要があります。 これらの呼び出しの詳細については、「 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 コマンドは途中で中止され、エラー・メッセージが出される可能性があります。

ファイル マネージャーのドラッグ アンド ドロップ

ファイルは、ファイル マネージャーまたはエクスプローラーのファイル ビュー ウィンドウからアプリケーションのウィンドウにドラッグできます。 たとえば、1 つ以上のファイルを MDI アプリケーションのメイン ウィンドウにドラッグできるようにして、アプリケーションがファイル名を取得し、それらのファイルの MDI 子ウィンドウを開くことができる場合があります。

MFC アプリケーション ウィザードは、アプリケーションでファイルのドラッグ アンド ドロップを有効にするために、のメイン フレーム ウィンドウの CWnd メンバー関数 InitInstance への呼び出しを書き込みます。 ドラッグ アンド ドロップ機能を実装しない場合は、その呼び出しを削除できます。

OLE を使用して、より一般的なドラッグ アンド ドロップ機能 (ドキュメント間またはドキュメント内でのデータのドラッグ) を実装することもできます。 詳細については、 OLE ドラッグ アンド ドロップに関する記事を参照してください。

最近使用したドキュメントを追跡する

ユーザーがファイルを開いて閉じると、アプリケーション オブジェクトは最近使用した 4 つのファイルを追跡します。 これらのファイルの名前は、[ファイル] メニューに追加され、変更されると更新されます。 フレームワークは、これらのファイル名をレジストリまたは .ini ファイルに格納し、プロジェクトと同じ名前で保存し、アプリケーションの起動時にファイルから読み取ります。 MFC アプリケーション ウィザードによって作成される InitInstance オーバーライドには、 CWinApp メンバー関数 LoadStdProfileSettings の呼び出しが含まれます。この関数は、最近使用したファイル名を含む、レジストリまたは .ini ファイルから情報を読み込みます。

これらのエントリは次のように格納されます。

  • Windows NT、Windows 2000 以降では、値はレジストリ キーに格納されます。

  • Windows 3.x では、値は WIN.INI ファイルに格納されます。

  • Windows 95以降では、値はキャッシュされたバージョンのWIN.INIに格納されます。

こちらも参照ください

CWinApp: そのアプリケーションクラス