Win32API)我为什么要一次又一次地使用GetDC和ReleaseDC?

时间:2016-09-04 10:53:25

标签: winapi device-context

我看到的每个示例代码都是GetDC和releaseDC一次又一次。 (或BeginPaint / EndPaint) 但我认为绘图屏幕经常发生(特别是在游戏中),将它们存储在内存中会更好,然后一直得到释放。

所以我确实喜欢将mainDC保持为全局并且只使用它,只在程序结束时才释放它。但为什么人们不喜欢这样呢? (也许获得/释放DC费用很少?)

case WM_CREATE:
    hdc = GetDC(hWnd); //hdc is declared as global HDC
    MyBitmap = LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_BITMAP1));
    return 0;
case WM_PAINT:
    MemDC = CreateCompatibleDC(hdc);
    OldBitmap = (HBITMAP)SelectObject(MemDC, MyBitmap);
    BitBlt(hdc, 0, 0, 300, 300, MemDC, 0, 0, SRCCOPY);
    SelectObject(MemDC, OldBitmap);
    DeleteDC(MemDC);
    return 0;

2 个答案:

答案 0 :(得分:0)

您在此处提供的代码是错误的。首先,您需要阅读更多文档。这是一个有用的链接:Painting and Drawing。基本上有两种方法可以更新窗口:

  • 响应WM_PAINT消息。使用BeginPaint()/ EndPaint()函数正确绘制客户区域。当客户区的一部分被“无效”时(由于调整大小,从最小化状态恢复,移动先前模糊它的窗口或以编程方式使其无效,系统发送此消息.WM_PAINT是低优先级消息,在消息队列变空之前收到。
  • 专门绘制部分或整个客户区域,而不会在其上放置无效区域。为此使用GetDC()/ ReleaseDC()。如果要在应用程序(CPU)忙碌时立即显示更改,则非常有用。

编写一些代码来处理WM_PAINT消息通常几乎是强制性的,而具体绘图也是可选的,具体取决于应用程序的要求。

永远不要自己发送或发布WM_PAINT消息,而是使部分或整个客户区无效 - 应用程序将在空闲之前收到WM_PAINT消息。如果要立即进行绘制,请调用UpdateWindow() - 这会绕过消息队列。

答案 1 :(得分:0)

Windows 10中最近的(2016年8月)安全更新阻止了打印机设备上下文的重用。打印一个文档后,Windows 10将拒绝使用相同的DC再次打印。为每个文档创建一个新的DC一直是一种优选的做法,但现在它似乎是Windows 10中的一项要求。