【问题标题】:C++/WinAPI GDI+ double buffering [duplicate]C++/WinAPI GDI+ 双缓冲 [重复]
【发布时间】:2013-07-15 21:48:32
【问题描述】:

大家好,我遇到了双缓冲问题。 我不知道为什么,但我的文本没有绘制(没有双缓冲文本正在绘制)。

代码如下:

m_hDC = BeginPaint(m_hWnd, &m_ps);

m_graphics = new Graphics(m_hDC);
memDC = CreateCompatibleDC(m_hDC);
pMemGraphics = new Graphics(memDC);

pMemGraphics->DrawString(L"Hello world!", -1, font, PointF(100, 100), &brush);

BitBlt(m_hDC, 0, 0, 500, 200, memDC, 0, 0, SRCCOPY);
EndPaint(m_hWnd, &m_ps);

delete(pMemGraphics);
delete(m_graphics);

怎么了?

【问题讨论】:

  • 那些news 和deletes 看起来非常不必要。还可以尝试从m_hDC 中选择CreateCompatibleBitmapmemDC

标签: c++ winapi double gdi+ buffering


【解决方案1】:

CreateCompatibleDC 不会创建您可以在其上绘图的画布。您必须创建一个位图并将其分配给上下文。

试试这个:

m_hDC = BeginPaint(m_hWnd, &m_ps);

memDC = CreateCompatibleDC(m_hDC);
HBITMAP hBM = CreateCompatibleBitmap(m_hDC, 500, 200);
SelectObject(memDC, hBM);   
// Now you can draw on memDC

// Fill with white color
RECT r;
SetRect(&r, 0, 0, 500, 200);
FillRect(memDC, &r, GetStockObject(WHITE_BRUSH));

// Draw text
::TextOut(memDC, 100, 100, "Hello world!", 12);

// Paint on window
BitBlt(m_hDC, 0, 0, 500, 200, memDC, 0, 0, SRCCOPY);

DeleteObject(hBM);
DeleteDC(memDC);

EndPaint(m_hWnd, &m_ps);

【讨论】:

  • 它只是在绘制黑色矩形...
  • CreateCompatibleBitmap(memDC ...,参数必须是m_hDC的错误。我不知道什么是类Graphics,所以我使用TextOut绘制文本。
  • 使用 GDI+,我在 SelectObject(memDC, hBM); 之后设置了 Graphics graphics(memDC);,它可以完美运行!
【解决方案2】:

这与 GDI+ 无关。见cmets@http://www.cplusplus.com/forum/windows/35484/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2013-08-14
    • 2013-05-07
    • 2011-08-23
    • 2015-05-01
    • 1970-01-01
    相关资源
    最近更新 更多