C++:在 MFC 应用程序中使用 WM_ERASEBKGND 消息避免闪烁

标签 c++ mfc erase blit bitblit

在 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/

相关文章:

c# - 无法使用 TestStack.White 自动编辑控件和列表框

c++ - 删除使用 const_iterator 的 vector 的元素

c++ - 扩展现有 ActiveX/COM 组件的正确方法是什么?

c++ - 按钮和 ON_MESSAGE

iphone - 使用 OpenGL 混合纹理以轻轻删除 Alpha 值

c++ - 如何释放指针 vector ?

c++ - 将 QStringList 元素拆分为更多元素

c++ - 尝试使用 C++ 将着色器应用于 OpenGL 中的顶点数组的问题

c++ - C++14 标准布局类型可以将 `alignas` 用于字段吗?

c++ - 带有 std::enable_if 和 std::is_default_constructible 的 SFINAE 用于 libc++ 中的不完整类型