【Visual C++ 2008】【MFC】
ツールバークラス(CToolBar)を使用して、ダイアログに24bitビットマップ付きボタンを実装する方法。
(4bit(16色)ビットマップの場合は、
「ダイアログにビットマップ付きボタンを実装する(4bitカラー編)」
を参照のこと)
(1)
ボタンを横に並べたビットマップ(下記の例は、横40ドット*縦50ドットを3個)を、
ボタン有効用と無効用の2枚、ペイント等の外部ツールで作成する。
その際、背景色(透明化してダイアログの地の色を出す箇所)は、ボタンのデザインに使用されていない色なら何でもよい。
また、ボタン間の区切りは意識しない(区切りは、(4)にてソースより指定)。


(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」 を参照のこと