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

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

KOL и темы XP [Delphi, Windows]


Страницы:   1 2 3

Turbid ©   (2006-12-12 02:15:00) 

Если использовать темы XP, то при создании объектов на TabControl происходит бяка - группа нес тем цветом, кнопки вообще не видать:


MainWnd := NewForm(Applet, 'Project');
MainWnd.Style := WS_CAPTION or WS_SYSMENU;
MainWnd.Font.FontName := 'MS Shell Dlg';
MainWnd.Font.FontHeight := -11;

TabCtrl := NewTabControl(MainWnd, ['Hello World'],
                                   [], nil, 1).Shift(8, 8).Size(353, 353);

DevGroup := NewGroupbox(TabCtrl.Pages[0], 'General').Size(100, 100).Shift(8, 8);
TestBtn := NewButton(TabCtrl.Pages[0], '&Button').Size(75, 25).Shift(150, 150);

MainWnd.Size(377, 432);
MainWnd.CenterOnParent;
MainWnd.Visible := True;

Run(MainWnd);


Что я делаю не так? Манифест из KOLXPMan...


homm   (2007-01-25 11:06:00) [21]

> устают глаза от много- или скорее плохо-цветия
Ну это претензии к конкретной теме, а не к концепции в целом.


> тормозят работу системы
На моей старой машине, сел500 128озу это практически незаметно было, а на хорошем железе иподавно говорить не о чем.


> + глючат
Это да. Особенно прогрессбар, практически во всех темах, за исключением стандартной, может быть.

С появлением висты проблем только прибавится. Просто убивает криворукость и недальновидность майкросовта.


Turbid   (2007-01-24 23:02:00) [22]

>темы неудобны (устают глаза от много- или скорее плохо-цветия), >тормозят работу системы, и + глючат

Полностью поддерживаю, но вот юзеры...


Vladimir Kladov   (2007-01-24 15:26:00) [23]

я не так часто использую закладки, и не ориентирую на темы ХР. Для меня это не вопрос: темы неудобны (устают глаза от много- или скорее плохо-цветия), тормозят работу системы, и + глючат. В корзину. Нет, ну если кто решит проблему, завсегда пожалста, вставим, хотя бы через IFDEF.


homm   (2007-01-24 08:45:00) [24]

> Владимир, так значит глюк с темами и табами не будет исправлен
> никогда?

Все завсит от ТЕБЯ! Дерзай.


Turbid   (2007-01-24 00:10:00) [25]

Владимир, так значит глюк с темами и табами не будет исправлен никогда? Или есть решение?


Dimaxx   (2006-12-31 15:20:00) [26]

2 GR: Это для более поздних версий Дельфи, которые сразу поддерживают темы. У Д5 нет такой поддержки, но ТС отображается нормально под темами... Так что дело тут не в uxtheme.dll...


Galkov   (2006-12-28 19:50:00) [27]


> Собственно, сегодня только одна строка, подразумевающая,
>  что список children - это ТОЛЬКО список табов, и осталась.
> ..
>
> function TControl.TC_Insert(Idx: Integer; const TabText:
>  KOLString; TabImgIdx: Integer): PControl;
> ......
>  Result.Visible := Count = 0;

Sorry, ерунду с порол :(
Не осталось такой строки...


Galkov   (2006-12-28 09:12:00) [28]

Владимир, есть такое соображение...

Для TabControl, помимо методов TC_Insert и TC_Delete можно завести что-то типа TC_RegisterPage и TC_RemovePage. Ну, может с проверкой, что регистрируемый контрол, это наследник TabControl...

Чтобы пользователь мог вставлять своего типа странички:
Нравится Groupbox и без ailgn-а - на здоровье, если TabControl своих размеров не меняет...
Хочешь - memo с caClient на страничку приклеивай...
Или еще один TabControl...

Собственно, сегодня только однастрока, подразумевающая, что список children - это ТОЛЬКО список табов, и осталась...

function TControl.TC_Insert(Idx: Integer; const TabText: KOLString; TabImgIdx: Integer): PControl;
......
 Result.Visible := Count = 0;


GR   (2006-12-27 22:45:00) [29]

...взгляни сразу на отрисовку TabSheet, а именно на TTabSheet.WMNCPaint.
Все пути ведут сначало в Themes.pas -> UxTheme.pas -> themelib = 'uxtheme.dll'; От туда как раз и эта процедура DrawParentBackground и т.п.

Вот попробовал..., процедура рисования для  TabCtrl.Pages[0]:
//сразу пример привел
program TEST;
uses
 kol,Messages,
 Windows,Themes;
{$R WindowsXP.res}
var MainWnd,TabCtrl,TestBtn: pControl;
procedure Paint(  Dummy: Pointer; Sender: PControl );
 var DC:HDC;
   DrawRect: TRect;
   Details: TThemedElementDetails;
begin
with ThemeServices do
 begin
 DC := Sender.Canvas.Handle{(Form1.Handle)};
   try
     Details := GetElementDetails(ttBody);
     DrawParentBackground(Sender.Handle, DC, @Details, TRUE);
   finally
     ReleaseDC(Sender.Handle, DC);
   end;
 end;
end;
begin
 MainWnd := NewForm(Applet, 'Project');
 MainWnd.Font.FontName := 'MS Shell Dlg';
 MainWnd.Font.FontHeight := -11;
 TabCtrl := NewTabControl(MainWnd, ['Hello World', 'Free'],
                                  [], nil, 1).Shift(10, 10).Size(353, 353);
 TestBtn := NewButton(TabCtrl.Pages[0], '&Button').SetPosition(100, 100).Size(75, 25);
 MainWnd.Size(377, 432);
 MainWnd.CenterOnParent;

 TabCtrl.Pages[0].OnPaint := TOnPaint(MakeMethod(nil,@Paint));
 TabCtrl.Pages[1].OnPaint := TOnPaint(MakeMethod(nil,@Paint));
Run(MainWnd);
end.


Vladimir Kladov   (2006-12-27 18:05:00) [30]

Нету, нету. Все проще: когда родителем нового окна делается окно TabControl'а, его фактическим родителем становится текущая вкладка. Нам же для сохранения общности вызова NewXXXX( parent: PControl; .... нужен такой вот Parent, и неважно, есть у него хэндл или нет, но он должен обеспечить правильную прилинковку к нужной вкладке таб-контрола. Я потому и решил, что простейший способ - сделать промежуточную панель. Кстати, еще до того, как микрософт решила испортить жизнь разработчиков своими кривыми темами. И без них-то все было очень даже ништяк.


dimaxx   (2006-12-27 02:31:00) [31]

Как нет? Хм, тогда встречный вопрос: а VCL ведь как-то делает это. И причем оч. успешно - под темами ТС отображается нормально и контролы на вкладках не глючат...

Если я не ошибаюсь, у любого контрола есть хэндл. И, думаю, вкладка ТС не исключение - я не смотрел еще код VCL'а, но думаю ответ должен быть там. Правда разбирать и анализировать этот код долго. Надо будет поковыряться на досуге (если он будет).


Vladimir Kladov   (2006-12-24 15:37:00) [32]

Считайте, что задали. Посмотрите код TC_Insert. Если панель не создавать, то нужен какой-то хитрый механизм создания контрола, который вместо того, чтобы создавать окно обычным способом, использовал Handle закладки. И это еще можно было бы провернуть, если бы у каждой закладки и впрямь был бы такой Handle. Но его нет :(


Dimaxx   (2006-12-24 12:52:00) [33]

В КОЛ каждая вкладка закрывается стандартной панелью. Вот на нее и "складываются" компоненты. В обычном режиме все нормально, а с темами трабла. Давно думал - зачем, но так и не дошли руки Владимиру вопрос задать. Пробовал ставить панель прозрачной - норм, но не работает прозрачность у компонентов, хоть Transparent стоит True.


GR   (2006-12-22 00:29:00) [34]

CCM_SETCOLORSCHEME - не является стилем,
взгляни на отрисовку: TCustomGroupBox.Paint...


Trible   (2006-12-22 00:18:00) [35]

Satabs попробуй, мне они даже больше чем xp табы понравились.


GR   (2006-12-21 23:46:00) [36]

Такого же эффекта получишь:

TabCtrl.Pages[0].Style := 0


Turbid   (2006-12-18 22:02:00) [37]

Перебирал все варианты TabCtrl.Pages[0].Color := clXXX, никто не подошел. Можно сделать clMenu (белый на XP, серый на классике), но правильный цвет все равно должен быть немного грязновато-белый  (хорошо видно в оливковом стиле XP).

А вот если сделать так:

TabCtrl.Pages[0].Style := CCM_SETCOLORSCHEME

то таб становится своим цветом, но приложение зависает при переключении с других табов на первый. В SDK про CCM_SETCOLORSCHEME ничего не нашел - откопал ее опытным путем.


Turbid   (2006-12-14 23:26:00) [38]

2MainWnd, Я уже писал в [4] что накосячил с кнопкой. Вопрос про цвет таба остается открытым (под темой Luna он должен быть белым).


Turbid   (2006-12-14 23:26:00) [39]

2MainWnd, Я уже писал в [4] что я накосячил с кнопкой. Вопрос про цвет таба остается открытым (под темой Luna он должен быть белым).


MTsv DN   (2006-12-14 12:31:00) [40]

> Нормальная отрисовка табов при использовании тем OS всегда
> было проблемой.

Причем тут Таб. Turbid ©говорит " > группа нес тем цветом, кнопки вообще не видать". Скажу по-секрету, ее и без Тем "не видать", т.к. GroupBox поверх лежит!!!

> Обращаюсь к автору Владимиру К. и другим гуру: возможно ли исправить сей досадный глюк?
1. Например, вот так:
DevGroup := NewGroupbox(TabCtrl.Pages[0], 'General').Size(100, 100).Shift(8, 8);
TestBtn := NewButton(TabCtrl.Pages[0], '&Button').Size(75, 25).Shift(150, 150);
TestBtn.BringToFront;

Кстати, если строчку не добавить, а прозрачность установить, то кнопка видна будет, а вот нажать на нее не сможете...

2. Или так:
DevGroup := NewGroupbox(TabCtrl.Pages[0], 'General').Size(100, 100).Shift(8, 8);
TestBtn := NewButton( DevGroup, '&Button').Size(75, 25).Shift(150, 150);


3. Использовать не Shift, а SetPosition. Shift действительно "косячит".

4. > Все бы ничего да кнопка в черной рамке...
Попробуйте, Color установить в: Color := Color + 1;


Страницы:   1 2 3

Наверх

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