DoubleBuffered и Resourse Leak
От: Mr.  
Дата: 11.09.09 06:43
Оценка:
Добрый день.
Использую 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.


Где грабли?
Re: DoubleBuffered и Resourse Leak
От: Mr.  
Дата: 11.09.09 06:56
Оценка:
Ой, в теме перепутал не Resourse Leak а Resource Error
Re[2]: DoubleBuffered и Resourse Leak
От: BuHHunyx Беларусь  
Дата: 11.09.09 07:34
Оценка:
Здравствуйте, 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>>
Re[3]: DoubleBuffered и Resourse Leak
От: Mr.  
Дата: 11.09.09 07:57
Оценка:
Здравствуйте, 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>Почему бы не использовать то, что уже есть.


Сейчас попробую.

Так с тем кодом все в порядке?
Re: DoubleBuffered и Resourse Leak
От: kvasya  
Дата: 16.09.09 05:59
Оценка:
Здравствуйте, Mr., Вы писали:

Mr.>Но BoundsChecker выдает постоянно:


Mr.>

Mr.>DeleteDC usage error. Device Context still contains objects.


Mr.>Где грабли?


Для уверенности можно выбрать в контекст все стоковые объекты.
Если начнешь "терять" свои созданные объекты — смотри в коде, WTL в этом отношении чист
Re: DoubleBuffered и Resourse Leak
От: DmitryCPP  
Дата: 18.10.09 17:55
Оценка: 1 (1)
ИМХО не самый лучший способ избавляться от мерцания, т.к. очень смахивает на хак. Все стандартные виндовые контролы предоставляют документированную возможность окну-родителю произвольно порисовать на себе посредством посылки ему сообщения NM_CUSTOMDRAW либо WM_DRAWITEM. Естественно тебе не обязательно выполнять отрисовку в классе родительского окна, просто зарефлекть нужное сообщение обратно контролу и в нём уже рисуй сколько влезет. Использование WTL::MemoryDC приветствуется. Наглядный пример с ListCtrl здесь.
Здесь вы можете разместить вашу рекламу.
Re[2]: DoubleBuffered и Resourse Leak
От: Mr.  
Дата: 22.10.09 07:12
Оценка:
Здравствуйте, DmitryCPP, Вы писали:

DCP>ИМХО не самый лучший способ избавляться от мерцания, т.к. очень смахивает на хак. Все стандартные виндовые контролы предоставляют документированную возможность окну-родителю произвольно порисовать на себе посредством посылки ему сообщения NM_CUSTOMDRAW либо WM_DRAWITEM. Естественно тебе не обязательно выполнять отрисовку в классе родительского окна, просто зарефлекть нужное сообщение обратно контролу и в нём уже рисуй сколько влезет. Использование WTL::MemoryDC приветствуется. Наглядный пример с ListCtrl здесь.


Что-то он у меня сетку грида не рисует
Re[2]: DoubleBuffered и Resourse Leak
От: Mr.  
Дата: 22.10.09 07:20
Оценка:
Здравствуйте, DmitryCPP, Вы писали:

DCP>ИМХО не самый лучший способ избавляться от мерцания, т.к. очень смахивает на хак. Все стандартные виндовые контролы предоставляют документированную возможность окну-родителю произвольно порисовать на себе посредством посылки ему сообщения NM_CUSTOMDRAW либо WM_DRAWITEM. Естественно тебе не обязательно выполнять отрисовку в классе родительского окна, просто зарефлекть нужное сообщение обратно контролу и в нём уже рисуй сколько влезет. Использование WTL::MemoryDC приветствуется. Наглядный пример с ListCtrl здесь.


+ У меня грид с чекбоксами и они не рисуются
Re[3]: DoubleBuffered и Resourse Leak
От: DmitryCPP  
Дата: 22.10.09 07:27
Оценка:
Здравствуйте, Mr., Вы писали:

Mr.>Здравствуйте, DmitryCPP, Вы писали:


DCP>>ИМХО не самый лучший способ избавляться от мерцания, т.к. очень смахивает на хак. Все стандартные виндовые контролы предоставляют документированную возможность окну-родителю произвольно порисовать на себе посредством посылки ему сообщения NM_CUSTOMDRAW либо WM_DRAWITEM. Естественно тебе не обязательно выполнять отрисовку в классе родительского окна, просто зарефлекть нужное сообщение обратно контролу и в нём уже рисуй сколько влезет. Использование WTL::MemoryDC приветствуется. Наглядный пример с ListCtrl здесь.


Mr.>Что-то он у меня сетку грида не рисует


Этот пример по owner-draw, то есть там всё ручками рисовать надо включая сетку.
Здесь вы можете разместить вашу рекламу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.