CreateCompatibleDC() 是否需要在一台显示器上处理窗口?

use*_*562 5 c winapi gdi bitmap

此示例代码手动读取位图文件,使用CreateDIBSection()GDI 为其分配内存,并创建 hbitmap 句柄。然后它使用 MemoryDC 将位图绘制到窗口 DC:

\n\n

ftp://ftp.oreilly.com/examples/9781572319950/cd_contents/Chap15/DibSect/DibSect.c

\n\n
hdc = BeginPaint (hwnd, &ps) ;\n...\nhdcMem = CreateCompatibleDC (hdc) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

为什么我们不能用GetDC()withNULL或 withhwndDesktop来代替?为什么我们不能缓存设备上下文而不是重复创建它?

\n\n

如果机器只有一个显示设备并且我们只在窗口上绘图,为什么我们需要不断协调位图和设备上下文?一旦像素数据被复制到 GDI 提供的缓冲区,当 HBITMAP 加载到 DC 并绘制时,GDI 是否会更新它?如果用户也想使用,是否需要同步访问?(先打电话GDIFlush()?)

\n\n

当大多数对象属性都是不透明和抽象的时,很难弄清楚这一点。我读过几乎所有相关的MSDN,很多Petzold的书,以及一些文章:

\n\n

显示设备上下文

\n\n

创建兼容DC()

\n\n

创建DIBSection()

\n\n

内存设备上下文

\n\n

Win32 内存 DC 指南

\n\n

WIN32 Paint 中间体指南

\n\n

Windows\xc2\xae 编程,第五版

\n\n

编辑:

\n\n

我想我的问题可以归结为:

\n\n

设备上下文是显示类型还是能够显示的图形数据实例。计算机通常只有少数几个显示器,但它可以显示数百个内容。

\n

And*_*ers 3

GetDC(NULL)是屏幕 HDC,屏幕是共享资源,因此您应该只在此 HDC 上执行读取/查询操作。由于DWM,在 Vista 及更高版本上写入此 HDC 并不是一个好主意。

由于一张HDC只能包含一张位图、一支画笔和一支笔,Windows/应用程序显然需要图形引擎提供的不止一张HDC。

您可以依靠CreateCompatibleDC相对便宜的操作,并且我相信 Windows 拥有可以分发的 DC 缓存。如果您正在创建游戏/动画类型的应用程序,您可能希望自己缓存其中一些图形对象,但普通应用程序不应该这样做。

GDIFlush除非您在多个线程之间共享 GDI 对象,否则通常不会调用。SetDIBits如果您想混合原始像素字节访问和 GDI,则可以使用。

我不太明白“一次屏幕”的说法,Windows 自 Windows 98 以来就支持多个显示器,并且您无法采取太多措施来阻止用户连接另一个显示器。