в методе OnDraw () — я создаю растровое изображение и добавляю его на выход каждый раз, когда изменяется размер окна:
void CmbmView::OnDraw(CDC* pDC)
{
CRect WindowSize;
HDC hdc;
BITMAPINFO pbmi;
HBITMAP hbm;
CBitmap *pBitmap;
CDC MemDC;
void* ppvBits;
GetClientRect(WindowSize);
hdc = CreateDC (TEXT ("DISPLAY"), NULL, NULL, NULL) ;
memset(&pbmi, 0, sizeof(BITMAPINFO));
pbmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi.bmiHeader.biWidth = WindowSize.Width();
pbmi.bmiHeader.biHeight = -WindowSize.Height(); // top down
pbmi.bmiHeader.biPlanes = 1;
pbmi.bmiHeader.biBitCount = 32;
pbmi.bmiHeader.biCompression = BI_RGB;
hbm = CreateDIBSection(hdc, &pbmi, DIB_RGB_COLORS, &ppvBits, NULL, NULL);
pBitmap = CBitmap::FromHandle(hbm);
MemDC.CreateCompatibleDC(pDC);
MemDC.SelectObject(pBitmap);
// "Draw" into ppvBits
GetDocument()->DrawApple(pDC, ppvBits, WindowSize.Width(), WindowSize.Height(), m_MaxIter, m_MaxBetragQuadrat, m_BW);
// Blit it to the output
pDC->BitBlt(0, 0, WindowSize.Width(), WindowSize.Height(), &MemDC, 0, 0, SRCCOPY);
}
Но каждый раз, когда приложению необходимо воссоздать растровое изображение в OnDraw (), экран становится белым, пока не перетянет растровое изображение на экран. Как я могу использовать WM_ERASEBKGND-сообщение, чтобы избежать этого мерцания?
Я не знаю, с MFC, но с родным Windows API вы должны обрабатывать WM_ERASEBKGND
сообщение и просто return TRUE;
, Это говорит оконной процедуре по умолчанию, что сообщение обрабатывается, поэтому фон окна стирается. В результате мерцание исчезает.
Кроме того, если вы используете функцию InvalidateRect(..)
обязательно установите параметр bErase
в FALSE
, Обратите внимание, что параметр TRUE по умолчанию, если не указано явно.
В приложении, где рендеринг содержимого окна занимал нетривиальное время, я предпринял следующие шаги:
Важным преимуществом является не только то, что у вас нет мерцания, но и то, что приложение остается отзывчивым, пока поток в нем занят преобразованием данных в графику. В реализации, помимо обычных проблем многопоточности, есть несколько важных вещей: