c - 处理 WM_PAINT

标签 c winapi 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 cache ),这可能在短期内有效,但最终会在最不方便的时候停止工作。或者,当您没有 DC 时,您可能会想使用 DC 指针,并且会在其他内容上乱写乱画(或者由于 GDI 对象线程关联而无法这样做)。

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

CreateCompatibleDC() 创建与 hdc 兼容的内存 DC。绘制到compatDC不足以绘制到hdc;绘制到compatDC后,需要绘制回hdc。对于您的情况,您需要进行两次 BitBlt() 调用;第二个将从 compatDC 传输回 hdcSee this sample code for details.

当您将位图选择到 DC 中时,您无法DeleteObject() 位图。您的 SelectObject(compatDC, oldBitmap) 调用需要 DeleteObject(compatBitmap) 之前进行。 (这就是 i486 试图在他的回答中表达的意思。)

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

关于c - 处理 WM_PAINT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27502290/

相关文章:

c - 强制静态函数内联有什么缺点吗?

winapi - Win32 消息队列有多深?

c++ - 是什么导致 WS_TABSTOP 影响窗口绘制顺序?

c++ - 在 Windows7 中从安全屏幕 (Ctrl+Alt+Del) 返回时未收到 WM_PAINT 消息

c - 警告 : passing argument 1 of ‘fscanf’ discards ‘const’ qualifier from pointer target type

c - 读取文件夹中的所有 .txt 文件?

c - 通过索引访问结构

python-3.x - (WinApi) ChangeDisplaySettingsEx 不起作用

c++ - 使用 C++ Hook GetTickCount

c++ - 在 Win32 上,我可以在一段时间内禁用窗口绘制吗?