Windows APIで作成したツールバーの背景をVistaや7のExplorerのツールバー(画像参照)みたいにしたいのですが、現在はとりあえず以下のような、ツールバーのプロシージャを乗っ取ってWM_ERASEBKGNDを捕まえてそこで自力で背景を作成するという、工夫もへったくれもない書き方をしています。
#include<Windows.h>
#include<tchar.h>
#include<CommCtrl.h>
WNDPROC lpfnDefToolbarProc;
LRESULT CALLBACK ToolbarProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
switch (uMsg){
case WM_ERASEBKGND:
RECT clientrc;
GetClientRect(hWnd, &clientrc);
HDC hdc = (HDC)wParam;
// ちょっとずつ色を変えながら線を引いていく。
for (int i = 0; i < clientrc.bottom / 2; i++){
COLORREF color = RGB(255 - i*10, 255 - i*2, 255 - i*3);
HPEN hPen = CreatePen(PS_SOLID, 1, color);
HPEN hPrevPen = (HPEN)SelectObject(hdc, hPen);
MoveToEx(hdc, 0, i, nullptr);
LineTo(hdc, clientrc.right, i);
SelectObject(hdc, hPrevPen);
DeleteObject(hPen);
}
//立体感を出すために下半分の色調は変える。
for (int i = clientrc.bottom / 2; i < clientrc.bottom; i++){
COLORREF color = RGB(i,128+i*3,96+i*6);
HPEN hPen = CreatePen(PS_SOLID, 1, color);
HPEN hPrevPen = (HPEN)SelectObject(hdc, hPen);
MoveToEx(hdc, 0, i, nullptr);
LineTo(hdc, clientrc.right, i);
SelectObject(hdc, hPrevPen);
DeleteObject(hPen);
}
return TRUE;
}
return CallWindowProc(lpfnDefToolbarProc, hWnd, uMsg, wParam, lParam);
}
LRESULT CALLBACK MainProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
static HWND hToolbar;
switch (uMsg){
case WM_CREATE:
InitCommonControls();
hToolbar = CreateWindowEx(0, TOOLBARCLASSNAME, nullptr, WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT, 0, 0, 10, 20, hWnd, nullptr, nullptr, nullptr);
lpfnDefToolbarProc = (WNDPROC)SetWindowLongPtr(hToolbar, GWLP_WNDPROC, (LONG_PTR)&ToolbarProc);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_SIZE:
SIZE size = { LOWORD(lParam), HIWORD(lParam) };
MoveWindow(hToolbar, 0, 0, size.cx, 30, TRUE);
return 0;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow){
WNDCLASSEX wndClass = {};
wndClass.cbSize = sizeof(wndClass);
wndClass.style = CS_VREDRAW | CS_HREDRAW;
wndClass.lpfnWndProc = &MainProc;
wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.hIcon = wndClass.hIconSm = LoadIcon(nullptr, (LPCTSTR)IDI_APPLICATION);
wndClass.hCursor = LoadCursor(nullptr, (LPCTSTR)IDC_ARROW);
wndClass.lpszClassName = _T("SampleWindow");
LPCTSTR lpClassAtom = (LPCTSTR)RegisterClassEx(&wndClass);
if (!lpClassAtom)return -1;
HWND hWnd = CreateWindow(lpClassAtom, _T("Toolbar Sample"), WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
nullptr, nullptr, nullptr, nullptr);
if (!hWnd) return -1;
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
MSG msg;
while (int retGM = GetMessage(&msg, nullptr, 0, 0)){
if (retGM == -1)return -1;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}