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 アプリケーションのメイン ウィンドウに 1 つ以上のファイルをドラッグできるようにすることもできます。この場合、アプリケーションはファイル名を取得し、それらのファイルの MDI 子ウィンドウを開くことができます。
アプリケーションでファイルのドラッグアンドドロップを有効にするために、MFC アプリケーション ウィザードは、CWnd メンバー関数 DragAcceptFiles の呼び出しを、メインフレーム ウィンドウの InitInstance
に書き込みます。 ドラッグアンドドロップ機能を実装しない場合は、その呼び出しを削除できます。
Note
OLE を使用すると、、ドキュメント間やドキュメント内でのデータのドラッグなど、より一般的なドラッグアンドドロップ機能も実装できます。 詳細は、OLE ドラッグアンドドロップを参照してください。
最近使用したドキュメントを追跡する
ユーザーがファイルを開いて閉じると、アプリケーションオブジェクトは最近使用した4つのファイルを追跡します。 これらのファイルの名前は [ファイル] メニューに追加され、変更すると更新されます。 フレームワークは、これらのファイル名をレジストリまたはプロジェクトと同じ名前の .ini ファイルに保存し、アプリケーション起動時にそのファイルから読み込みます。 MFC アプリケーション ウィザードが作成する InitInstance
のオーバーライドには、CWinApp メンバー関数 LoadStdProfileSettings の呼び出しが含まれ、レジストリや .ini ファイルから最近使われたファイル名などの情報をロードします。
これらのエントリは次のように格納されます:
Windows NT、Windows 2000 以降では、値はレジストリ キーに格納されます。
Windows 3.x では、値は WIN.INI ファイルに格納されます。
Windows 95 以降では、値はキャッシュされたバージョンの WIN.INI に格納されます。