- 方法我创建一个Bitmap并在每次窗口大小改变时将它blit到输出:
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-Message来避免这种闪烁?
答案 0 :(得分:2)
我不了解MFC,但使用原生Windows API,您必须处理WM_ERASEBKGND
消息,只需return TRUE;
。这告诉默认窗口过程消息被处理因此窗口背景被擦除。结果闪烁消失了。
此外,如果您正在使用功能InvalidateRect(..)
,请务必将参数bErase
设置为FALSE
。请注意,如果未明确指定,则参数默认为TRUE。
答案 1 :(得分:1)
在渲染窗口内容花费了大量时间的应用程序中,我采取了以下步骤:
重要的好处不仅在于您没有闪烁,而且应用程序在其中的线程忙于将数据渲染为图形时仍保持响应。在实现中,除了通常的多线程问题外,还有一些重要的事情: