Добрый день.
Использую ListView, и для того чтобы не мерцало использую самописную двойную буферизацию (пример нашел на rsdn):
LRESULT CListViewWTL::OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
if (!m_bRun)
return DefWindowProc(WM_PAINT,wParam,lParam);
if(!double_buffered) return DefWindowProc(WM_PAINT,wParam,lParam);
WTL::CPaintDC pdc(this->m_hWnd);
CRect crc;
GetClientRect(&crc);
//для тех кто не знает колонки — это отдельное окно
//и рисуется оно само по себе, хотя и на том же HDC что и CListCtrl
//Отодвигаем клиентскую область чтобы не зарисовывать постоянно колонки
WTL::CHeaderCtrl hdr=GetHeader();
if(hdr&&hdr.IsWindowVisible())
{
CRect hrc;
hdr.GetWindowRect(&hrc);
crc.top=hrc.Height();
}
//CListCtrl очень продвинутый в плане отрисовки
//любит перересовываться по отлеьным строчкам
//только о том что WM_ERASEBKGND ничего не делает он не знает
//Поэтому устанавливает полный регион для отрисовки медленнее зато надёжнее
WTL::CRgn rgn;
rgn.CreateRectRgn(crc.left,crc.top,crc.right,crc.bottom);
pdc.SelectClipRgn(rgn);
WTL::CMemoryDC dcMem(pdc, crc);
dcMem.FillRect(crc,m_BrushBackground);
//Проблема теперь только в том как заставить CListCtrl рисовать по нашему CMemDC
//К счастию все стандартные контролы поддерживают WM_PRINTCLIENT
//К сожалению мне не удалось отриовать колонки с помощью этого сообщения
//Изврат выше с отодвиганием клиентской области введён именно поэтому
//DefWindowProc(WM_ERASEBKGND,WPARAM(dcMem.m_hDC),0);
//DefWindowProc(WM_ERASEBKGND,(WPARAM)dcMem.m_hDC,0);
SendMessage(WM_PRINTCLIENT,(WPARAM)dcMem.m_hDC,PRF_CLIENT);
return 0;
}
Но BoundsChecker выдает постоянно:
DeleteDC usage error. Device Context still contains objects.
Где грабли?
Здравствуйте, Mr., Вы писали:
Mr.>Ой, в теме перепутал не Resourse Leak а Resource Error
Re: [ANN] WTL 7.5.5249.0Автор: BuHHunyx
Дата: 07.09.05
> atlframe.h: CDoubleBufferImpl — Provides double-buffer painting support to any window
Почему бы не использовать то, что уже есть.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, BuHHunyx, Вы писали:
BHH>Здравствуйте, Mr., Вы писали:
Mr.>>Ой, в теме перепутал не Resourse Leak а Resource Error
BHH>Re: [ANN] WTL 7.5.5249.0Автор: BuHHunyx
Дата: 07.09.05
Пользую
WTL version 8.0
>> atlframe.h: CDoubleBufferImpl — Provides double-buffer painting support to any window
BHH>Почему бы не использовать то, что уже есть.
Сейчас попробую.
Так с тем кодом все в порядке?
Здравствуйте, Mr., Вы писали:
Mr.>Но BoundsChecker выдает постоянно:
Mr.>Mr.>DeleteDC usage error. Device Context still contains objects.
Mr.>Где грабли?
Для уверенности можно выбрать в контекст все стоковые объекты.
Если начнешь "терять" свои созданные объекты — смотри в коде, WTL в этом отношении чист
ИМХО не самый лучший способ избавляться от мерцания, т.к. очень смахивает на хак. Все стандартные виндовые контролы предоставляют документированную возможность окну-родителю произвольно порисовать на себе посредством посылки ему сообщения NM_CUSTOMDRAW либо WM_DRAWITEM. Естественно тебе не обязательно выполнять отрисовку в классе родительского окна, просто зарефлекть нужное сообщение обратно контролу и в нём уже рисуй сколько влезет. Использование WTL::MemoryDC приветствуется. Наглядный пример с ListCtrl
здесь.
Здравствуйте, DmitryCPP, Вы писали:
DCP>ИМХО не самый лучший способ избавляться от мерцания, т.к. очень смахивает на хак. Все стандартные виндовые контролы предоставляют документированную возможность окну-родителю произвольно порисовать на себе посредством посылки ему сообщения NM_CUSTOMDRAW либо WM_DRAWITEM. Естественно тебе не обязательно выполнять отрисовку в классе родительского окна, просто зарефлекть нужное сообщение обратно контролу и в нём уже рисуй сколько влезет. Использование WTL::MemoryDC приветствуется. Наглядный пример с ListCtrl здесь.
Что-то он у меня сетку грида не рисует
Здравствуйте, DmitryCPP, Вы писали:
DCP>ИМХО не самый лучший способ избавляться от мерцания, т.к. очень смахивает на хак. Все стандартные виндовые контролы предоставляют документированную возможность окну-родителю произвольно порисовать на себе посредством посылки ему сообщения NM_CUSTOMDRAW либо WM_DRAWITEM. Естественно тебе не обязательно выполнять отрисовку в классе родительского окна, просто зарефлекть нужное сообщение обратно контролу и в нём уже рисуй сколько влезет. Использование WTL::MemoryDC приветствуется. Наглядный пример с ListCtrl здесь.
+ У меня грид с чекбоксами и они не рисуются
Здравствуйте, Mr., Вы писали:
Mr.>Здравствуйте, DmitryCPP, Вы писали:
DCP>>ИМХО не самый лучший способ избавляться от мерцания, т.к. очень смахивает на хак. Все стандартные виндовые контролы предоставляют документированную возможность окну-родителю произвольно порисовать на себе посредством посылки ему сообщения NM_CUSTOMDRAW либо WM_DRAWITEM. Естественно тебе не обязательно выполнять отрисовку в классе родительского окна, просто зарефлекть нужное сообщение обратно контролу и в нём уже рисуй сколько влезет. Использование WTL::MemoryDC приветствуется. Наглядный пример с ListCtrl здесь.
Mr.>Что-то он у меня сетку грида не рисует
Этот пример по owner-draw, то есть там всё ручками рисовать надо включая сетку.