c - CreateCompatibleDC() 是否有必要在一个显示器上使用窗口?

标签 c winapi bitmap gdi

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

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

hdc = BeginPaint (hwnd, &ps) ;
...
hdcMem = CreateCompatibleDC (hdc) ;

为什么我们不能将 GetDC()NULLhwndDesktop 一起使用?为什么我们不能缓存设备上下文而不是重复创建它?

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

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

Display Device Contexts

CreateCompatibleDC()

CreateDIBSection()

Memory Device Contexts

Guide to Win32 Memory DC

Guide to WIN32 Paint for Intermediates

Programming Windows®, Fifth Edition

编辑:

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

设备上下文是一种显示类型还是能够显示的图形数据实例。一台计算机通常只有少数几个显示器,但它可能有数百个东西要显示在它们上面。

最佳答案

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

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

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

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

我真的不明白 once screen 的说法,自 Windows 98 以来,Windows 就支持多台显示器,您无法阻止用户连接另一台显示器。

关于c - CreateCompatibleDC() 是否有必要在一个显示器上使用窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56314906/

相关文章:

c++ - 在 C++ 中启动 html 文件

c++ - 在 if() 中比较 LPCWSTR

c++ - 读取大小不是 8 的倍数的位图会导致像素移位(和换行)

错误计算行数和运算符的 C 程序

c - 为什么 int 可以容纳 10 位数字,但不能容纳另一个整数的 9 位数字?

c - 如何从 Swift 调用 dispatch_benchmark

c - 重新编码 Toupper 函数

c++ - opencv 桌面捕获在大字体模式下仅返回 Windows 上的部分屏幕

android - 用于 Sprite 的 RGB565?

c++ - 将位图设置为 CStatic 对象