PDA

Просмотр полной версии : Свои картинки на кнопках в Toolbar



AiK
11.04.2004, 18:12
Тулбар создаю при помощи CreateWindowEx(0, TOOLBARCLASSNAME,...). Последовательно отправляю тулбару TB_BUTTONSTRUCTSIZE, TB_ADDSTRING (стиль кнопок TBSTYLE_LIST указан), TB_ADDBITMAP и TB_ADDBUTTONS.

Очевидно, что не правильно заполняю поля структуры TBADDBITMAP, т.к. если установить hInst в HINST_COMMCTRL, а nID , скажем в IDB_STD_SMALL_COLOR, то стандартные картинки грузятся нормально.

Собственно вопрос наверное нужно сформулировать так: что есть the resource identifier of the bitmap with the button images?

Ибо попытки поставить hInst в 0 или в хэндл dll'и и использовать 0 или 1 в качестве этого самого nID заканчиваются полным фиаско, хотя в ресурсах имеются 2 bmp'хи.

AiK
11.04.2004, 18:37
Скопировал бмп-ху из comctrl32.dll. Присвоил ей уникальный ID в ресурсах, его же использую в nID. Каменный цветок не выходит :) :(

AiK
11.04.2004, 19:13
Собака порылась в hInst - не тот указывал.

HumVee
30.05.2004, 02:29
А у меня вопрос такой: почему в ToolBar'е нельзя использовать в качестве картинки для кнопок bitmap больше чем с 256-ю цветами?
Использую тоже CreateWindowEx, TB_BUTTONSTRUCTSIZE, TB_ADDBITMAP и TB_ADDBUTTONS. При посылке сообщения TB_ADDBITMAP, если передать 256-ти цветный битмап, то всё нормально, если цветов больше - Access Violation. Может кто встречался с подобным?

HumVee
30.05.2004, 16:25
Наткнулся вот ещё на что. Я вытащил из shell32.dll битмап, из которого IE делает свой тулбар. Там 32-х битный цвет. Вставил в свою программу, и тулбар создался нормально. Залез в Paint чтобы изменить цвет фона, сохранил, опять вставил - ошибка. Как нужно сохранять бмп, чтобы всё было нормально?

Romeo
01.06.2004, 12:28
А зачем цвет фона менял? По всей видимости в нём-то собака и порылась.

HumVee
01.06.2004, 20:56
Изменение цвета фона не было целью как таковой. Если в Paint'е открыть тот файл, а затем, ничего в нём не трогая, сохранить под другим именем, то ошибка всё равно проявляется. Тем более что в ИЕшном битмапе цвет фона чёрный и он так и остаётся чёрным при создании тулбара(как уже говорилось в одной из веток на этом форуме, битмап нужно залить серым RGB(192,192,192))

AiK
01.06.2004, 21:02
HumVee, а ты каким образом загружаешь битмап? Поступило предположение, что прежде чем скормить битмапину тулбару её нужно привести к удобоваримому виду.

HumVee
02.06.2004, 23:33
Вот функция, которой я создаю тулбар:

HWND CreateToolBar(HWND hWndParent)
{
HWND hwndToolbar;
TBADDBITMAP tb;

// Toolbar buttons
TBBUTTON tbButtons [] =
{
{0, IDM_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
{1, IDM_OPEN, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
{2, IDM_SAVE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
{3, IDM_DEL, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
};

DWORD dwStyle = WS_VISIBLE | WS_CHILD | CCS_TOP | TBSTYLE_TOOLTIPS |
CCS_NOPARENTALIGN | CCS_NORESIZE | CCS_NODIVIDER | TBSTYLE_FLAT |
TBSTYLE_TRANSPARENT;

hWndToolbar = CreateWindowEx (0, TOOLBARCLASSNAME, "myToolBar",
dwStyle, 0, 0, 0, 0, hWndParent, (HMENU)ID_TOOLBAR, hInstance, NULL);

SendMessage(hWndToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);

tb.hInst = hInstance; //моей программы
tb.nID = IDB_BTNBMP; //ID моего битмапа
SendMessage (hWndToolbar, TB_ADDBITMAP, 11, (LPARAM)&tb);

SendMessage (hWndToolbar, TB_ADDBUTTONS, 4, (LONG) &tbButtons);

return hWndToolbar;
}

Ошибка возникает при посылке сообщения TB_ADDBITMAP.

AiK
03.06.2004, 00:56
HumVee, так тебе предлагатся загрузить битмапину самостоятельно при помощи LoadImage, а уже потом скормить тулбару.

HumVee
03.06.2004, 19:33
AiK, большое спасибо, всё заработало. Но появилась ещё одна проблема: с прозрачностью картинок. Тулбар никак не хочет понимать, что фон нужно сделать прозрачным. Пробовал заливать битмап серым(192, 192, 192), белым, чёрным. В функции LoadImage есть флаг LR_LOADMAP3DCOLORS:

LR_LOADMAP3DCOLORS Searches the color table for the image and replaces the following shades of gray with the corresponding 3-D color:
Color Replaced with
Dk Gray, RGB(128,128,128) COLOR_3DSHADOW
Gray, RGB(192,192,192) COLOR_3DFACE
Lt Gray, RGB(223,223,223) COLOR_3DLIGHT
Do not use this option if you are loading a bitmap with a color depth greater than 8bpp.

Меня очень смущает последняя строчка. Также есть флаг LR_LOADTRANSPARENT, но он тоже не помогает. Что ещё можно предпринять?

AiK
03.06.2004, 20:05
А что тебя смущает? 8 бит на пиксель это и есть 256 цветов.
Т.е. тебе предлагается опять же ручками заменить в загруженной BMP пиксели какого-то цвета на пиксели текущего цвета бэкграунда.
Например, гуру предлагают делать это так (http://www.codeguru.com/Cpp/controls/toolbar/article.php/c2537/)
Кстати, на всякий пожарный - в XP и Win2K цвета разные.

Я почти не работал с изображениями, но рискну предположить, что в BMP теоретически можно поменять цвет одним ударом. Так что имеет смысл поискать какие-нибудь системные функции для этого дела, типа смены таблицы цветов, что ли.

HumVee
03.06.2004, 23:56
Ладно. Я просто думал что это мой недочёт, а на самом деле так нельзя. Будем искать(с).

HumVee
04.06.2004, 00:12
А можно ли задать тулбару картинки для кнопок в форме ImageList'а? Тогда задача сильно упрощается...

AiK
04.06.2004, 00:21
HumVee, сентенции не понял. Ты ж лист и добавляешь при помощи TB_ADDBITMAP - 11 картинок в одной BMPхе.

HumVee
04.06.2004, 00:47
Да, я знаю. Я имел в виду АПИшные функции для работы с "общим элементом управления" ImageList'ом. Просто в него можно загрузить иконки(они нормально отображаются, без фона), а вот можно ли его потом присоединить к тулбару?

AiK
04.06.2004, 01:04
TB_SETIMAGELIST?

HumVee
04.06.2004, 01:26
TB_SETIMAGELIST?
Оно самое. Чего-то я его раньше не заметил... Ещё раз всем огромное спасибо, всё работает так как я и хотел.

Romeo
04.06.2004, 17:27
Мдяяяя. Тяжёлый случай :)