CWinApp のその他のサービス
更新 : 2007 年 11 月
CWinApp を使用すると、メッセージ ループの実行、およびアプリケーションの初期化、アプリケーション終了時のクリーンアップのほか、いくつかのサービスが提供されます。
シェル登録
既定では、MFC アプリケーション ウィザードを使用すると、Windows エクスプローラまたはファイル マネージャでデータ ファイルをダブルクリックすれば、作成したアプリケーションを起動してデータ ファイルを開くことができます。アプリケーションが MDI アプリケーションの場合は、アプリケーションが作成するファイルの拡張子を指定すると、InitInstance がオーバーライドされ、このオーバーライドに CWinApp の RegisterShellFileTypes メンバ関数と EnableShellOpen の呼び出しが追加されます。
RegisterShellFileTypes は、アプリケーションのドキュメント タイプを Windows エクスプローラまたはファイル マネージャに登録します。この関数は、Windows が管理している登録データベースにエントリを追加します。エントリは、各ドキュメント タイプを登録し、ファイルの種類とファイル拡張子を関連付け、アプリケーションを開くときのコマンド ラインを指定し、この型のドキュメントを開くためのダイナミック データ エクスチェンジ (DDE: Dynamic Data Exchange) コマンドを指定します。
EnableShellOpen は、ユーザーが選択したファイルを開くために、Windows エクスプローラまたはファイル マネージャから DDE コマンドをアプリケーションが受け取れるようにします。
CWinApp のこの自動登録機構により、.reg ファイルをアプリケーションに同梱する必要がなくなりました。特殊なインストール作業も必要ありません。
アプリケーションに対して GDI+ を初期化する (InitInstance 関数で GdiplusStartup を呼び出すことによる) 場合は、GDI+ バックグラウンド スレッドを出力させないことが必要です。
これは、GdiplusStartupInput 構造体の SuppressBackgroundThread メンバを TRUE に設定することによって行うことができます。GDI+ バックグラウンド スレッドを出力させない場合、アプリケーションのメッセージ ループに入る直前に NotificationHook を呼び出し、出る直前に NotificationUnhook を呼び出す必要があります (GdiplusStartupOutput を参照)。仮想関数 CWinApp::Run のオーバーライド内で、GdiplusStartup とフック通知関数を適切な位置で呼び出すと、次のようになります。
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 コマンドが途中で中止されて、エラー メッセージが表示されます。
ファイル マネージャでのドラッグ アンド ドロップ
Windows 3.1 以降では、ファイル マネージャ (または Windows 95 以降か Windows NT 4.0 以降の Windows エクスプローラ) のファイル ビュー ウィンドウから、ファイル名をドラッグし、アプリケーションのウィンドウ内にドロップできます。たとえば、MDI アプリケーションのメイン ウィンドウに 1 つ以上のファイル名をドラッグできます。このメイン ウィンドウで、アプリケーションはファイル名を取得し、該当するファイルの MDI 子ウィンドウを開くことができます。
アプリケーションでファイルをドラッグ アンド ドロップできるように、MFC アプリケーション ウィザードはメイン フレーム ウィンドウ用の CWnd のメンバ関数 DragAcceptFiles の呼び出しを InitInstance に書き込みます。ドラッグ アンド ドロップ機能を実装しないときは、この呼び出しを削除できます。
メモ : |
---|
OLE を使用すると、より汎用的なドラッグ アンド ドロップ機能を実装できます。つまり、ドキュメント内でも、あるいはドキュメント間でもデータをドラッグできます。詳細については、「ドラッグ アンド ドロップ (OLE)」を参照してください。 |
最近使ったドキュメントの記憶
ファイルを開いてから閉じると、そのたびにアプリケーション オブジェクトは、最近使ったファイルを 4 ファイル分記憶します。これらのファイル名は [ファイル] メニューに加えられ、変更があると更新されます。フレームワークは、これらのファイル名をプロジェクトと同じ名前のレジストリまたは .ini ファイルに保存しておき、アプリケーションの起動時に読み込みます。MFC アプリケーション ウィザードが作成したオーバーライド版の InitInstance には、CWinApp のメンバ関数 LoadStdProfileSettings があります。この関数は、最近使ったファイル名などの情報をレジストリまたは .ini ファイルから読み込みます。
これらの情報は、以下に保存されています。
Windows NT および Windows 2000 では、レジストリ キーに格納されます。
Windows 3.x では、WIN.INI ファイルに格納されます。
Windows 95 以降では、キャッシュされた WIN.INI ファイルに格納されます。