HWND CreateSimpleToolbar(HWND hWndParent)
{
const int ImageListID = 0;
const int numButtons = 3;
const DWORD buttonStyles = BTNS_AUTOSIZE;
HWND hWndToolbar = CreateWindowEx(0x80, TOOLBARCLASSNAME, NULL, WS_CHILD | TBSTYLE_FLAT | WS_BORDER, 0, 0, 0, 0, hWndParent, NULL, hInst, NULL);
if (hWndToolbar == NULL)
return NULL;
HIMAGELIST hImageList = ImageList_Create(75, 66, ILC_COLOR, numButtons, 0);
BITMAP BNew = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_NEW));
HBITMAP BOpen = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_OPEN));
HBITMAP BSave = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_SAVE));
ImageList_Add(hImageList, BNew, NULL);
ImageList_Add(hImageList, BOpen, NULL);
ImageList_Add(hImageList, BSave, NULL);
SendMessage(hWndToolbar, TB_SETHOTIMAGELIST, 0, (LPARAM)hImageList);
TBBUTTON tbButtons[numButtons] =
{
{ 0, IDM_NEW, TBSTATE_ENABLED,
buttonStyles, {TBSTYLE_BUTTON}, 0, (INT_PTR)L"Новый" },
{ 1, IDM_OPEN, TBSTATE_ENABLED,
buttonStyles, {TBSTYLE_BUTTON}, 0, (INT_PTR)L"Открыть"},
{ 2, IDM_SAVE, TBSTATE_ENABLED,
buttonStyles, {TBSTYLE_BUTTON}, 0, (INT_PTR)L"Сохранить"}
};
SendMessage(hWndToolbar, TB_SETBITMAPSIZE, 0, MAKELONG(75, 66));
SendMessage(hWndToolbar, TB_SETBUTTONSIZE, 0, MAKELONG(75, 66));
SendMessage(hWndToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
SendMessage(hWndToolbar, TB_ADDBUTTONS, (WPARAM)numButtons, (LPARAM)&tbButtons);
SendMessage(hWndToolbar, TB_AUTOSIZE, 0, 0);
ShowWindow(hWndToolbar, TRUE);
return hWndToolbar;
}
Ааа, как сделать нормальный ToolBar с картинками на WinAPI?
Как сделать нормальные True Color битмапы на кнопках? Мне даже прозрачность не нужна.
Лучше всего было бы увидеть пример кода работающей панели с True Color картинками... Облазил весь инет - то, что нашел, не работает...
Вот текущая функция создания панели. Не обращайте внимания на текстовые строки - потом буду грузить из ресурсов, но сейчас нужно, чтобы заработало хоть как-то.
Код:
Цитата:
HIMAGELIST hImageList = ImageList_Create(75, 66, ILC_COLOR, numButtons, 0);
BITMAP BNew = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_NEW));
HBITMAP BOpen = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_OPEN));
HBITMAP BSave = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_SAVE));
ImageList_Add(hImageList, BNew, NULL);
ImageList_Add(hImageList, BOpen, NULL);
ImageList_Add(hImageList, BSave, NULL);
Создавать список изображений не надо... Все картинки для кнопок размещайте в файле ресурсов. Вообщем, см. MSDN...
В принципе, я уже все сделал, нужно было лишь заменить ILC_COLOR на ILC_COLOR32 и TB_SETHOTIMAGELIST на TB_SETIMAGELIST.
А картинки я и так беру из ресурсов. Видно же в коде.
P.S. Я все время сейчас провожу в MSDN...
Цитата:
CreateToolBarEx вроде бы устаревшая функция и рекомендуется использовать именно CreateWindowEx.
А зачем использовать функция CreateWindowEx, затем посылать сообщения для добавления кнопок, изображений, создавать список изображений и т.д., когда можно воспользоваться готовой функцией CreateToolbarEx...
Не получается управлять кнопками тулбара (TB_CHECKBUTTON и TB_SETSTATE не работают).
Код:
SendMessage(hwndTBar, TB_CHECKBUTTON, (WPARAM)(int)3, (LPARAM)MAKELONG(TRUE, 0));
// или
SendMessage(hwndTBar, TB_SETSTATE, (WPARAM)(int)3, (LPARAM)MAKELONG(TBSTATE_PRESSED, 0));
// или
SendMessage(hwndTBar, TB_SETSTATE, (WPARAM)(int)3, (LPARAM)MAKELONG(TBSTATE_PRESSED, 0));
Кнопка должна зажаться, но ничего не происходит. Сообщение успешно отправляется, в hwndTBar лежит хэндл тулбара. Прямо не знаю, что и думать.
UPD:
Решено. Нужно чекать кнопку по командному идентификатору, а не по номеру.