PDA

Просмотр полной версии : Как указать ToolBar'у цвет BackGround'а?



Romeo
20.05.2004, 16:28
Господа, помогите. Проблема такова:

Создаю ToolBar с помощью CreateToolbarEx которой передаётся ID битмапки и размеры кнопочек (из этой битмапки ToolBar при создании нарезает картинки для своих баттонов). При рисовании картинок для кнопок я использовал белый цвет в качестве фонового.

Вопрос: Как "сказать" ToolBar'у, что этот самый белый цвет нужно подразумевать как фоновый для того, чтобы в процессе функционирования отображать вместо него фон, выставленный пользователем в настройках Windows.

P.S. Использую WTL, прийму помощь и на API, естественно... :)

AiK
20.05.2004, 16:34
Romeo, непрограммный способ, на сколько я помню: верхний левый пиксель битмапа должен быть покрашен в тот цвет, который будет считаться "прозрачным".

Romeo
20.05.2004, 17:14
Проверил, это пиксел - белый. Не работает!

AiK
20.05.2004, 17:38
Romeo, тогда я пас. Создаю тулбар при помощи CreateWindowEx (CreateToolbarEx некошерным нынче считается), картинку (одну на все кнопки) и кнопки добавляю при помощи сообщений TB_ADDBITMAP и TB_ADDBUTTONS соответственно, незабыв предварительно отправить TB_BUTTONSTRUCTSIZE. При изменении цвета у 3D Objects в свйоствах экрана на любой другой у иконы фон меняется с исходного серого на тот, что нужно.

Romeo
20.05.2004, 18:42
Можно примерчик на RomeoMontekky@mail.ru скинуть. Сравню и пойму что не так, по крайней мере.

AiK
20.05.2004, 20:16
Romeo, не, в приват кидать ничего не буду. Просто обязательно ещё желающие нарисуются, а я человек ленивый :)

Вот кусок кода:



const
IDB_TOOLBAR_BUTTONS = 1022;
var
tbButtons: array[0..5] of TTBButton;
tbBitmap: TTBADDBITMAP;

begin

with tbButtons[0] do begin
iBitmap := 0;
idCommand := IDC_PRESSBUTTON1;
fsStyle := BTNS_WHOLEDROPDOWN or TBSTYLE_AUTOSIZE;
fsState := TBSTATE_ENABLED;
dwData := 0;
iString := 0;
end;

...
hToolbar := CreateWindowEx(0, TOOLBARCLASSNAME, '',
WS_CHILD or WS_VISIBLE or TBSTYLE_LIST or CCS_NODIVIDER or
TBSTYLE_FLAT, 0, 0, 400, 22, hParent, 0, 0, nil);


SendMessage(hToolBar, TB_BUTTONSTRUCTSIZE, SizeOf(TTBBUTTON), 0);

tbBitmap.hInst:=Hinstance;
tbBitmap.nID:=IDB_TOOLBAR_BUTTONS;

SendMessage(hToolBar, TB_ADDBITMAP, WPARAM(2), LPARAM(@tbBitmap));
SendMessage(hToolBar, TB_ADDBUTTONS, 6, LPARAM(@tbButtons));

SendMessage(hToolBar, TB_AUTOSIZE, 0, 0);
...
end;


Паскаль, но думаю разберёшься. Собака в паскале, то же самое, что амперсэнд в Ц, т.е. адрес.
Несущественные детали, типа создания родителя и установки строк опустил.

Да, TOOLBARCLASSNAME - константа, определённая в windows.h

Romeo
20.05.2004, 20:29
Да я знаю Паскаль, прекрасно. Все с него начинали. Пасибо, щас буду дегустировать :)

AiK
20.05.2004, 20:38
Кстати, можно было и не позорится на старости лет, а дать ссылочку на первоисточник:
http://www.msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/toolbar/toolbar_using.asp
:)

Да, есть такоее мнение, что ты забыл TBSTYLE_FLAT заюзать.
Цитата: Note For Common Controls version 6.00, if a visual style is being used with the toolbar, buttons are always transparent regardless of the style setting. Otherwise, transparency behavior is normal as indicated by the use of the TBSTYLE_FLAT or TBSTYLE_TRANSPARENT style.

Romeo
21.05.2004, 13:43
Неа, не забыл. Проблема в чём-то другом. В чём именно, пока не выяснил.

AiK
21.05.2004, 13:52
Romeo, тогда скорее всего дело в битмапах. Попробуй фон серым залить RGB(192,192,192).

Romeo
21.05.2004, 16:13
Никак не могу понять в чём дело. Переделал всё с CreateToolbarEx на CreateWindowEx, прочитал половину MSDN по сообщениям ToolBarCtrl - и ничего. Кстати задисэйбленные кнопки по какой-то причене имеют прозрачный background, а вот доступные баттоны... хоть ты тресни, развеваются на белом фоне :( Может есть ещё какие-то мысли?

P.S. TBSTYLE_TRANSPARENT я юзаю, дело точно не в этом.

AiK
21.05.2004, 16:23
Romeo, см. предыдущий мой пост. Сделал фон белым и получил ту же фигню, что и у тебя.

Romeo
21.05.2004, 16:32
Всё получилость. Премного благодарен.

Igor_thief
14.11.2006, 13:00
Уважаемые AiK, несколькими постами выше вы привели очень интерессный кусочек кода. Будьте добры, выкладите (или скиньте в личку) весь код. Пожалуйсиа! Очень надо!

AiK
14.11.2006, 21:46
Igor_thief, увы, ничем помочь не могу - тому коду уже больше двух лет и он не выжил :)

Igor_thief
15.11.2006, 17:59
Эх, жалко. Оказывается у кода есть срок годности :) Ладно, будем искать и разбираться дальше. Я просто хочу добавить возможность тулбатонам прорисовывать стрелочку прямо в кнопке, а не делить кнопку на две части (как это сделано сейчас в Дельфи) для кнопки и стрелочки. В любом случае ваш пример мне очень пригодился. Это очень хорошо что вы его запостили на форум, а не кинули в приват вопрошающим! Спсибо!

AiK
16.11.2006, 03:03
Ну, у меня с того времени винт погиб :)
А за стрелочку по-моему BTNS_WHOLEDROPDOWN ответственнен:
[syntax:171102c96e="delphi"]fsStyle := BTNS_WHOLEDROPDOWN or TBSTYLE_AUTOSIZE;[/syntax:171102c96e]