Мерцание при перерисовке.

Тема в разделе "WASM.WIN32", создана пользователем n0name, 25 авг 2006.

  1. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Делаю свой контрол, похожий на RichEdit.
    При вертикальном скроллинге текст мерцает.
    Однако на в Edit'e, ни в RichEdit'e такого не наблюдается.
     
  2. CnCVK

    CnCVK New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    108
    А как ты переирисовываешь? WM_PAINT?
    Я тут недавно обнаружил что
    Код (Text):
    1. ValidateRect(hWnd, NULL);
    2. hDC = GetDC(hWnd);
    3. ...
    4. ReleaseDC(hWnd, hDC);
    работает быстрее чем BeginPaint и EndPaint:)
    А ты используешь ScrollWindow, ScrollDC и другие?
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Обрабатываю WM_PAINT.
    ScrollWindow, ScrollDC не использую. Зачем?
    Я в обработчике WM_PAINT вывожу только видимые строки. В структуре связанной с классом у меня есть поле YOffset, оно задает номер строки с которой выводить текст. И в WM_VSCROLL я изменяю это поле.
     
  4. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    0. Регистрируя класс окна поставить NULL для hbrBackground
    1. На WM_ERASEBKGND ответить "return TRUE"
    2. Рисовать все строки в памяти, а затем BitBlt() на HDC из BeginPaint().
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    0, 1. Сделано.
    2. Рисовать в память? Эт как? Я использую DrawText.
     
  6. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Скачай LinePad отсюда: www.codexxi.com
    Смотри как сделан WM_PAINT код.
     
  7. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    CnCVK
    Конечно, если не задавать клиппинг валидного региона, то dc получается немного быстрее, но мерцать от этого меньше не будет. Клиппинг - штука полезная (если использовать правильно) и зря Вы от неё отказываетесь.

    n0name
    Рисовать не прямо в dc, который вернул BeginPaint/GetDC, а сначала в compatible dc. Когда всё уже будет отрисовано в этот совместимый dc в памяти, вызывать BitBlt на экранный dc. См. в msdn секцию painting and drawing.
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Ок. Попробую.
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    2Quantom: спасибо, заработало.
    2AsmGuru62: тоже спасибо, сорцы LinePada помогли.