ダイアログにビットマップ付きボタンを実装する(4bitカラー編)

Visual C++プログラミングのメモ

【Visual C++ 2008】【MFC】

 ツールバークラス(CToolBar)を使用して、ダイアログに4bit(16色)ビットマップ付きボタンを実装する方法。
(24bitビットマップの場合は、 「ダイアログにビットマップ付きボタンを実装する(24bitカラー編)」 を参照のこと)

(1)
 リソースビューにて、[リソースの追加]でToolbarを追加する。 もしくは、rcファイルを直接書き換えるなら、以下の通り。


(例)
ツールバーのIDはIDR_TOOLBAR1、ビットマップの場所はres\toolbar1.bmp、
ボタンは1個あたり横40ドット*縦50ドットを3個、ボタンのIDはIDBUTTON1,IDBUTTON2,
IDBUTTON3、2番目と3番目のボタンの間に明確な区切り(すきま)を入れる場合。

IDR_TOOLBAR1            BITMAP                  "res\\toolbar1.bmp"

IDR_TOOLBAR1 TOOLBAR  40, 50
BEGIN
    BUTTON      IDBUTTON1
    BUTTON      IDBUTTON2
    SEPARATOR
    BUTTON      IDBUTTON3
END

 ビットマップは、ボタンを横に並べた物(上記の例なら120*50ドット)をペイント等の外部ツールで作成してもよい。 その際、ボタン間の区切りは意識しない(区切りは、あくまでSEPARATORで指定)。

 rcファイルを直接書き換えた場合は、追加したIDをresource.hのdefineにも追加しておくこと。 数字は、同一画面上のコントロールで重複しないようにする。

(2)
 ダイアログのクラスヘッダのprivateに、ツールバーのメンバ変数定義を追加。


    CToolBar m_wndToolBar;

(3)
 OnInitDialogの「// TODO: 初期化をここに追加します。」より後にて、ツールバーを読み込む。


    if (!m_wndToolBar.Create(this) || !m_wndToolBar.LoadToolBar(IDR_TOOLBAR1))
    {
        // ツールバー作成失敗
        //
        //
        //

        return TRUE;
    }

    // ツールバーのサイズ取得
    CSize sizeToolBar = m_wndToolBar.CalcFixedLayout(FALSE, TRUE);

    // ダイアログの左上にツールバー表示
    m_wndToolBar.MoveWindow(0, 0, sizeToolBar.cx, sizeToolBar.cy);

    // ボタンをフラット化(下記を記述しない場合、通常のボタンになる)
    m_wndToolBar.ModifyStyle(0, TBSTYLE_FLAT);

(4)
 各ボタンの動作を実装する方法は、通常のボタンと同じように、メッセージマップに追加する。 各ボタンの動作に対応するメンバ関数を、それぞれOnButton1,OnButton2,OnButton3とすると、以下の通り。


ON_COMMAND(IDBUTTON1, OnButton1)
ON_COMMAND(IDBUTTON2, OnButton2)
ON_COMMAND(IDBUTTON3, OnButton3)

(5)
 各ボタンの有効・無効(グレー化)を制御するには、以下の通り。
フラグのデフォルトはTRUE(有効)。


    CToolBarCtrl& toolBarCtrl = m_wndToolBar.GetToolBarCtrl();
    toolBarCtrl.EnableButton(ボタンのID, フラグ);

(メモ)

  • CToolBarはCControlBarの派生クラス、CControlBarはCWndの派生クラス
  • MSDNライブラリの 「CToolBar」「CControlBar::CalcFixedLayout」「CSize」「CWnd::MoveWindow」「CWnd::ModifyStyle」「CToolBarCtrl::EnableButton」 を参照のこと
  • (関連項目) ビットマップの背景を透明化する