Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
15-1188394941
sdubaruhnul
2007-08-29 17:42
2007.09.30
Задача на оптимизацмю парковки


2-1188907422
ArtikZ
2007-09-04 16:03
2007.09.30
PrintScreen


15-1188078391
Германн
2007-08-26 01:46
2007.09.30
Ещё раз про перевод из Си на Паскаль


15-1188808368
Crazybobr
2007-09-03 12:32
2007.09.30
Кто-нить играет по сети в Sniper Elite?


15-1188570006
Черный Шаман
2007-08-31 18:20
2007.09.30
Русский код, бессмысленный и беспощадный.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский