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

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

【Visual C++ 2008】【MFC】

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

(1)
 ボタンを横に並べたビットマップ(下記の例は、横40ドット*縦50ドットを3個)を、 ボタン有効用と無効用の2枚、ペイント等の外部ツールで作成する。 その際、背景色(透明化してダイアログの地の色を出す箇所)は、ボタンのデザインに使用されていない色なら何でもよい。 また、ボタン間の区切りは意識しない(区切りは、(4)にてソースより指定)。

有効用、24bit、背景色は0xFF 0xF2 0x00
無効用、8bit、背景色は0x00 0x00 0x00

(2)
 リソースビューにて、[リソースの追加]でBitmapに2枚とも追加する。 24bitビットマップの場合、Toolbarに追加してもリソースビューからボタン個別にIDを付与できない。 もしくは、rcファイルを直接書き換えるなら、以下の通り。


(例)
有効用のツールバーのIDはIDB_TOOLBAR、ビットマップの場所はres\toolbar.bmp、
無効用のツールバーのIDはIDB_TOOLBAR_GRAY、ビットマップの場所はres\toolbar_gray.bmp

IDB_TOOLBAR             BITMAP                  "res\\toolbar.bmp"
IDB_TOOLBAR_GRAY        BITMAP                  "res\\toolbar_gray.bmp"

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

(3)
 ダイアログのクラスヘッダのprivateに、ツールバーとボタン用イメージリストのメンバ変数定義を追加。


    // ツールバー
    CToolBar m_wndToolBar;

    // イメージリスト
    CImageList imageList;
    CImageList imageListGray;

(4)
 OnInitDialogの「// TODO: 初期化をここに追加します。」より後にて、ツールバーを読み込む。 ボタンのIDはresource.hのdefineにも追加しておくこと。 数字は、同一画面上のコントロールで重複しないようにする。
(区切り用のID_SEPARATORはフレームワークで定義済みなので追加不要)


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

        return TRUE;
    }

    CToolBarCtrl& toolBarCtrl = m_wndToolBar.GetToolBarCtrl();

    // ボタン1個のサイズ指定
    // 1番目の引数のCSizeには、イメージに対して幅+7以上、高さ+6以上を指定する
    m_wndToolBar.SetSizes(CSize(40 + 7, 50 + 6), CSize(40, 50));

    // リソースからビットマップの読み込み
    CBitmap bitmap;
    CBitmap bitmapGray;
    bitmap.LoadBitmap(IDB_TOOLBAR);
    bitmapGray.LoadBitmap(IDB_TOOLBAR_GRAY);

    // イメージリストの作成
    // 3番目の引数にて、bit数を指定する
    imageList.Create(40, 50, ILC_COLOR24|ILC_MASK, 0, 0);
    imageListGray.Create(40, 50, ILC_COLOR8|ILC_MASK, 0, 0);

    // イメージリストにビットマップを登録
    // 2個目の引数にて、背景色(透明化する箇所)を指定
    imageList.Add(&bitmap, RGB(0xFF, 0xF2, 0x00));
    imageListGray.Add(&bitmapGray, RGB(0x00, 0x00, 0x00));

    // ツールバーにイメージリストを登録
    toolBarCtrl.SetImageList(&imageList);
    toolBarCtrl.SetDisabledImageList(&imageListGray);

    // 各ボタンにID付与
    // 下記の例は、ボタンのIDにIDBUTTON1,IDBUTTON2,IDBUTTON3、
    // 2番目と3番目のボタンの間に明確な区切り(すきま)を入れる場合。

    // 2番目の引数には、ボタンと区切りを合わせた個数
    m_wndToolBar.SetButtons(NULL, 4);

    // 1番目の引数は、ボタンと区切りを合わせたインデックス(0開始)。
    // 4番目の引数は、ボタンのみのインデックス(0開始)。区切りはゼロを指定。
    m_wndToolBar.SetButtonInfo(0, IDBUTTON1, TBSTYLE_BUTTON, 0);
    m_wndToolBar.SetButtonInfo(1, IDBUTTON2, TBSTYLE_BUTTON, 1);
    m_wndToolBar.SetButtonInfo(2, ID_SEPARATOR, TBBS_SEPARATOR, 0);
    m_wndToolBar.SetButtonInfo(3, IDBUTTON3, TBSTYLE_BUTTON, 2);

    // 以下、4bitビットマップの場合と同じ
    // ツールバーのサイズ取得
    CSize sizeToolBar = m_wndToolBar.CalcFixedLayout(FALSE, TRUE);

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

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

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


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

(6)
 各ボタンの有効・無効(グレー化)を制御するには、以下の通り。 フラグのデフォルトはTRUE(有効)。
(4bitビットマップの場合と同じ)


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

ボタン有効化の例
ボタン無効化の例

(メモ)

  • アイコンやボタン用ビットマップのサンプルの場所は、C:\Program Files\Microsoft Visual Studio 9.0\Common7\VS2008ImageLibrary\1041\VS2008ImageLibrary.zip
  • CToolBarはCControlBarの派生クラス、CControlBarはCWndの派生クラス
  • MSDNライブラリの 「CToolBar」「CBitmap::LoadBitmap」「CImageList::Create」「CImageList::Add」「CControlBar::CalcFixedLayout」「CSize」 「CWnd::MoveWindow」「CWnd::ModifyStyle」「CToolBarCtrl::SetImageList」「CToolBarCtrl::SetDisabledImageList」 「CToolBarCtrl::EnableButton」 を参照のこと