Форум: "Основная";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];
ВнизToolBar,Menu,ToolButton, Font Найти похожие ветки
← →
DevilDevil © (2007-07-12 14:36) [0]Здравствуйте
Проблема вот какая.
Есть компонент 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, но всё же не хотелось бы делать такие кординальные изменения
← →
Вася Правильный (2007-07-12 15:58) [1]
> По умолчанию он чёрный, нам надо сделать белым.
он не черный, он системного цвета на системном фоне
а вот что будет с твоим белым, если юзер изменит системные цвета?
← →
DevilDevil © (2007-07-12 16:41) [2]Мне без разницы, какой там системный...
TToolButton - наследник TGraphicControl, стандартностью здесь как то не сильно пахнет... следовательно по идее, как то можно сменить шрифт на кнопке... вся проблема заключается в том, что по исходникам я не нашёл, где именно прорисовывается текст.
← →
Amoeba © (2007-07-12 17:54) [3]А может TToolBar это делает? Ведь TToolButton в отрыве от него не живет.
← →
DevilDevil © (2007-07-12 17:56) [4]Да я и там и там смотрел...
Вопрос открыт
← →
Amoeba © (2007-07-12 18:08) [5]Значит плохо искал.
← →
Kolan © (2007-07-12 18:12) [6]> for i := 0 to ToolBar1->ButtonCount-do
> begin
А что это за код такой?
← →
Sdubaruhnul (2007-07-13 00:24) [7]>TToolButton - наследник TGraphicControl, стандартностью здесь как то не сильно пахнет... следовательно по идее, как то можно сменить шрифт на кнопке... вся проблема заключается в том, что по исходникам я не нашёл, где именно прорисовывается текст.
Название модуля ComCtrls не настораживает? Это виндовский контрол, она же его и рисует. Делфи общается со своим же тулбаром путём отправки сообщений. Сплошь и рядом в коде видишь Perform.
Тебе бы
TTBCustomDrawBtnEvent = procedure(Sender: TToolBar; Button: TToolButton;
State: TCustomDrawState; var DefaultDraw: Boolean) of object;
и UxTheme для стандартности.
← →
DevilDevil © (2007-07-13 12:59) [8]
> Kolan © (12.07.07 18:12) [6]
> > for i := 0 to ToolBar1->ButtonCount-do> beginА что это
> за код такой?
Это я так невнимательно с Си на Delphi перевёл.
> Sdubaruhnul (13.07.07 00:24) [7]
сейчас посмотрю...
← →
DevilDevil © (2007-07-13 13:25) [9]> Sdubaruhnul (13.07.07 00:24) [7]
Спасибо тебе большое, то что нужно!
а что такое "UxTheme" ?
А если бы вы ещё подсказали, как изменить цвета закладок TTabControl, было бы вообще здорово!
← →
Sdubaruhnul (2007-07-13 15:10) [10]>А если бы вы ещё подсказали, как изменить цвета закладок 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 15:27) [11]хммм. нашёл файл "ThemesSupport.pas"
Ты не подскажешь статью какую-нибудь, как этим пользоваться. Или может быть пример?
← →
Sdubaruhnul (2007-07-13 16:08) [12]http://www.shorterpath.com/develop/zonearticles/VisualStyles.asp
← →
DevilDevil © (2007-07-13 16:12) [13]спасибо. постараюсь разобраться
← →
DevilDevil © (2007-07-13 16:50) [14]Удалено модератором
Примечание: Личная переписка
← →
DevilDevil © (2007-07-16 15:28) [15]1) не понимаю, как можно изменить текущую тему. Методов получить параметры темы - множество (GetElementDetails). А как их изменить? Как присвоить?
2) даже если мне удастся менять тему на необходимую мне... Будет ли это работать на ранних версиях Windows?
3) со StatusBar-ом те же самые проблемы. Можно ли как то изменить цвет шрифта без изменения тем? Проведённые опыты сOnDrawPanel
никаих результатов не принесли.
Буду рад любой помощи.
← →
Sdubaruhnul (2007-07-16 22:34) [16]>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-17 09:58) [17]> Sdubaruhnul (16.07.07 22:34) [16]
Спасибо, то что нужно!
Жалко, табы перерисовывать похоже сложнее.
А если у кого нибудь есть хороший пример перерисовки табов - было бы вообще здорово!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.088 c