-
> По-моему, подобные штуки надо в самом Parent делать.
Как? Исходники VCL править? > А зачем тебе UpdateRect?
10 раз же сказано, что-бы проверять реально ли нуждается контрол в перерисовке, или нет. > И че говорит Canvas.ClipRect?
Canvas.ClipRect равен ClientRect, т.к. 1) этот дс не окна, которое перерисовывается(родителя), а бирмапа буфера 2) Это все равно будут КЛИЕНТСКИЕ координаты графического контрола. > В VCL аналог SetWindowLong - TControl.WindowProc.
А различия в чем? Если только в том что на апи я реализовал, а через эту штуку нет, то нафиг нада. К тому-же Use the WindowProc property to temporarily replace or subclass the window procedure of the control.
-
homm © (07.03.07 1:25) [40] Как? Исходники VCL править? Создать какой-нибудь TGraphicContainer от панели, за одно и другие (не твои) контролы не будут мерцать.
homm © (07.03.07 1:25) [40] А различия в чем? Если только в том что на апи я реализовал, а через эту штуку нет, то нафиг нада. WindowProc при RecreateWnd не пострадает.
homm © (07.03.07 1:25) [40] К тому-же Use the WindowProc property to temporarily replace or subclass the window procedure of the control. Это же относится и к SetWindowLong, т.к. если появятся другие контролы, желающие его изменить (в частности, другие твои), будут проблемы.
-
> WindowProc при RecreateWnd не пострадает. Странно, я думал при пересоздании SetParent вызывается. Проверил - нифига. Буду переделывать под WindowProc.
> Создать какой-нибудь TGraphicContainer от панели, за одно > и другие (не твои) контролы не будут мерцать. Любой WinControl итак ГрфикКонтайнер по идее. Мне не понятно только почему он не просто перерисовывает что ни поподя, а еще и не дает возможности исправить это самому. Просто вызова GetUpdateRgn для приходящей DC и SelectClipRgn для буферной ИМХО было бы достаточно, что-бы можно было проверять GetClipRgn из процедуры рисования самого контрола.
-
Потестил. D7. Проблема не наблюдается. Перерисовывается только то, что надо.
-
> Потестил. D7. Проблема не наблюдается. Перерисовывается > только то, что надо.
Какая проблема? С использованием моего варианта ограничения пррисовки? У меня тоже не наблюдается. Или имеется ввиду сама проблема выполнении процедуры переисовки того что нужно и нет? Если 2-е, то ...
Протестил. D5, D7, BDS2006. Проблема наблюдается. Выполняется код перерисовки и того что не надо в том числе.
-
Я тестировал без DoubleBuffered. При Invalidate перерисовывался только прямоугольник, в котором находится контрол.
-
> Я тестировал без DoubleBuffered. Непонятно зачем впустую тратил время...
-
вообщем читаю и удивляюсь. вся проблемы всего в procedure WMEraseBkgnd( var Msg: TWMEraseBkgnd ); message WM_EraseBkgnd просто опишите ее и код в ней просто begin end; :) у меня после этого все на ура! а чтобы не было мерцания то рисуйте все в памяти на TBitmap а потом на окно выкладывайте так быстрей и мерцания нет. в моем компоненте списке вообще никакого мерцания нет
-
> BOBAH13
Ну еще один :( Ну не дурак я. И не с ветряными мельницами мне нужно было боротся. Если 2 твоих компонента лежат один над нругим, то они оба накладываются попорядку, а значит в этот момент мерцают. Усе?
-
Перепроверил, при DeoubleBuffered перерисовываются все контролы, но дрожжания нет и не может быть.
-
> Перепроверил, при DeoubleBuffered перерисовываются все контролы, > но дрожжания нет и не может быть. Правильно. Верно. 12-раз об этом в этой ветке. Не надоело одно и то-же мусолить?
-
Начнём сначала. (под словом КОНТРОЛ я подразумеваю TGRushControl) Насколько я понял из всего выше сканного - требуется создать прозрачный контрол, который перерисовывает только свою видимую часть, дабы не сложилась такая ситуация - один прозрачный контрол перекрывает другой, при перерисовке рисуется сначала нижний, а потом верхний - тем самым область перекрытия сначала заполняется первым контролом, а затем вторым. Получаем ДРОЖАНИЕ. Как достигнуть данного я не представляю. Поскольку представляем такую ситуацию: имеется контрол с произвольным графическим рисунком, поверх него лежит другой контрол с рисунком имеющим прозрачные области. Что нужно сделать ? Нужно отрисовать области совпадающие с прозрачными областями в нижнем контроле. Есть какие-нибудь решения ?
-
> Начнём сначала. Народ, это развод, да?
> Есть какие-нибудь решения ? ДА!!!!! Вся ветка об это. Прокрути окно вверх. Если интересно, могу ехе выслать, где это уже работает на простом примере.
-
> Насколько я понял из всего выше сканного - требуется создать > прозрачный контрол, который перерисовывает только свою видимую > часть, дабы не сложилась такая ситуация - один прозрачный > контрол перекрывает другой
Неправильно понял. "требуется создать прозрачный контрол, который перерисовывает только свою видимую часть", дабы перерисовывалась только видимая часть, а на перерисовку остального не тратились рессурсы. > Есть какие-нибудь решения ? [5], [8], [14], и еще один ньюанс: дабы механизм не слетал при RecrateWnd добавляем первой строчкой в TGRushControl.Paint SetParent(Parent);
-
> Правильно. Верно. 12-раз об этом в этой ветке. Не надоело > одно и то-же мусолить?
Учись говрить. Перечитай свои посты - там не слово про то что при DoubleBuffered дрожжания не было. И ты наворотил подмену WindowProc родителя (далеко не безопасую) только ради уменьшения нагрузки на процессор?
-
> Неправильно понял. "требуется создать прозрачный контрол, > который перерисовывает только свою видимую часть", дабы > перерисовывалась только видимая часть, а на перерисовку > остального не тратились рессурсы.
Моя твоя непонимай. Должен ли рисоваться ВЕСЬ нижний контрол если он перекрыт верхним с прозрачными областями ? Или должны отрисоваться только перекрытые прозрачные области ???
-
> Учись говрить. Перечитай свои посты - там не слово про то > что при DoubleBuffered дрожжания не было.
Учись читать. > [0] homm © (04.03.07 19:32) > Делаю графические контролы, обязательное требование у которых > - отсутствие дрожания. Естественно для этого сделано следующее:
> procedure TGRushControl.SetParent(AParent: TWinControl);
> begin
> if AParent<>nil then begin
> AParent.DoubleBuffered := TRUE;
> end;
> inherited SetParent(AParent);
> end;
-
> Моя твоя непонимай. Должен ли рисоваться ВЕСЬ нижний контрол > если он перекрыт верхним с прозрачными областями ? Или должны > отрисоваться только перекрытые прозрачные области ???
Поступило сообщение на перерисовку родителя всех контроллов. При этом где-то внутри системы хранится область, которую нужно перерисовать. ВинКонтрол, у которого установлен ойно буфер, создает этот буфер, отрисовывает на нем все дочерние контролы, дальше что-бы сбросить отрисованые контролы в свое окно он вызывает BeginPaint. Вот тут то и начинается действо! Тот регон, который реально требуется для перерисовки достается из недр системы, и клипается для оконной канвы. В результате когда ВинКонтрол блитит туда свой буфер, на оконную канву попадает далеко не все изображение. Зато подготавливается все. А после вызова BeginPaint получить ту магическую область, которую нужно перерисовать не получается (с чего и начался разговор). Выход был найден в том что-бы тащит эту область ДО вызова BeginPaint ставля хук на родительское окно компонента.
> Должен ли рисоваться ВЕСЬ нижний контрол если он перекрыт > верхним с прозрачными областями ? Должен, если в область перерисовки перекрывает его хотя-бы частично.
-
> И ты наворотил подмену WindowProc родителя (далеко не безопасую) > только ради уменьшения нагрузки на процессор?
Я обошелся средствами АПИ в этом вопросе, как еще наши деды делали, у них все безопасно было. В топку такое "расширение функционала" средстваим ВСЛ.
-
homm © (12.03.07 17:13) [58] Я обошелся средствами АПИ в этом вопросе, как еще наши деды делали, у них все безопасно было.Какая разница API или VCL? Это не безопасно. Вот пример: Control1.SetHook: Control1.LastHook:=SetWindowLong(Control1.Hook);
Control2.SetHook: Control2.LastHook:=SetWindowLong(Control2.Hook);
Control1.Destroy: SetWindowLong(Control1.LastHook);
Control2.Destroy: SetWindowLong(Control2.LastHook); В результате у Parent'а останется Control1.Hook, а контрола уже не будет.
|