【发布时间】:2019-01-16 08:44:20
【问题描述】:
创建位图时,您有三个四个选择:
- CreateBitmap:创建一个与设备相关的位图(它最好与您最终打算使用它的设备兼容)
- CreateCompatibleBitmap:创建设备相关位图(与您提供的 DC 兼容)
- CreateDIBitmap:创建与设备相关的位图,但允许您指定与设备无关的位以使用1(功能上相当于调用CreateCompatibleBitmap + SetDIBits)
- CreateDIBSection:创建一个独立于设备的位图(但我必须提供一个 DC?)
CreateCompatibleBitmap 需要hdc 参数是有道理的:它必须知道要与哪个 DC 兼容。
注意:为什么CreateBitmap 不采用hdc是没有意义的。它怎么知道要兼容哪个 DC?CreateBitmap 不需要 DC,并且它不知道要与哪个 DC 兼容。那是你的工作。而且您最好确保它与您最终打算使用它的 DC 兼容。
为什么 CreateDIBSection 使用设备上下文句柄?
创建DIBSection函数
CreateDIBSection 函数创建一个应用程序可以直接写入的 DIB。该函数为您提供指向位图位值位置的指针。您可以为函数将用于创建位图的文件映射对象提供句柄,或者您可以让系统为位图分配内存。
| Function | Type | Takes hdc |
|------------------------|------|-----------|
| CreateBitmap | DDB | No |
| CreateCompatibleBitmap | DDB | Yes |
| CreateDIBitmap | DDB | Yes |
| CreateDIBSection | DIB | Yes |
DIB 是怎么回事?
奖金问题
问。 CreateBitmap 是怎么回事?
A.由您来确保它兼容。祝你好运!或者您可以只使用 CreateCompatibleBitmap
阅读奖励
- Raymond Chen 的旧新事物:A survey of the various ways of creating GDI bitmaps with predefined data????。关于在 GDI 中创建位图的不同方法的优秀文章。
【问题讨论】:
-
@JonathanPotter 如果
iUsage是TBD? -
HDC在使用DIB_PAL_COLORS时是必需的,如文档所述。否则它是可选的。 -
这些功能可以追溯到石器时代,当时视频适配器只能显示 16 或 256 色,没有人能负担得起足够的 RAM 来创建 24bpp 位图。一个 640x480x3 的位图占用 900KB,而您只有 640 个。您当前的桌面墙纸位图占用的空间比当时安装的整个操作系统还要多。调色板不是可选的,所以 HDC 不是。是时候继续前进了,GDI+ 已经存在 20 年了。
-
CreateDIBSection工作,如果你通过NULL为HDC,你可以简单地通过尝试来证明这一点。但它没有这样记录,所以我不确定你在寻找什么答案,除非来自微软的有权访问源代码的人想要权衡。 -
Raymond Chen would be rolling in his grave