在 OnDraw()-Method 中,我创建了一个位图,并在每次窗口大小更改时将其 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() 中重新创建位图时,屏幕都会变白,直到它将位图 blits 到屏幕上。我如何使用 WM_ERASEBKGND-Message 来避免这种闪烁?
最佳答案
我不知道 MFC,但对于 native Windows API,您必须处理 WM_ERASEBKGND
消息并简单地 return TRUE;
。这告诉默认窗口过程消息已被处理,因此窗口背景被删除。结果,闪烁消失了。
此外,如果您正在使用函数 InvalidateRect(..)
,请务必将参数 bErase
设置为 FALSE
。请注意,如果未明确给出,则该参数默认为 TRUE。
关于C++:在 MFC 应用程序中使用 WM_ERASEBKGND 消息避免闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26681318/