Tips12 プロパティシートにボタンを追加

前のTips 次のTips


 長いこと間があいてしまいましたが、気を取り直して継続です。 今回はプロパティシートにボタンコントロールを追加する方法についてです。 ボタン以外のコントロールも同様の方法で追加可能ですが、それは読者への演習問題としておきましょう。
 ViViはプロパティシートで拡張子ごとの環境設定ができますが、 拡張子がたくさんあると全てに対し設定を変更するのは大変な手間です。そこで、 1回の操作で設定をすべて変更できるようにして欲しいという要望がありましたが、筆者はその方法を知りませんでした。 で、いつものように高津戸師匠に方法をご教授してもらい、それをこうしてHTMLで書いているという次第です。 (^^;;

■ ボタンコントロールの追加

 プロパティシートはTips5でも記述しているように、 VC++のコンポーネントギャラリーを使うと簡単に導入できます。 それが生成したコードにボタンコントロールを追加するのは OnInitDialog() メソッドの中で行います。
 まず、プロパティシートクラスにボタンコントロールメンバ(CButton m_button)を追加し、OnInitDialog で位置を決めて Create を行います。位置決めの方法はいくつかあると思いますが、 たとえば以下の様に他のボタンの座標から計算するのも一方法です。また、 フォントの指定を忘れないようにしないと他のコントロールと釣り合いがとれなくなります。
 コードは以下のようになります。

    #define     IDC_BUTTON           1101

    class CMyPropertySheet : public CPropertySheet
    {
        DECLARE_DYNAMIC(CMyPropertySheet)

        CButton     m_button;                   //  追加するボタンコントロール
        .....
    };

    BOOL CMyPropertySheet::OnInitDialog()
    {
        BOOL rc = CPropertySheet::OnInitDialog();

        CButton *btnOK = (CButton *)GetDlgItem(IDOK);
        CButton *btnCANCEL = (CButton *)GetDlgItem(IDCANCEL);
        CRect rectOK, rectCANCEL, rectAPPLY;
        btnOK->GetWindowRect(rectOK);
        btnCANCEL->GetWindowRect(rectCANCEL);
        int dx = rectCANCEL.left - rectOK.left;
        rectAPPLY = rectOK;
        rectAPPLY.left -= dx;
        rectAPPLY.right -= dx;
        ScreenToClient(&rectAPPLY);             //  プロパティシートのクライアント座標系に変換
        m_button.Create("新ボタン", WS_CHILD|WS_VISIBLE, rectAPPLY, this, IDC_BUTTON);
        m_button.SetFont(btnOK->GetFont());

        return rc;
    }

 

 これで "新ボタン" という文字列を持ったボタンが追加されます。
 蛇足ですが、ボタンIDは resource.h の中で定義します。その最後の方に、
#define _APS_NEXT_CONTROL_VALUE 1101
 という宣言があるので、新しいIDはこの数値を使い、_APS_NEXT_CONTROL_VALUE は+1しておきます。
#define _APS_NEXT_CONTROL_VALUE 1102
これで、他のコントロールとIDがバッティングすることはありません。

■ ボタンハンドラの追加

 ボタンを画面に配置しただけではしょうがないので、そのハンドラも実装します。 これはMFCをある程度理解していれば簡単です。
 ヘッダファイルでハンドラ関数を宣言し、cpp ファイルで、メッセージマップに追加し、ハンドラを実装します。 コードは以下のような感じになります。


    class CMyPropertySheet : public CPropertySheet
    {
        .....
    // 生成されたメッセージ マップ関数
    protected:
        //{{AFX_MSG(CMyPropertySheet)
        //}}AFX_MSG
        afx_msg void OnButton();
        DECLARE_MESSAGE_MAP()
    };

    BEGIN_MESSAGE_MAP(CMyPropertySheet, CPropertySheet)
        //{{AFX_MSG_MAP(CMyPropertySheet)
        //}}AFX_MSG_MAP
        ON_BN_CLICKED(IDC_BUTTON, OnButton)
    END_MESSAGE_MAP()

    void CMyPropertySheet::OnButton()
    {
        TRACE("OnButton\n");            //  ほんとは何かの処理(通常は EndDialog かな)
    }

前のTips 次のTips 津田伸秀 のホームページに戻る。

Copyright (c) 1996 by Nobuhide Tsuda, All Right Reserved.
このホームページに関するご質問、ご要望、バグレポート等は  ntsuda@beam.or.jp  までメールをいただければ幸いです。