如果一个DibSection与任何设备无关,为什么需要设备上下文?

3

创建位图时,您有四个选择:

  • CreateBitmap:创建一个设备相关位图(并且它最好与您最终打算在其上使用的设备兼容)
  • CreateCompatibleBitmap:创建一个设备相关位图(与您提供的DC兼容)
  • CreateDIBitmap:创建一个设备相关位图,但让您指定设备无关位来初始化位图1(功能上等同于调用CreateCompatibleBitmap+SetDIBits)
  • CreateDIBSection:创建一个设备无关位图(但我必须提供一个DC?)

很容易理解为什么CreateCompatibleBitmap需要一个hdc参数:它需要知道与哪个DC兼容。

注意:不明白为什么CreateBitmap不需要hdc。它怎么知道要兼容哪个DC?

CreateBitmap不需要DC,也不知道要兼容哪个DC。这是你的工作。而且你最好确保它与你最终打算使用的DC兼容。

为什么CreateDIBSection需要一个设备上下文句柄?

CreateDIBSection函数

CreateDIBSection函数创建一个应用程序可以直接写入的DIB。该函数会给您指向位图位值位置的指针。您可以提供文件映射对象的句柄,函数将使用该对象来创建位图,或者您可以让系统为位图分配内存。

| Function               | Type | Takes hdc |
|------------------------|------|-----------|
| CreateBitmap           | DDB  | No        |
| CreateCompatibleBitmap | DDB  | Yes       |
| CreateDIBitmap         | DDB  | Yes       |
| CreateDIBSection       | DIB  | Yes       |

DIB是什么意思?

奖励问题

问: CreateBitmap是什么?

答:你需要确保它兼容。祝你好运!或者,你可以使用CreateCompatibleBitmap

额外阅读


1
@JonathanPotter 如果 iUsageTBD 呢? - Ian Boyd
1
当使用DIB_PAL_COLORS时,HDC是必需的,正如文档所述。否则它是可选的。 - Jonathan Potter
1
这些函数可以追溯到石器时代,当时视频适配器只能显示16或256种颜色,而且没有人能负担得起足够的RAM来创建24bpp位图。一个640x480x3位图需要900KB,而你只有640。你当前的桌面壁纸位图所占用的空间比当时整个操作系统的安装空间还要大。调色板不是可选项,因此HDC也不是。是时候前进了,GDI+已经存在20年了。 - Hans Passant
1
如果您在HDC参数中传递了NULL,那么CreateDIBSection函数会正常工作。您可以通过简单尝试来实现这一点。但是,这并未被记录在文档中,因此我不太确定您在答案中要找什么,除非有Microsoft的某位拥有源代码访问权限的人想要参与讨论。 - Jonathan Potter
1
雷蒙德·陈(Raymond Chen)[会在坟墓里翻身了](https://blogs.msdn.microsoft.com/oldnewthing/20050901-17/?p=34343)。 - Ian Boyd
显示剩余4条评论
1个回答

2

答案似乎是:

  • 如果usage = DIB_PAL_COLORS,则只需要hdc
  • 否则(即usage = DIB_RGB_COLORS),hdc可能是可选的

最初的回答:

  • 如果使用DIB_PAL_COLORS,则必须提供hdc
  • 否则(即DIB_RGB_COLORS),可以选择传递hdc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接