Конференция "Компоненты" » TGraphicControl
 
  • homm © (07.03.07 01:25) [40]
    > По-моему, подобные штуки надо в самом 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.

  • GrayFace © (07.03.07 21:27) [41]
    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, т.к. если появятся другие контролы, желающие его изменить (в частности, другие твои), будут проблемы.
  • homm © (07.03.07 22:42) [42]
    > WindowProc при RecreateWnd не пострадает.
    Странно, я думал при пересоздании SetParent вызывается. Проверил - нифига.
    Буду переделывать под WindowProc.

    > Создать какой-нибудь TGraphicContainer от панели, за одно
    > и другие (не твои) контролы не будут мерцать.
    Любой WinControl итак ГрфикКонтайнер по идее. Мне не понятно только почему он не просто перерисовывает что ни поподя, а еще и не дает возможности исправить это самому. Просто вызова GetUpdateRgn для приходящей DC и SelectClipRgn для буферной ИМХО было бы достаточно, что-бы можно было проверять GetClipRgn из процедуры рисования самого контрола.
  • GrayFace © (09.03.07 16:00) [43]
    Потестил. D7. Проблема не наблюдается. Перерисовывается только то, что надо.
  • homm © (09.03.07 23:42) [44]
    > Потестил. D7. Проблема не наблюдается. Перерисовывается
    > только то, что надо.

    Какая проблема? С использованием моего варианта ограничения пррисовки? У меня тоже не наблюдается. Или имеется ввиду сама проблема выполнении процедуры переисовки того что нужно и нет? Если 2-е, то ...

    Протестил. D5, D7, BDS2006. Проблема наблюдается. Выполняется код перерисовки и того что не надо в том числе.
  • GrayFace © (10.03.07 12:07) [45]
    Я тестировал без DoubleBuffered. При Invalidate перерисовывался только прямоугольник, в котором находится контрол.
  • homm © (10.03.07 16:00) [46]
    > Я тестировал без DoubleBuffered.
    Непонятно зачем впустую тратил время...
  • BOBAH13 © (11.03.07 21:31) [47]
    вообщем читаю и удивляюсь. вся проблемы всего в

    procedure WMEraseBkgnd( var Msg: TWMEraseBkgnd ); message WM_EraseBkgnd  



    просто опишите ее и код в ней просто begin end; :)

    у меня после этого все на ура! а чтобы не было мерцания то рисуйте все в памяти на TBitmap а потом на окно выкладывайте так быстрей и мерцания нет. в моем компоненте списке вообще никакого мерцания нет
  • homm © (11.03.07 21:48) [48]
    > BOBAH13

    Ну еще один :(
    Ну не дурак я. И не с ветряными мельницами мне нужно было боротся. Если 2 твоих компонента лежат один над нругим, то они оба накладываются попорядку, а значит в этот момент мерцают. Усе?
  • GrayFace © (12.03.07 03:15) [49]
    Перепроверил, при DeoubleBuffered перерисовываются все контролы, но дрожжания нет и не может быть.
  • homm © (12.03.07 08:36) [50]
    > Перепроверил, при DeoubleBuffered перерисовываются все контролы,
    > но дрожжания нет и не может быть.
    Правильно. Верно. 12-раз об этом в этой ветке. Не надоело одно и то-же мусолить?
  • DimaBr (12.03.07 09:45) [51]
    Начнём сначала. (под словом КОНТРОЛ я подразумеваю TGRushControl)
    Насколько я понял из всего выше сканного - требуется создать прозрачный контрол, который перерисовывает только свою видимую часть, дабы не сложилась такая ситуация - один прозрачный контрол перекрывает другой, при перерисовке рисуется сначала нижний, а потом верхний - тем самым область перекрытия сначала заполняется первым контролом, а затем вторым. Получаем ДРОЖАНИЕ.
    Как достигнуть данного я не представляю. Поскольку представляем такую ситуацию: имеется контрол с произвольным графическим рисунком, поверх него лежит другой контрол с рисунком имеющим прозрачные области. Что нужно сделать ? Нужно отрисовать области совпадающие с прозрачными областями в нижнем контроле. Есть какие-нибудь решения ?
  • homm © (12.03.07 16:01) [52]
    > Начнём сначала.
    Народ, это развод, да?


    > Есть какие-нибудь решения ?
    ДА!!!!! Вся ветка об это. Прокрути окно вверх. Если интересно, могу ехе выслать, где это уже работает на простом примере.
  • homm © (12.03.07 16:07) [53]
    > Насколько я понял из всего выше сканного - требуется создать
    > прозрачный контрол, который перерисовывает только свою видимую
    > часть, дабы не сложилась такая ситуация - один прозрачный
    > контрол перекрывает другой
    Неправильно понял. "требуется создать прозрачный контрол, который перерисовывает только свою видимую часть", дабы перерисовывалась только видимая часть, а на перерисовку остального не тратились рессурсы.


    > Есть какие-нибудь решения ?
    [5], [8], [14], и еще один ньюанс: дабы механизм не слетал при RecrateWnd добавляем первой строчкой в
    TGRushControl.Paint
    SetParent(Parent);

  • GrayFace © (12.03.07 16:39) [54]
    > Правильно. Верно. 12-раз об этом в этой ветке. Не надоело
    > одно и то-же мусолить?

    Учись говрить. Перечитай свои посты - там не слово про то что при DoubleBuffered дрожжания не было.
    И ты наворотил подмену WindowProc родителя (далеко не безопасую) только ради уменьшения нагрузки на процессор?
  • DimaBr (12.03.07 16:52) [55]

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

    Моя твоя непонимай.  Должен ли рисоваться ВЕСЬ нижний контрол если он перекрыт верхним с прозрачными областями ? Или должны отрисоваться только перекрытые прозрачные области ???
  • homm © (12.03.07 16:58) [56]
    > Учись говрить. Перечитай свои посты - там не слово про то
    > что при 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;


  • homm © (12.03.07 17:11) [57]
    > Моя твоя непонимай.  Должен ли рисоваться ВЕСЬ нижний контрол
    > если он перекрыт верхним с прозрачными областями ? Или должны
    > отрисоваться только перекрытые прозрачные области ???

    Поступило сообщение на перерисовку родителя всех контроллов. При этом где-то внутри системы хранится область, которую нужно перерисовать. ВинКонтрол, у которого установлен ойно буфер, создает этот буфер, отрисовывает на нем все дочерние контролы, дальше что-бы сбросить отрисованые контролы в свое окно он вызывает BeginPaint. Вот тут то и начинается действо! Тот регон, который реально требуется для перерисовки достается из недр системы, и клипается для оконной канвы. В результате когда ВинКонтрол блитит туда свой буфер, на оконную канву попадает далеко не все изображение. Зато подготавливается все. А после вызова BeginPaint получить ту магическую область, которую нужно перерисовать не получается (с чего и начался разговор). Выход был найден в том что-бы тащит эту область ДО вызова BeginPaint ставля хук на родительское окно компонента.


    > Должен ли рисоваться ВЕСЬ нижний контрол если он перекрыт
    > верхним с прозрачными областями ?
    Должен, если в область перерисовки перекрывает его хотя-бы частично.
  • homm © (12.03.07 17:13) [58]
    > И ты наворотил подмену WindowProc родителя (далеко не безопасую)
    > только ради уменьшения нагрузки на процессор?

    Я обошелся средствами АПИ в этом вопросе, как еще наши деды делали, у них все безопасно было. В топку такое "расширение функционала" средстваим ВСЛ.
  • GrayFace © (12.03.07 21:43) [59]
    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, а контрола уже не будет.
Есть новые Нет новых   [134427   +38][b:0][p:0.001]