このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
続いて、Application.cpp を作る。
Application.hpp は、クラスの外枠しか含まれていない。
これは、いわゆるメタデータであり、
そこには実体(メソッド本体や静的データ)はない。
Application.cpp では、それらの実体を定義する。
========== Application.cpp ==========
#include "config.hpp"
#include "Application.hpp"
#pragma unmanaged
namespace Loafer {
namespace ScreenSaver {
namespace Host {
Application::Application() {
}
Application::~Application() {
}
BOOL Application::RegisterClasses(HANDLE hInst) {
UNREFERENCED_PARAMETER(hInst);
return TRUE;
}
BOOL Application::ConfigureProc(
HWND hdlg, UINT message,
WPARAM wParam, LPARAM lParam) {
UNREFERENCED_PARAMETER(wParam);
UNREFERENCED_PARAMETER(lParam);
switch (message) {
case WM_INITDIALOG:
try {
// 設定画面を呼び出す
dispatcher.Configure(hdlg);
// ダイアログは表示せずに閉じる
EndDialog(hdlg, 0);
} catch (...) { // 例外は握りつぶす
// 上と同じだが、ダイアログの戻り値は
// プロセスの終了コードとして使われるので
// 異常を示す 0 以外を返しておく
EndDialog(hdlg, 1);
}
break;
}
return FALSE;
}
// Application::MainProc 未実装
}}} // Loafer::ScreenSaver::Host
========== end of Application.cpp ==========
Application クラスの主な役割は、
ウィンドウプロシージャの処理である。
プラグイン実装者に必要なイベントを切りだし、
Dispatcher クラス経由でプラグインに送る。
RegisterClasses は使わないので、単に TRUE を返す。
ConfigureProc ではかなりトリッキーなことをやっている。
ConfigureProc は、設定画面用のダイアログプロシージャだ。
設定画面は、scrnsave.lib の仕様に従う場合、
リソースとして用意したダイアログボックスが表示される。
問題なのが、これがホスト自身が持つリソースであることだ。
つまり、強制的にホストの持つダイアログが表示されるので、
プラグインの持つ設定画面をどう扱うか考える必要がある。
今回は、この解決策として、
WM_INITDIALOG メッセージを使うことにする。
WM_INITDIALOG は、ダイアログが初期化され、
表示される直前に呼び出されるメッセージだ。
このメッセージの処理から制御が戻る前に、
EndDialog で自身を閉じてしまうのである。
こうすると、ダイアログボックスは表示すらされない。
これは正式にサポートされている方法である。
WM_INITDIALOG 中に Dispatcher の Configure を呼び出し、
そこでプラグイン固有の設定画面を表示させるようにする。
Configure が制御を返すのは設定画面が閉じた後だ。
こうすれば、実際にはダイアログボックスがあるのだが、
表示されないため、うまくいきそうだ。
この場合、ホストの持つダイアログリソースは、
存在さえしていればどんな内容でも良い。
長くなったので、MainProc の実装は明日にしよう。