Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2006.08.13;
Скачать: [xml.tar.bz2];

Вниз

DoubleBuffered + XP bugs   Найти похожие ветки 

 
fellix   (2005-10-16 20:05) [0]

Нужно иногда красоту навести: картинку или градиент нарисовать, сверху EditBox положить и Label прозрачный... Любят заказчики это дело. Но DoubleBuffered не дружит с XP-темами.
Уже пару лет в KOL существуют 2 глюка, в версии 2.15 добавился третий (т.к. изменилась отрисовка DoubleBuffered). Ниже - простейший пример, который демонстрирует баги.

Есть главная форма, на неё брошены (все параметры по умолчанию) KOLEditBox, KOLDateTimePicker, KOLListBox, KOLMemo, KOLListView, KOLTreeView, KOLButton, KOLRadioBox и transparent (важно!) KOLCheckBox.
В ресурсы добавлен XP-манифест (можно использовать KOLMHXP). Тоже важно - без манифеста ошибок нет.
Следствие из kol.pas: поскольку есть transparent control, то он сам, его parent (в данном случае форма) и все childcontrols этого parent"а (здесь это все остальные контролы) автоматически становятся DoubleBuffered.
Программа компилируется и запускается на Win XP или 2003 с включенными темами.

Теперь собственно глюки:
1. KOLEditBox, KOLDateTimePicker, KOLListBox, KOLMemo, KOLListView, KOLTreeView не отрабатывают текущую XP-тему - border вместо плоского приобретает 3D-вид (как в Win 2000).
2. Вместо прозрачного KOLCheckBox получается черный прямоугольник.
3. Начиная с версии 2.15 KOLButton, KOLRadioBox и KOLCheckBox вообще не работают (попробуйте кликнуть по ним мышкой).

Кто-нибудь знает, как с этим бороться?
Или только переписать DoubleBuffered?


 
homm ©   (2005-10-16 20:33) [1]

Если ты перепишеш DoubleBuffered так, чтобы всех все устраивало, то с меня лично пиво ;) т.к. мне он тоже часто нужен бывает.


 
homm ©   (2005-10-16 20:54) [2]

Собственно по эксперименту:

> Вместо прозрачного KOLCheckBox получается черный прямоугольник.
Глючит не во всех схемах оформления, по этому считаю глюком темы от M$ (как легко опять все на старину Билла свалить).

Вчера я отправил Владимиру письмо (2 Kladov/ Только не говорите мне что оно опять не дошло), где систематизировал свои "пожелания" насчет Double buff. Мне кажется что все описаные вами глюки частный случай того, о чем написал я (могу и ошибатся). С выходом следующей версии узнаем.


 
Thaddy   (2005-10-17 18:31) [3]

Tested without MCK, XP SP2, NVIDEA drivers, standard manifest:
All controls worked perfectly as expected. If it is a bug it is in the MCK.


 
fellix   (2005-10-18 02:39) [4]

> Thaddy   (17.10.05 18:31) [3]

Thaddy, MCK doesn"t matter. Simplest program w/o MCK:

program Test;
uses KOL;
var Form, EditBox, CheckBox: PControl;
begin
 Form := NewForm(nil, "Form");
 EditBox := NewEditBox(Form, []);
 EditBox.Color := clWindow;
 CheckBox := NewCheckBox(Form, "").PlaceUnder;
 //CheckBox.Transparent := True;
 Run(Form);
end.

Put "Test.exe.manifest" file into the same directory and run the program. => Themes work!
Now uncomment "Transparent" and run again.
KOL v.2.15 => You will see black checkbox and 3D-border around the editbox.
KOL v.2.16 => You will see black checkbox and NO border around the editbox.
Tested under Win 2003 SP1 + NVIDIA drivers.


 
thaddy   (2005-10-18 06:25) [5]

You are right. This doesn"t work either way in 2.16 or 2.15
I must have mistakenly tried with an older version of kol.pas.
(Too many different installations ;) )
This is indeed a bug introduced in the last two updates.


 
thaddy   (2005-10-18 07:33) [6]

I also note that the control"s boundsrect has changed compared to 2.10:

I tried debugging the above and stumbled on that by trying this:

procedure TForm1.DoPaint(sender: Pcontrol; DC: HDC);
begin
 fillrect(dc,sender.boundsrect,getstockobject(WHITE_BRUSH));
end;


The boundsrect is smaller in 2.16. Maybe an inflaterect has been forgotten or added ?


 
Vladimir Kladov   (2005-10-18 09:42) [7]

ClientRect or BoundsRect? BoundsRect не менялся. Use WinMerge to compare versions - it is great (and freeware) :)

Для прозрачности меток и чек/радио-боксов с темами есть достаточно простое решение, хотя и требует чуть больше своего кода. Надо делать их графическими (Windowed=false, NewGraphXXX), и там есть OnPrePaint, в котором можно нарисовать подложку какую надо. Родителем, правда, GradienPanel сделать уже не получится - делать надо обычную панель, в ней делать свое рисование. Но тем легче повторить рисование подложки для того граф-контрола, в котором это требуется. Примерно так я сделал в EmuZWin GS-Debugger - чтобы он отличался от основного Debugger"а - там по всем панелям идет общий фоновый битмап (tile), и для меток и прочих контролов с открытыми границами его прорисовка выполняеся в OnPrePaint. Тема там как раз используется, но Transparent"а и DoubleBuffered нигде нет.

Если реализуете так, чтобы это работало без написания кода (и главное - без увеличения кода, когда эта возможность не требуется) - шлите изменения.


 
fellix   (2005-10-18 14:34) [8]

> thaddy   (18.10.05 06:25) [5]

Thaddy, please, trust me - I use KOL three years, and that"s very old bug. In other releases of KOL it"s just hidden deeper - a bit more complicated example is required.
Below is sample for testing KOL v.2.08, but I believe it shows the bug in most of KOL versions.

program Test;
uses KOL;
var Form, Panel, Memo, CheckBox: PControl;
begin
 Form := NewForm(nil, "");
 Panel := NewPanel(Form, esRaised).SetSize(300, 300);
 Memo := NewEditBox(Panel, [eoMultiline]);
 Memo.Color := clWindow;
 CheckBox := NewCheckBox(Panel, "").PlaceUnder;
 //CheckBox.Transparent := True;
 Run(Form);
end.

By the way, this program shows new bug introduced in KOL v.2.16. If you move mouse over this form, click on different controls, etc., you can see how the memo"s scrollbars accidentally become visible/invisible.


 
Thaddy   (2005-10-18 16:05) [9]

2 Vladimir: the code was copyed straight from my testing code while I was testing ;)
I already noticed that the boundsrect code seems not to have changed (although it is in a different place) and at the moment I can not explain why this happened, only THAT it happens. ;) I will send you an example or post it here.
2 Felix: The strange thing is, that my old chordfinder code - that uses a manifest- simply works o.k. with 2.16. I knew about the bug and must have written around it. I'll have a look what happens exactly. I have a fever and am at home right now, and staying in bed for ten days or so isn't my style ;)


 
Vladimir Kladov   (2005-10-18 17:50) [10]

этот баг устраняется легко. Но все-таки Transparent все равно мало кого устраивает в нынешнем виде. Тем более что он реализовывался до появления ХР с темами и с ними не дружит. Может, кто-то все-таки предложит свой вариант? возможные пути:

1. меняется порядок рисования. Сейчас на битмапе рисуются все дочерние сверху вниз (от родителя - к дочерним). Сначала рисуется родитель, потом на нем - дочерние. Можно по-другому: рисовать от дочерних к родителям, и по дороге исключать отрисованные области, из области рисования. Наверное, в этом случае можно отвязаться даже от DoubleBuffered родителя и рисовать прямо на канву (наверное тогда придется родителям убирать CLIPCHILDREN хотя надо пробовать). Хотя удобнее все-таки объединить, и получить опять же DoubleBuffered, который так же и работал бы.
 В таком варианте, для того, чтобы прозрачность была в том же чек боксе, надо делать BeginPath ... рисование ... EndPath PathToRegion ... еще раз рисование ... ExtSelectClipRegion( path_region ).

2. используется WS_EX_TRANSPARENT. Ну это дохлый случай, читаем MSDN: If a window is created using CreateWindowEx() with the WS_EX_TRANSPARENT style, windows below it at the position where the original window was initially placed are not obscured and show through. Moving the WS_EX_TRANSPARENT window, however, results in the old window background moving to the new position, because Windows does not support fully functional transparent windows.

WS_EX_TRANSPARENT was designed to be used in very modal situations and the lifetime of a window with this style must be very short.  Дальше можно не читать, прозрачность с WS_EX_TRANSPARENT будет еще кривее чем сейчас.

3. Можно попробовать Layered Windows. Я не пробовал еще, не знаю, что это есть такое, и как оно будет. Поддерживается только с Win2K, в 9х поддержки нет вообще.

Итого, наиболее интересный вариант - 1. Полностью меняется порядок рисования. Чуть более тормозной, ибо работа с регионами. Но в итоге есть шанс, что удастся подружить с темами. Хотя бы при рисовании напрямую.

А с темами... Не знаю, что там такое, и почему вообще они так себя ведут при рисовании контрола на битмапе. Может потому, что ему окну нужна именно экранная канва. Может, надо отрабатывать как-то по-особому сообщения какие-то. Но это очень глубоко копать. И не надо меня заставлять это копать. Вам надо - вы копайте, пожалуйста.


 
gent   (2005-11-08 01:25) [11]

Переделал пример из [4].

program Test;
uses KOL;
var Form, Memo, ScrBar, CheckBox: PControl;
begin
 Form := NewForm(nil, "");
 Memo := NewEditBox(Form, [eoMultiline]).PlaceUnder;
 Memo.Color := clWindow;
 ScrBar := NewScrollBar(Form, sbHorizontal).PlaceUnder.SetSize(200, 25);
 ScrBar.SBMax := 100;
 CheckBox := NewCheckBox(Form, "").PlaceUnder;
 CheckBox.Transparent := True;
 Run(Form);
end.

Не знаю, когда это появилось, но в KOL2.21 + D5 + WinXP + XP-манифест глючат скроллбары: МЕМОвские моргают, а standalone вообще исчезает, если нажать на правую стрелку.


 
Vladimir Kladov   (2005-11-08 09:20) [12]

зачем нужна прозрачность чек бокса?


 
gent   (2005-11-08 10:11) [13]

Чтобы смоделировать DoubleBuffered (рудимент исходного примера).
В данном примере 3-ю и 4-ю строчки снизу можно заменить на Form.DoubleBuffered := True.



Страницы: 1 вся ветка

Форум: "KOL";
Текущий архив: 2006.08.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.041 c
15-1153375915
QuickFinder
2006-07-20 10:11
2006.08.13
Топология


2-1153663394
Bambucha
2006-07-23 18:03
2006.08.13
Shell Extensions


15-1152829698
Light
2006-07-14 02:28
2006.08.13
Форд - Беллман


2-1153713090
Vovan33
2006-07-24 07:51
2006.08.13
Internet Explorer


15-1153081750
Kerk
2006-07-17 00:29
2006.08.13
«Судейство в Томске - происки ЦСКА»





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский