WideStudio Programming (3-2)
~画面クラスの作り方-2

「お手軽ウィンドウ配置ダイアログ画面」クラスの実装について見ていきます。WideStudioプログラミングとしてのエッセンスは内部処理を実装しているCTGRWindowPlacementDlg::WPDImplクラスにあります。.cppの方で下記のように宣言されています。

class CTGRWindowPlacementDlg::WPDImpl {
    friend class CTGRWindowPlacementDlg;

    WPDImpl() { Clear(); }
    ~WPDImpl() { Delete(); Clear(); }

    void CreateParts();
    void SetupVectors();
    void SetupEventProcedures();

    void Clear();
    void Delete();

    /** チェックボタン選択時の処理。 */
    void OnRadValueChanged(WSCbase* object);

    /** ボタングループを示す vector を返す。*/
    std::vector* GetSelectedBtnGroup(WSCbase* object);

    /** チェックボタン選択時に呼び出されるイベントプロシージャ */
    static void ep_rad_value_ch(WSCbase* object);

private:
    /** チェックボタン選択時の処理中であることを示すフラグ(再入阻止のため)。 */
    bool _in_rad_value_ch_proc;

    /** オブジェクトとインスタンスを結びつけるためのマップ変数を宣言。 */
    static al::gui::ObjectInstanceMap	m_oi_map;

/**@name パーツを集合的に扱うためのvector */
/*@{*/
    std::vector	_rad_mw_w;
    std::vector	_rad_mw_h;
    std::vector	_rad_sp_w;
    std::vector	_rad_sp_h;
    std::vector	_rad_iw_w;
    std::vector	_rad_iw_h;
    std::vector	_rad_sp_p;
    std::vector	_rad_iw_p;
/*@}*/

    /* 以下はパーツ */

    WSCmainWindow* WPDImplMain;

    WSCtform* WPDtfor_main_window_size;
    WSCvlabel* WPDvlab_mw_w;
    WSCvlabel* WPDvlab_mw_h;
    WSCvradio* WPDvrad_mw_w_w;
    (途中省略。ここは要するにメインウィンドウの幅の行のラジオボタン)
    WSCvradio* WPDvrad_mw_h_h;
    (途中省略。ここは要するにメインウィンドウの高さ行のラジオボタン)
    WSCvradio* WPDvrad_mw_h_l;

    WSCtform* WPDtfor_search_panel_size;
    WSCvlabel* WPDvlab_sp_w;
    WSCvlabel* WPDvlab_sp_h;
    WSCvradio* WPDvrad_sp_w_w;
    (途中省略。ここは要するに検索パネルの幅と高さの行のラジオボタン)
    WSCvradio* WPDvrad_sp_h_sam;

    WSCtform* WPDtfor_info_window_size;
    WSCvlabel* WPDvlab_iw_w;
    WSCvlabel* WPDvlab_iw_h;
    WSCvradio* WPDvrad_iw_w_w;
    (途中省略。ここは要するに情報ウィンドウ幅と高さの行のラジオボタン)
    WSCvradio* WPDvrad_iw_h_sam;

    WSCtform* WPDtfor_search_panel_pos;
    WSCvlabel* WPDvlab_main_win;
    WSCvradio* WPDvrad_sp_p_tl;
    WSCvradio* WPDvrad_sp_p_tc;
    WSCvradio* WPDvrad_sp_p_tr;
    (途中省略。ここは検索パネルの配置を決めるための、四角く配置されたラジオボタン)
    WSCvradio* WPDvrad_sp_p_lt;

    WSCtform* WPDtfor_info_window_pos;
    WSCvlabel* WPDvlab_iw_main_win;
    WSCvradio* WPDvrad_iw_p_tl;
    (途中省略。ここは情報ウィンドウの配置を決めるための、四角く配置されたラジオボタン)
    WSCvradio* WPDvrad_iw_p_lb;
    WSCvradio* WPDvrad_iw_p_lc;
    WSCvradio* WPDvrad_iw_p_lt;
};

画面上に配置されるボタン類は、new で得られたポインタがこのクラスのメンバ変数として保持されます。外に見せる必要は無いのですべてprivateメンバです。

    /* 以下はパーツ */
    WSCmainWindow* WPDImplMain;

    WSCtform* WPDtfor_main_window_size;
    WSCvlabel* WPDvlab_mw_w;
    WSCvlabel* WPDvlab_mw_h;
    ..... 

イベントプロシージャはクラスの static メンバ関数として宣言できます。

    /** チェックボタン選択時に呼び出されるイベントプロシージャ */
    static void ep_rad_value_ch(WSCbase* object);

CreateParts() はパーツをまとめて生成するための窓口となる関数、SetupEventProcedures() はイベントプロシージャを登録するための窓口となる関数です。

(続く)