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