【问题标题】:Does LoadBitMap() API creates paint issues?LoadBitMap() API 会产生绘画问题吗?
【发布时间】:2010-07-22 05:54:27
【问题描述】:

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

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

我的问题是: 1.LoadBitmap() API 有问题吗?为什么我们应该更喜欢 LoadImage() 而不是 LoadBitmap() ? 2.OEM bitmaps是什么?如果我用LoadBitmap 加载正常的 BMP 有什么问题吗?

【问题讨论】:

    标签: c++ windows winapi


    【解决方案1】:

    LoadBitmap() 只会创建与显示兼容的位图,而不是与设备无关的位图 (DIB)。而且,正如LoadBitmap() documentation 本身在顶部所说的那样,“此功能已被 LoadImage 功能取代”。 LoadBitmap() 仍然存在几乎令人惊讶,因为我认为它已被 LoadImage() 取代自 Windows 95 以来!(只是说明放弃向后兼容性是多么困难!) p>

    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”可能更安全。

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-15
      • 2011-03-04
      • 2016-08-14
      相关资源
      最近更新 更多