#1 05.06.06 12:41
[Снова MFC] Двойная Буферизация
SDI приложение, в функции onDraw создаю виртуальный контекст, потом по его данным отрисовываю рабочую облась, но при этом "Мерцание" не исчезает. Что делать?
Как вариант, причина мерцания - очиска экрана при обновлении, а потом непосредственно отрисовка. Но тут такой вопрос - как запретить очистку фона??
Offline
#3 05.06.06 12:52
Re: [Снова MFC] Двойная Буферизация
Код: с:
void CBaseProjView::OnDraw(CDC* pDC)
{
CBaseProjDoc* pDoc = GetDocument();
CDC MemDC;
CBitmap MemBit;
CRect Rect;
GetClientRect(&Rect);
MemDC.CreateCompatibleDC(pDC); // ñîçäàåì äåñêðèïòîð
MemBit.CreateCompatibleBitmap(pDC,Rect.right,Rect.bottom);
MemDC.SelectObject(&MemBit);
MemDC.Rectangle(Rect);
/*
*Рисую в MemDC
*/
pDC->BitBlt(0,0,Rect.right,Rect.bottom,&MemDC,0,0,SRCCOPY);
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}Исправлено _|ex (05.06.06 12:53)
Offline
#5 05.06.06 13:05
Re: [Снова MFC] Двойная Буферизация
Не, всмысле какие еще в этом окне сообщения обрабатываешь.
И еще вопрос - зачем каждый раз создавать новый контекст и битмап в OnDraw, а потом рисовать в него? Это же тоже ест время.
По моему логичней MemDC и MemBit вынести в переменные твоего класса окна, инициализацию которым сделать в начали по WM_CREATE. (CreateCompatibleDC, CreateCompatibleBitmap, SelectObject)
Потом, при необходимости изменить что то в окне, рисовать прямо в этот виртуальный контекст, а при событии WM_ERASEBKGND, делать просто pDC->BitBlt(0,0,Rect.right,Rect.bottom,&MemDC,0,0,SRCCOPY);
Попробуй так
Исправлено MadSlayer (05.06.06 13:06)
Offline
#7 05.06.06 13:18
Re: [Снова MFC] Двойная Буферизация
WM_ERASEBKGND - это как раз и есть сообщение по которому происходит отчистка экрана. Тоесть если в обработчике этого сообщения будешь просто делать BitBlt из виртуального контекста, то это и будет являться отчисткой по хорошему - вместо мусора нарисуеться текущее изображение окна. )
Offline

