【问题标题】:Win32 Double Buffering drawing black backgroundWin32双缓冲绘制黑色背景
【发布时间】:2012-02-11 02:55:22
【问题描述】:

用 c++ 在 win32 中做一个项目,试图双缓冲正在绘制的图像,但我得到一个黑屏,上面绘制了正确的位图。这也导致了我的 WM_MOUSEMOVE 条件,它将位图与光标一起拖动以不绘制位图。绘制代码如下:在WM_PAINT下的wndproc中调用paint(),scroll是滚动条的位置,目前未使用。

int paint(HWND hWnd, HINSTANCE hInst, RECT clientRect, std::vector<Measure> *measures, int scroll)
{
int x = 90;
hdc = BeginPaint(hWnd, &ps);
hdcmem = CreateCompatibleDC(hdc);
HBITMAP hbmScreen = CreateCompatibleBitmap(hdc, clientRect.right, clientRect.bottom);
SelectObject(hdcmem,hbmScreen); 
/*these functions just create the bitmaps into hdcmem*/
drawStaff(hWnd, hInst, clientRect, x, 0);
drawKey(hWnd, hInst, clientRect, x, (*measures)[0], 0);
drawTime(hWnd, hInst, clientRect, x, (*measures)[0], 0);
drawNotes(hWnd, hInst, clientRect, measures, x);
    BitBlt(hdc, 0, 0, clientRect.right, clientRect.bottom, hdcmem, 0, 0, SRCCOPY);
ReleaseDC(hWnd, hdcmem);
return 0;
}

【问题讨论】:

  • 您不应该在每次绘制时重新制作后缓冲区,只需在 WM_CREATE(和 WM_SIZE)上制作一次,然后使用 SetWindowLongPtr(GWLP_USERDATA) 将其附加到 HWND
  • 您有资源泄漏 - 您忘记在从该函数返回之前调用 hdcmem 上的 DeleteObject。
  • 您也未能调用 EndPaint。

标签: c++ winapi bitblt double-buffering


【解决方案1】:

在绘制其他图形之前,您需要先用背景颜色填充位图。如果我没记错的话,位图在创建时默认填充为黑色。

【讨论】:

  • 我尝试在将对象选择到 hdcmem 后添加以下代码: SetBkColor(hdcmem, COLORREF RGB(0, 0, 0));相信是白色的,但我也尝试了 255 而不是 0,然后是其他各种数字,但都没有改变我得到的图像。这是您通过更改位图的背景的意思,还是与更改位图控件的背景不同?
  • 你实际上必须用你想要的颜色填充,比如FillRectSetBkColor 设置文本的背景颜色,但您似乎没有绘制任何文本,因此调用无效。
  • @AaronK - RGB(0,0,0) 是纯黑色,而不是白色!
猜你喜欢
  • 2015-05-01
  • 2012-12-18
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 2014-01-30
  • 2011-07-14
相关资源
最近更新 更多