![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ToolBar,Menu,ToolButton, Font
DevilDevil © (2007-07-12 14:36:00)Здравствуйте
Проблема вот какая.
Есть компонент ToolBar, ему присвоено MainMenu, появилось множество соответсвующих кнопок ToolButton. Проблема в цвете шрифта таких кнопок. По умолчанию он чёрный, нам надо сделать белым. Изменение шрифта у ToolBar не помогает. У ToolButton свойство Font не открыто. И даже такой танец не помогает:
for i := 0 to ToolBar1->ButtonCount-do
begin
Button := ToolBar1->Buttons[i];
THintWindow(Button).Font.Assigned(ToolBar1->Font);
end;
// THintWindow - это Control, свойство которого открыто.
Поиск по Сети не дал результата. Подскажите, подалуйста, что делать.
Заранее Спасибо!
P.S. понятно, конечно, что самому можно сэмитировать взаимодействие ToolBar и Menu, но всё же не хотелось бы делать такие кординальные изменения
DevilDevil (2007-07-17 09:58:00) [1]> Sdubaruhnul (16.07.07 22:34) [16]
Спасибо, то что нужно!
Жалко, табы перерисовывать похоже сложнее.
А если у кого нибудь есть хороший пример перерисовки табов - было бы вообще здорово!
Sdubaruhnul (2007-07-16 22:34:00) [2]> DevilDevil © (16.07.07 15:28) [15]
На примере 3-его, работаю в Delphi 7 SE.
Кидаешь StatusBar и подключаешь манифест. У СтатусБара делаешь панель, в ней пишешь свой текст и делаешь её Style равным psOwnerDraw. В OnDrawPanel пишешь:
procedure TformMain.StatusBarDrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
begin
if (Panel.Index = 0) then
begin
StatusBar.Canvas.Font.Color := clRed;
StatusBar.Canvas.TextOut(Rect.Left, Rect.Top, Panel.Text);
end;
end;
И будет красный текст.
Тему если поменяешь, то все контролы будут по-другому рисоваться. Увы, в Delphi нет темы для отдельного контрола (а вот в VS.NET есть). Поэтому тебе нужно не тему менять, а рисовать по-своему с учётом текущей темы.
DevilDevil (2007-07-16 15:28:00) [3]1) не понимаю, как можно изменить текущую тему. Методов получить параметры темы - множество (GetElementDetails). А как их изменить? Как присвоить?
2) даже если мне удастся менять тему на необходимую мне... Будет ли это работать на ранних версиях Windows?
3) со StatusBar-ом те же самые проблемы. Можно ли как то изменить цвет шрифта без изменения тем? Проведённые опыты сOnDrawPanelникаих результатов не принесли.
Буду рад любой помощи.
DevilDevil (2007-07-13 16:50:00) [4]Удалено модератором
Примечание: Личная переписка
DevilDevil (2007-07-13 16:12:00) [5]спасибо. постараюсь разобраться
Sdubaruhnul (2007-07-13 16:08:00) [6]http://www.shorterpath.com/develop/zonearticles/VisualStyles.asp
DevilDevil (2007-07-13 15:27:00) [7]хммм. нашёл файл "ThemesSupport.pas"
Ты не подскажешь статью какую-нибудь, как этим пользоваться. Или может быть пример?
Sdubaruhnul (2007-07-13 15:10:00) [8]> А если бы вы ещё подсказали, как изменить цвета закладок TTabControl, было бы вообще здорово!
Да никак в том смысле, в котором ты имеешь ввиду. Нет такого волшебного свойства, типа TabBackColor.
Windows рисует эти стандартные контролы. Они хранятся в comctl32.dll, а ComCtrls.pas есть обёртка вокруг неё.
Как быть? Многие контролы поддерживают рисование себя пользователем (Custom Draw) при помощи событий (это уже в VCL-обёртке, если быть точным). Но так как ты сам не нарисуешь виндовские кнопки, табы, заголовки, чек-боксы (ты под увеличением посмотри то - там и градиентики, и тени), предлагается использовать UxTheme - стандартный модуль в Delphi начиная с 7-ого (наверное). Это менеджер тем винды, точнее, как можно опять догадаться, обёртка вокруг соответствующей библиотеки. Винда сама тоже её использует. Да, сейчас глянул: UxTheme - по сути заголовочный файл, Themes.pas - обёртка.
Ну так вот. В менеджере тем ты сначала выбираешь, что рисовать при помощи ThemeServices.GetElementDetails, а потом рисуешь ThemeServices.DrawElementBackground и ThemeServices.DrawElement.
DevilDevil (2007-07-13 13:25:00) [9]> Sdubaruhnul (13.07.07 00:24) [7]
Спасибо тебе большое, то что нужно!
а что такое "UxTheme" ?
А если бы вы ещё подсказали, как изменить цвета закладок TTabControl, было бы вообще здорово!
DevilDevil (2007-07-13 12:59:00) [10]
> Kolan © (12.07.07 18:12) [6]
> > for i := 0 to ToolBar1->ButtonCount-do> beginА что это
> за код такой?
Это я так невнимательно с Си на Delphi перевёл.
> Sdubaruhnul (13.07.07 00:24) [7]
сейчас посмотрю...
Sdubaruhnul (2007-07-13 00:24:00) [11]> TToolButton - наследник TGraphicControl, стандартностью здесь как то не сильно пахнет... следовательно по идее, как то можно сменить шрифт на кнопке... вся проблема заключается в том, что по исходникам я не нашёл, где именно прорисовывается текст.
Название модуля ComCtrls не настораживает? Это виндовский контрол, она же его и рисует. Делфи общается со своим же тулбаром путём отправки сообщений. Сплошь и рядом в коде видишь Perform.
Тебе бы
TTBCustomDrawBtnEvent = procedure(Sender: TToolBar; Button: TToolButton;
State: TCustomDrawState; var DefaultDraw: Boolean) of object;
и UxTheme для стандартности.
Kolan (2007-07-12 18:12:00) [12]> for i := 0 to ToolBar1 ->ButtonCount-do
> begin
А что это за код такой?
Amoeba (2007-07-12 18:08:00) [13]Значит плохо искал.
DevilDevil (2007-07-12 17:56:00) [14]Да я и там и там смотрел...
Вопрос открыт
Amoeba (2007-07-12 17:54:00) [15]А может TToolBar это делает? Ведь TToolButton в отрыве от него не живет.
DevilDevil (2007-07-12 16:41:00) [16]Мне без разницы, какой там системный...
TToolButton - наследник TGraphicControl, стандартностью здесь как то не сильно пахнет... следовательно по идее, как то можно сменить шрифт на кнопке... вся проблема заключается в том, что по исходникам я не нашёл, где именно прорисовывается текст.
Вася Правильный (2007-07-12 15:58:00) [17]
> По умолчанию он чёрный, нам надо сделать белым.
он не черный, он системного цвета на системном фоне
а вот что будет с твоим белым, если юзер изменит системные цвета?