use*_*562 5 c winapi gdi bitmap
此示例代码手动读取位图文件,使用CreateDIBSection()GDI 为其分配内存,并创建 hbitmap 句柄。然后它使用 MemoryDC 将位图绘制到窗口 DC:
ftp://ftp.oreilly.com/examples/9781572319950/cd_contents/Chap15/DibSect/DibSect.c
\n\nhdc = BeginPaint (hwnd, &ps) ;\n...\nhdcMem = CreateCompatibleDC (hdc) ;\nRun Code Online (Sandbox Code Playgroud)\n\n为什么我们不能用GetDC()withNULL或 withhwndDesktop来代替?为什么我们不能缓存设备上下文而不是重复创建它?
如果机器只有一个显示设备并且我们只在窗口上绘图,为什么我们需要不断协调位图和设备上下文?一旦像素数据被复制到 GDI 提供的缓冲区,当 HBITMAP 加载到 DC 并绘制时,GDI 是否会更新它?如果用户也想使用,是否需要同步访问?(先打电话GDIFlush()?)
当大多数对象属性都是不透明和抽象的时,很难弄清楚这一点。我读过几乎所有相关的MSDN,很多Petzold的书,以及一些文章:
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n编辑:
\n\n我想我的问题可以归结为:
\n\n设备上下文是显示类型还是能够显示的图形数据实例。计算机通常只有少数几个显示器,但它可以显示数百个内容。
\nGetDC(NULL)是屏幕 HDC,屏幕是共享资源,因此您应该只在此 HDC 上执行读取/查询操作。由于DWM,在 Vista 及更高版本上写入此 HDC 并不是一个好主意。
由于一张HDC只能包含一张位图、一支画笔和一支笔,Windows/应用程序显然需要图形引擎提供的不止一张HDC。
您可以依靠CreateCompatibleDC相对便宜的操作,并且我相信 Windows 拥有可以分发的 DC 缓存。如果您正在创建游戏/动画类型的应用程序,您可能希望自己缓存其中一些图形对象,但普通应用程序不应该这样做。
GDIFlush除非您在多个线程之间共享 GDI 对象,否则通常不会调用。SetDIBits如果您想混合原始像素字节访问和 GDI,则可以使用。
我不太明白“一次屏幕”的说法,Windows 自 Windows 98 以来就支持多个显示器,并且您无法采取太多措施来阻止用户连接另一个显示器。
| 归档时间: |
|
| 查看次数: |
4441 次 |
| 最近记录: |