Создает ли API LoadBitMap () проблемы с рисованием? - PullRequest
3 голосов
/ 20 июля 2010

У меня есть устаревшая система, написанная на C++, MFC. Я проверял кусок кода, где LoadBitmap() был заменен на LoadImage() API. Комментарий, написанный в коде, гласит: «LoadBitmap() использует выгружаемый пул из памяти ядра, и, если использование достигает максимального предела, возникают проблемы с рисованием. Поэтому следует использовать LoadImage API».

Я немного погуглил по этому вопросу, но не получил много информации. Когда я проверял MSDN , они говорили: " Обратите внимание, что использование LoadBitmap для загрузки растровых изображений OEM устарело и поддерживается только для обратной совместимости "

Мои вопросы: 1. Есть ли проблемы с LoadBitmap() API? Почему мы должны предпочитать LoadImage() над LoadBitmap()? 2. Что такое OEM bitmaps? Есть ли проблема, если я загружаю нормальный BMP с LoadBitmap?

1 Ответ

3 голосов
/ 21 июля 2010

LoadBitmap () будет создавать только совместимые с отображением растровые изображения, но не зависящие от устройства растровые изображения (DIB).И, как говорит сама документация LoadBitmap () , в самом верху: «Эта функция была заменена функцией LoadImage ».Это почти удивительно, что LoadBitmap () все еще существует, так как я думаю, что он был заменен LoadImage () начиная с Windows 95! (просто показывает, как трудно отказаться от обратной совместимости!)

OEM-изображения - это предопределенные изображения для всей системы, которые можно запросить, передав параметр NULL hInstance и магическое имя lpBitmapName (например, OBM_BTNCORNERS, OBM_CHECKBOXES и т. Д.).Эти использовали для использования Windows для рисования различных частей пользовательского интерфейса, но теперь это обрабатывается DrawFrameControl () .Опять же, растровые изображения OEM - это старая, старая вещь, и «новое» поведение существует уже давно.

Если у вас нет веских причин для использования LoadBitmap (), я буду следоватьзадокументированное предложение и использование LoadImage ().Чтобы получить LoadBitmap () -эквивалентное поведение, используйте:

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

В новом коде вы, вероятно, действительно захотите независимое от устройства растровое изображение, и в этом случае у вас будет для использования LoadImage (), и последний аргумент должен быть «LR_CREATEDIBSECTION».В вашем случае наличия унаследованного кода придерживаться «LR_DEFAULTCOLOR» может быть безопаснее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...