0

我在互联网上阅读了很多例子,但我仍然卡住了。我正在尝试处理发送到我的应用程序的 WM_PAINT 消息。

在我的应用程序中,我总是在同一个 DC 中绘制,名为g_hDC. 它完美地工作。收到WM_PAINT时,我只是尝试将 my 的内容绘制g_hDC到由BeginPaint. 我猜g_hDC包含我绘制的最后一个位图。所以我只想恢复它。

case WM_PAINT:
 PAINTSTRUCT ps;

 int ret;
 HDC compatDC;
 HDC currentDC;
 HDC paintDC;
 HBITMAP compatBitmap;
 HGDIOBJ oldBitmap;

 paintDC   = BeginPaint(g_hWnd, &ps);

 currentDC = GetDC(g_hWnd);
 compatDC  = CreateCompatibleDC(paintDC);
 compatBitmap=CreateCompatibleBitmap(paintDC, CONFIG_WINDOW_WIDTH, CONFIG_WINDOW_HEIGHT);
 oldBitmap=SelectObject(compatDC, compatBitmap);

 ret = BitBlt(compatDC,
              ps.rcPaint.left,
              ps.rcPaint.top,
              ps.rcPaint.right - ps.rcPaint.left,
              ps.rcPaint.bottom - ps.rcPaint.top,
              currentDC,
              ps.rcPaint.left,
              ps.rcPaint.top,
              SRCCOPY);

 ret = BitBlt(paintDC,
              ps.rcPaint.left,
              ps.rcPaint.top,
              ps.rcPaint.right - ps.rcPaint.left,
              ps.rcPaint.bottom - ps.rcPaint.top,
              compatDC,
              ps.rcPaint.left,
              ps.rcPaint.top,
              SRCCOPY);

  DeleteObject(SelectObject(compatDC, oldBitmap));
  DeleteDC(compatDC);
 DeleteDC(currentDC);

 EndPaint(g_hWnd, &ps);

休息;

但它只是画了一个白色的矩形......我尝试了很多可能性,但没有任何效果。你能帮我么?

4

2 回答 2

1

你做错了很多事情。

首先,您的保存g_hDC依赖于实现细节:您注意到指针是相同的,因此保存了指针。由于与 GDI 部分优化相关的各种原因(例如,有DC 缓存),这可能在短期内起作用,但最终会在最不方便的时候停止工作。或者,当您没有 DC 时,您可能很想使用 DC 指针,并且会在其他东西上乱涂乱画(或者由于 GDI 对象线程关联而无法这样做)。

访问其外部窗口 DC 的正确方法WM_PAINT是调用GetDC(hwnd).

CreateCompatibleDC()创建一个与 . 兼容的内存中 DC hdc。绘制到compatDC不足以绘制到hdchdc画到后需要画回compatDC。对于您的情况,您需要打两个BitBlt()电话;第二个将从 on 回compatDC退hdc有关详细信息,请参阅此示例代码。

DeleteObject()当您将位图选择到 DC 中时,您不能使用位图。您的SelectObject(compatDC, oldBitmap)电话需要先 DeleteObject(compatBitmap)。(这就是 i486 在他的回答中试图表达的意思。)

(我确信这个答案在某些地方具有误导性或不完整;如果是,请告诉我。)

于 2014-12-16T13:06:57.090 回答
0

使用它来删除位图:DeleteObject( SelectObject(compatDC,oldBitmap) );- 在上一行没有 DeleteBitmap。SelectObject返回当前(旧)选择作为返回值 - 然后将其删除。在您的情况下,您正在尝试删除仍然选择的位图。

PS:我看不到CreateCompatibleDC- 你在哪里创建 compatDC?compatDC = CreateCompatibleDC( hdc );之前添加CreateCompatibleBitmap

于 2014-12-16T10:26:18.513 回答