1. Pascal / Говнокод #21951

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    if not DoubleBuffered then
        begin
          BufferDC := CreateCompatibleDC(DC);
          // CreateCompatibleDC(DC) return 0 if Drawing takes place to MemDC(buffer):
          // return <> 0 => need to double buffer || return = 0 => no need to double buffer
          if BufferDC <> 0 then
          begin
            // Using the cache if possible
            if FIsCachedBuffer or FIsFullSizeBuffer then
            begin
              // Create cache if need
              if CacheBitmap = 0 then
              begin
                BufferBitMap := CreateCompatibleBitmap(DC, ClientWidth, ClientHeight);
                // Assign to cache if need
                if FIsCachedBuffer then
                  CacheBitmap := BufferBitMap;
              end
              else
                BufferBitMap := CacheBitmap;
    
              // Assign region for minimal overdraw
              Region := CreateRectRgnIndirect(UpdateRect);//0, 0, UpdateRect.Width, UpdateRect.Height);
              SelectClipRgn(BufferDC, Region);
            end
            else
              // Create buffer
              BufferBitMap := CreateCompatibleBitmap(DC, RectWidth(UpdateRect), RectHeight(UpdateRect));
            // Select buffer bitmap
            SelectObject(BufferDC, BufferBitMap);
            // [change coord], if need
            // Moving update region to the (0,0) point
            if not(FIsCachedBuffer or FIsFullSizeBuffer) then
            begin
              GetViewportOrgEx(BufferDC, SaveViewport);
              SetViewportOrgEx(BufferDC, -UpdateRect.Left + SaveViewport.X, -UpdateRect.Top + SaveViewport.Y, nil);
            end;
          end
          else
            BufferDC := DC;
        end
        else
          BufferDC := DC;
    //.......

    https://habrahabr.ru/post/318876/

    Запостил: gost, 06 Января 2017

    Комментарии (19) RSS

    • В VCL, в отличие от MFC, контрол после изменения данных сразу же перерисовывается. Однако, я никогда не сталкивался с проблемой мерцания.
      @DoubleBuffered
      Рисование происходит на виртуальной канве, затем вызывается BitBlt и переносит рисунок на оригинальный контекст. Вообще-то, запрет перерисовки делается отправкой контролу сообщения WM_SETREDRAW либо вызовом обертки(методы BeginUpdate/EndUpdate в классах TListItems, TStrings...).
      Ответить
      • [автор кода выше]
        WM_SETREDRAW - не панацея, http://www.transl-gunsmoker.ru/2011/02/unfortunate-effect-of-wmsetredraw.html
        Предлагаю запустить пример "\Samples\BufferedChildrens" и посмотреть о какой проблеме мерцания речь.
        Ответить
        • Кстати, как Вы на ГК вышли? Куски статьи гуглили? Кто-то из товарищей тут сидит?
          Ответить
          • Всегда интересуюсь откуда на мои статьи переходы идут.
            Ответить
            • > переходы
              Похоже кто-то с премиум-аккаунтом перешел.
              Ответить
              • Дельфистам платят так много денег, что чувак заработал себе на премиум-аккаунт.
                Когда я выросту, я тоже буду дельфистом
                Ответить
                • А что даёт премиум (а то у меня и обычного нету)?
                  Ответить
                  • Говорят, что можно видеть карму и появляются скрытые разделы *Mail.ru* и *1C*, где выкладывается проприетарный код этих контор.
                    Ответить
                    • А на ГК раздел 1С есть даже в открытом доступе.
                      Ответить
                      • [img]раптор-философ.jpg[/img]

                        А что, если ГК и есть премиум-версия Хабра?
                        Ответить
        • > [автор кода выше]
          > make delphi great again
          я смотрю, тебя уже вдоволь накормили на хабре
          хорошо, что ты пришел по адресу
          добро пожаловать, друг
          Ответить
          • я сюда иногда сам захожу ;) Оцениваю состояние жизни в delphi сообщества по количеству постов в /Pascal/
            Ответить
          • make: *** No rule to make target `delphi'.  Stop.
            Ответить
      • какая вообще есть причина рисовать прямо на экране?

        Блин, я в свопливом турбопаскль-детстве писовал в памяти, а потом сливал ее в память видеокарты
        Рисовал бы на другой странице, будь она у 13h.

        Даблбуфр это же самый главный паттерн этих ваших гуев
        Ответить
        • > причина
          Во времена 3.1 таки память и такты экономили. А потом так и осталось.

          З.Ы. А виста и выше сами не даблбуферят всё подряд случаем, когда аэро включено?
          Ответить
          • Да, но есть нюанс

            http://stackoverflow.com/questions/1840516/is-double-buffering-required-with-desktop-composition-enabled
            Ответить
            • Потеребил твоей маме клитор, проверь.
              Ответить
              • Пощупал, клитор холодный и вялый, так что пиздишь.
                Ответить
        • Борманд, неужели ты опустился до сидения под багором?
          Ответить

    Добавить комментарий