Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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]


> По умолчанию он чёрный, нам надо сделать белым.

он не черный, он системного цвета на системном фоне
а вот что будет с твоим белым, если юзер изменит системные цвета?


Наверх

Титульная страница Поиск, карта сайта Написать письмо