Здравствуйте, galion, Вы писали:
G>Вывожу текст в собственный контрол-окно. При прокрутке появляется эффект мерцания. Прочитал массу статей. Попробовал отключить прорисовку фона при регистрации контрола: wc.hbrBackgroung = 0. Мерцание ушло, но при этом при прокрутке не убирается "мусор" и фон не белый, а серый. Как нужно очищать "мусор" и как сделать фон белым? При попытке заполнения фона белым через FillRectangle мерцание вновь появляется
1. Нужно определиться, где будет отрисовка. WM_ERASEBKGND и/или WM_PAINT. Если бак рисуется родителем, то WM_ERASEBKGND return TRUE; При этом надо помнить, что WM_ERASEBKGND и WM_PAINT ставятся в очередь по разным событиям, по этим событиям и характеру рисования нужно выбирать, где рисовать. Мусор был в данном случае, потому что старое рисовалось поверх нового. Если отключать WM_ERASEBKGND, то нужно самому рисовать бак, например через FillRect(...); а потом выводить свой контент.
2. Дублирующая буферизация. Это чтоб не мелькало. Создаётся CreateCompatibleDC и CreateCompatibleBitmap, в них рисуется, и потом скидывается (по пункту №1) содержимое в изначальный DC через BitBlt, в общем случае.
HDC hdc = GetDC(hWnd);
HDC cdc = CreateCompatibleDC(hdc);
HBITMAP hBmp = CreateCompatibleBitmap(hdc, cx, cy);
HBITMAP hBmpOld = (HBITMAP)SelectObject(cdc, hBmp);
//... тут рисуем в cdc
BitBlt(hdc, 0, 0, cx, cy, cdc, 0, 0, SRCCOPY);
SelectObject(cdc, hBmpOld);
DeleteObject(hBmp);
DeleteDC(cdc);
ReleaseDC(hWnd, hdc);
// cx, cy - размер окна в общем случае