![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
KOL и темы XP [Delphi, Windows]
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;