C语言 Processing WM_PAINT



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

在我的应用程序中,我总是绘制相同的 DC,名为 g_hDC 。它工作得很好。收到WM_PAINT后,我只是尝试将g_hDC的内容绘制到BeginPaint返回的DC中。我想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);

破;

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

你做错了很多事情。

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

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

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

在将

位图选择到 DC 中时,不能DeleteObject()位图。您的SelectObject(compatDC, oldBitmap)电话需要在DeleteObject(compatBitmap)之前进行。(这就是i486在他的答案中试图得到的。

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

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

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

相关内容

  • 没有找到相关文章