【问题标题】:C++ win32 api double-buffering example help pleaseC++ win32 api双缓冲示例请帮忙
【发布时间】:2013-08-26 22:47:07
【问题描述】:

所以,我知道人们在不同的帖子上谈论双缓冲,但每当我尝试它时,都会出现黑屏!这是因为我看到的示例(我需要示例)不像我那样编程 - 就像使用不同的库一样。我现在只用。无论如何,这是严重闪烁的初始程序片段:

void drawRed (HDC hdc)
{
  HDC hdcMemory;
  hdcMemory = CreateCompatibleDC(hdc);

  while (1==1){

  SelectObject(hdcMemory, redmask);
  BitBlt(hdc, 132, 132, 128, 128, hdcMemory, 0, 0, SRCAND);

  SelectObject(hdcMemory, red);
  BitBlt(hdc, 132, 132, 128, 128, hdcMemory, 0, 0, SRCPAINT);
  }

  DeleteDC(hdcMemory);
}

我查看并尝试了这个:

void drawRed (HDC hdc)
{
 HDC hDC = GetDC(hnd);

 HDC hdcMemory;
 hdcMemory = CreateCompatibleDC(hdc);

 HDC memDC = CreateCompatibleDC(hDC);
 HBITMAP hMemBmp = CreateCompatibleBitmap(hDC,100,100);
 HBITMAP hOldBmp =  (HBITMAP)SelectObject(memDC,hMemBmp);

 SelectObject(hdcMemory, hbmMem);
 BitBlt(hDC, -100, -100, 128, 128, memDC, 0, 0, SRCAND);

 SelectObject(hdcMemory, red);
 BitBlt(hDC, -100, -100, 128, 128, memDC, 0, 0, SRCPAINT);

 SelectObject(hdcMemory, red);
 BitBlt(hDC, 132, 132, 128, 128, memDC, 0, 0, SRCCOPY);

 DeleteDC(hdcMemory);
}

这只是显示一个黑盒子。我不知道我应该怎么做,所以你能把原来的代码块改成双缓冲吗?谢谢!

我用的是 dev-c++ ide。

【问题讨论】:

  • 您的内存 DC 过多 您将对象(位图等)选择到 hdcMemory,但正在使用 memDC 进行 BitBlt'ing。选择一个,失去另一个。我认为您正在尝试故意创建两个,但在这种情况下,您的 hDC 不应该被使用,直到痛苦结束。 (并且您需要设置两个兼容的位图;不是一个)。

标签: c++ winapi double-buffering


【解决方案1】:

对于 MFC,您可以使用 Keith Rule 的 CMemDC 类。有一篇关于这个类的好文章和例子 - http://www.codeproject.com/Articles/33/Flicker-Free-Drawing-In-MFC

MFC 功能包中包含的类似类 - http://msdn.microsoft.com/en-us/library/cc308997.aspx

【讨论】:

    猜你喜欢
    • 2012-12-18
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 2011-03-05
    • 2011-10-16
    • 2021-04-28
    • 2012-02-11
    • 2013-08-21
    相关资源
    最近更新 更多