LoadBitMap()API是否会创建绘画问题?

时间:2010-07-20 11:56:32

标签: c++ windows winapi

我有一个用C++MFC编写的遗留系统。 我正在检查用LoadBitmap() API替换LoadImage()的代码段。代码中写的注释表示“LoadBitmap()使用来自内核内存的分页池,如果使用率达到最大限制,则会弹出绘制问题。因此应使用LoadImage API”。

我在谷歌上搜索了一下,但没有得到太多信息。当我检查MSDN时,他们说“请注意,不推荐使用LoadBitmap加载OEM位图,仅支持向后兼容性

我的问题是: 1. LoadBitmap() API是否存在任何问题?为什么我们更喜欢LoadImage()而不是LoadBitmap()? 2.什么是OEM bitmaps?如果我使用LoadBitmap加载普通BMP,是否有任何问题?

1 个答案:

答案 0 :(得分:3)

LoadBitmap()仅创建与显示兼容的位图,而不是与设备无关的位图(DIB)。而且,正如LoadBitmap() documentation本身所说的那样,“此函数已被 LoadImage 函数取代”。令人惊讶的是,LoadBitmap()仍然存在,因为我认为自Windows 95以来它已经被LoadImage()取代了!(只是为了表明降低向后兼容性有多么困难!)

OEM位图是系统范围的预定义图像,可以通过传递NULL hInstance参数和魔术lpBitmapName(如OBM_BTNCORNERS,OBM_CHECKBOXES等)来请求。 Windows使用这些使用来绘制UI的各个部分,但现在由DrawFrameControl()处理。再一次,OEM位图是一个古老的东西,“新”行为已经存在了很长时间。

除非您有充分的理由想要使用LoadBitmap(),否则我将遵循记录的建议并使用LoadImage()。要获取LoadBitmap() - 等效行为,请使用:

LoadImage(hInstance, lpBitmapName, IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);

在新代码中,您可能实际上需要一个与设备无关的位图,在这种情况下,使用LoadImage(),最后一个参数应为“LR_CREATEDIBSECTION”。在您拥有遗留代码的情况下,坚持使用“LR_DEFAULTCOLOR”可能更安全。