2007 年 8 月 27 日 20 時 5 分

ホストの作成 #3: Application クラス


このアーカイブは同期化されません。 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 の実装は明日にしよう。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.