プラグインダイアログ

ISaver を実装しているプラグインが複数ある場合、
実行に使うプラグインを決めなければならない。

これを決めるのはもちろん利用者なので、
その設定を行うプラグイン管理画面が必要となる。

ということで、ホストのダイアログボックスを改造し、
好きなプラグインを選択できるようにしてみよう。

リソースファイルを書き換え、
スクリーンセーバーの名前と、
ダイアログボックスの定義を書き換える。

========== resource.rc ==========

#include <winres.h>
#include <scrnsave.h>
#include "resid.hpp" // 追加

LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT

/* String */

STRINGTABLE
BEGIN
    IDS_DESCRIPTION ".NET Saver Manager"
END

/* Dialog */

DLG_SCRNSAVECONFIGURE DIALOGEX 0, 0, 247, 63
STYLE   DS_SETFONT | DS_MODALFRAME | DS_CENTER |
WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "プラグインの選択"
FONT    9, "MS UI Gothic"
BEGIN
    LTEXT
            "プラグイン (&P):",
            IDC_STATIC, 12, 15, 43, 8
    COMBOBOX
            IDC_PLUGINS, 60, 12, 114, 150,
            CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
    PUSHBUTTON
            "設定(&C)...",
            IDC_CONFIGURE, 186, 12, 50, 14
    DEFPUSHBUTTON
            "OK",
            IDOK, 126, 42, 50, 14
    PUSHBUTTON
            "キャンセル",
            IDCANCEL, 186, 42, 50, 14
END

/* Icon */

ID_APP ICON "program.ico"

========== end of resource.rc ==========

正直、これくらいになってくると、
素直に IDE のダイアログエディタを使った方が早いが、
手書きにこだわってみる。

LTEXT は左寄せのラベル(スタティック)コントロール
COMBOBOX はその名の通り、コンボボックスだ。

OK やキャンセルのように、汎用的なボタンには、
定義済みのコントロール ID を付けることができるのだが、
プログラムによって用途が異なるコントロールには、
自分で ID を定義して付与してやる必要がある。

そのために resid.hpp というファイルを作り、
そこにダイアログコントロール用の ID を定義し、
resource.rc から #include しておく。

========== resid.hpp ==========

#ifndef z_loafer_screensaver_host_resid
#define z_loafer_screensaver_host_resid

#define IDC_PLUGINS 1000
#define IDC_CONFIGURE 1100

#endif // !z_loafer_screensaver_host_resid

========== end of resid.hpp ==========

ID を #define しているだけのファイルだ。
この ID は、プログラムでも参照するため、
独立したファイルにしておくと便利になる。

なお、リソースを Visual Studio IDE で編集した場合、
resource.h という同様の役割のファイルが作られるはずだ。