【发布时间】:2019-10-12 08:53:48
【问题描述】:
此示例代码手动读取位图文件,使用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() 与NULL 或hwndDesktop 一起使用?为什么我们不能缓存设备上下文而不是重复创建它?
如果机器只有一个显示设备,而我们只在窗口上绘图,为什么我们需要不断协调位图和设备上下文?一旦像素数据被复制到 GDI 提供的缓冲区,当 HBITMAP 加载到 DC 并绘制时,GDI 是否会更新它?如果用户也想借鉴,是否有必要同步访问? (先打电话给GDIFlush()?)
当大多数对象属性都是不透明和抽象的时,很难弄清楚这一点。我已经阅读了几乎所有相关的 MSDN、很多 Petzold 的书和一些文章:
Guide to WIN32 Paint for Intermediates
Programming Windows®, Fifth Edition
编辑:
我认为我的问题归结为:
设备上下文是一种显示类型,还是一种能够显示的图形数据的实例。一台计算机通常只有几个显示器,但它可能有数百个东西要显示在上面。
【问题讨论】:
-
您可能是对的,但使用适用于 X 显示器的代码比使用适用于 1 个显示器的代码要好。
-
如果您不想使用源 DC,可以使用
SetDIBitsToDevice()。 -
我不确定这是否是您正在寻找的答案,但它是这样的:设备上下文是一种广义的渲染抽象。它充当渲染代码和输出设备之间的代理。输出可以到显示器、打印机或绘图仪、EMF 文件或任何其他支持的设备。它允许您使用相同的渲染代码,而不管目的地是什么;低级细节会根据输出设备为您处理,包括剪辑、缩放和视口转换。就实现细节而言:构建 DC 是一项相当便宜的操作。
-
请记住,官方文档 (Device Contexts) 主要讨论的是它的实现,而不是它的目的。