#6
by たいちう » 6年前
以前書いたコードの一部ですが、左に3つの標準ボタン、
右に4つのオリジナルのボタンを持ったツールバーを作っています。
参考になるでしょうか。
コード:
HWND MainWindow::createToolBar() {
static TBBUTTON tbb[] = {
{ STD_FILENEW, IDM_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 },
{ STD_FILEOPEN, IDM_OPEN, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 },
{ STD_FILESAVE, IDM_SAVE, 0, TBSTYLE_BUTTON, 0, 0 },
{ 0, IDM_EDIT, 0, TBSTYLE_BUTTON, 0, 0 },
{ 1, IDM_ADD, 0, TBSTYLE_BUTTON, 0, 0 },
{ 2, IDM_AUTO, 0, TBSTYLE_BUTTON, 0, 0 },
{ 3, IDM_TESTALL, 0, TBSTYLE_BUTTON, 0, 0 },
{ 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0 } // セパレータ
};
// ツールバー本体
::InitCommonControls();
HINSTANCE instance = getInstance();
HWND toolbar =
::CreateWindowEx(0, TOOLBARCLASSNAME, NULL,
WS_CHILD | WS_VISIBLE | TBSTYLE_TOOLTIPS,
0, 0, 0, 0, hWnd_,
reinterpret_cast<HMENU>(ID_TOOLBAR), instance, NULL);
::SendMessage(toolbar, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0);
// 標準のボタン
TBADDBITMAP tb;
tb.hInst = HINST_COMMCTRL;
tb.nID = IDB_STD_SMALL_COLOR;
int stdid =
static_cast<int>(::SendMessage(toolbar, TB_ADDBITMAP, 3, (LPARAM)&tb));
tbb[0].iBitmap += stdid;
tbb[1].iBitmap += stdid;
tbb[2].iBitmap += stdid;
::SendMessage(toolbar, TB_ADDBUTTONS, 3, reinterpret_cast<LPARAM>(&tbb[0]));
// オリジナルのボタン
tb.hInst = NULL;
tb.nID = reinterpret_cast<UINT_PTR>(getTransparentBitmap());
stdid = static_cast<int>(::SendMessage(toolbar, TB_ADDBITMAP, 4, (LPARAM)&tb));
tbb[3].iBitmap += stdid;
tbb[4].iBitmap += stdid;
tbb[5].iBitmap += stdid;
tbb[6].iBitmap += stdid;
::SendMessage(toolbar, TB_ADDBUTTONS, (WPARAM)4, (LPARAM)(&tbb[3]));
::SendMessage(toolbar, TB_INSERTBUTTON, 3, (LPARAM)(&tbb[7]));
::SendMessage(toolbar, TB_INSERTBUTTON, 6, (LPARAM)(&tbb[7]));
return toolbar;
}
HBITMAP MainWindow::getTransparentBitmap() {
// 元のビットマップ
HBITMAP bitmap = ::LoadBitmap(getInstance(), TEXT("TOOLBAR_BITMAP"));
// サイズ・背景色の取得
BITMAP bmp;
::GetObject(bitmap, sizeof(bmp), &bmp);
int cx = bmp.bmWidth;
int cy = bmp.bmHeight;
HDC hdc = ::GetDC(hWnd_);
HDC hdc2 = ::CreateCompatibleDC(hdc);
HBITMAP bitmap0 = static_cast<HBITMAP>(::SelectObject(hdc2, bitmap));
COLORREF back = ::GetPixel(hdc2, 0, 0);
HBITMAP bitmap2 = ::CreateCompatibleBitmap(hdc, cx, cy);
::SelectObject(hdc2, bitmap2);
// ビットマップを作成
::SelectObject(hdc2, ::GetStockObject(NULL_PEN));
::SelectObject(hdc2, ::GetSysColorBrush(COLOR_BTNFACE));
::Rectangle(hdc2, 0, 0, cx + 1, cy + 1);
HIMAGELIST imageList = ::ImageList_Create(cx, cy, ILC_COLOR | ILC_MASK, 1, 0);
::ImageList_AddMasked(imageList, bitmap, back);
::ImageList_Draw(imageList, 0, hdc2, 0, 0, ILD_NORMAL);
// 後片付け
::SelectObject(hdc2, bitmap0);
::DeleteDC(hdc2);
::ReleaseDC(hWnd_, hdc);
::ImageList_Destroy(imageList);
::DeleteObject(bitmap);
return bitmap2;
}
以前書いたコードの一部ですが、左に3つの標準ボタン、
右に4つのオリジナルのボタンを持ったツールバーを作っています。
参考になるでしょうか。
[code]HWND MainWindow::createToolBar() {
static TBBUTTON tbb[] = {
{ STD_FILENEW, IDM_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 },
{ STD_FILEOPEN, IDM_OPEN, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 },
{ STD_FILESAVE, IDM_SAVE, 0, TBSTYLE_BUTTON, 0, 0 },
{ 0, IDM_EDIT, 0, TBSTYLE_BUTTON, 0, 0 },
{ 1, IDM_ADD, 0, TBSTYLE_BUTTON, 0, 0 },
{ 2, IDM_AUTO, 0, TBSTYLE_BUTTON, 0, 0 },
{ 3, IDM_TESTALL, 0, TBSTYLE_BUTTON, 0, 0 },
{ 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0 } // セパレータ
};
// ツールバー本体
::InitCommonControls();
HINSTANCE instance = getInstance();
HWND toolbar =
::CreateWindowEx(0, TOOLBARCLASSNAME, NULL,
WS_CHILD | WS_VISIBLE | TBSTYLE_TOOLTIPS,
0, 0, 0, 0, hWnd_,
reinterpret_cast<HMENU>(ID_TOOLBAR), instance, NULL);
::SendMessage(toolbar, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0);
// 標準のボタン
TBADDBITMAP tb;
tb.hInst = HINST_COMMCTRL;
tb.nID = IDB_STD_SMALL_COLOR;
int stdid =
static_cast<int>(::SendMessage(toolbar, TB_ADDBITMAP, 3, (LPARAM)&tb));
tbb[0].iBitmap += stdid;
tbb[1].iBitmap += stdid;
tbb[2].iBitmap += stdid;
::SendMessage(toolbar, TB_ADDBUTTONS, 3, reinterpret_cast<LPARAM>(&tbb[0]));
// オリジナルのボタン
tb.hInst = NULL;
tb.nID = reinterpret_cast<UINT_PTR>(getTransparentBitmap());
stdid = static_cast<int>(::SendMessage(toolbar, TB_ADDBITMAP, 4, (LPARAM)&tb));
tbb[3].iBitmap += stdid;
tbb[4].iBitmap += stdid;
tbb[5].iBitmap += stdid;
tbb[6].iBitmap += stdid;
::SendMessage(toolbar, TB_ADDBUTTONS, (WPARAM)4, (LPARAM)(&tbb[3]));
::SendMessage(toolbar, TB_INSERTBUTTON, 3, (LPARAM)(&tbb[7]));
::SendMessage(toolbar, TB_INSERTBUTTON, 6, (LPARAM)(&tbb[7]));
return toolbar;
}
HBITMAP MainWindow::getTransparentBitmap() {
// 元のビットマップ
HBITMAP bitmap = ::LoadBitmap(getInstance(), TEXT("TOOLBAR_BITMAP"));
// サイズ・背景色の取得
BITMAP bmp;
::GetObject(bitmap, sizeof(bmp), &bmp);
int cx = bmp.bmWidth;
int cy = bmp.bmHeight;
HDC hdc = ::GetDC(hWnd_);
HDC hdc2 = ::CreateCompatibleDC(hdc);
HBITMAP bitmap0 = static_cast<HBITMAP>(::SelectObject(hdc2, bitmap));
COLORREF back = ::GetPixel(hdc2, 0, 0);
HBITMAP bitmap2 = ::CreateCompatibleBitmap(hdc, cx, cy);
::SelectObject(hdc2, bitmap2);
// ビットマップを作成
::SelectObject(hdc2, ::GetStockObject(NULL_PEN));
::SelectObject(hdc2, ::GetSysColorBrush(COLOR_BTNFACE));
::Rectangle(hdc2, 0, 0, cx + 1, cy + 1);
HIMAGELIST imageList = ::ImageList_Create(cx, cy, ILC_COLOR | ILC_MASK, 1, 0);
::ImageList_AddMasked(imageList, bitmap, back);
::ImageList_Draw(imageList, 0, hdc2, 0, 0, ILD_NORMAL);
// 後片付け
::SelectObject(hdc2, bitmap0);
::DeleteDC(hdc2);
::ReleaseDC(hWnd_, hdc);
::ImageList_Destroy(imageList);
::DeleteObject(bitmap);
return bitmap2;
}[/code]