Что такое код loadbitmap


CBitmap :: LoadBitmap() отказывается загружать ресурс

Я работаю над DLL, которая содержит ресурс bitmap. Я импортировал это растровое изображение через представление ресурсов в Visual Studio. DLL экспортирует класс, который имеет функцию, которая пытается загрузить растровое изображение:

Из приложения MFC я загрузить DLL. Внутри приложений InitInstance() function Затем я вызываю экспортированную функцию DLL, которая в конечном итоге вызывает CMyExportedClass::Create() .

Однако LoadBitmap() всегда возвращает 0 , который в соответствии с documentation указывает либо недостаточную память (не в случае), либо ресурс не существует.

Растровый файл является частью моей DLL проекта и IDB_BITMAP1 определяется в файле .rc, а также в resource.h:

MyDLL.rc:

resource.h:

Я уже проверил, что идентификатор определен только один раз. FWIW: Во время вызова LoadBitmap() функция DLL InitiInstance() уже успешно вернулась.

Каковы возможные причины, по которым LoadBitmap() отказывается загружать ресурс и как я могу это исправить?

Edit:
Я могу успешно загрузить ресурс, если вместо m_bitmap.LoadBitmap(IDB_BITMAP1) я следующее:

Так что разница между CBitmap::LoadBitmap() и LoadImage() функций здесь?

    38 2
  • 8 янв 2014 2014-01-08 09:17:43
  • Alexander Tobias Bockstaller

2 ответа

Собственно, поиск не производится. MFC загружает растровый из исполняемого файла вместо DLL в соответствии с документацией:

загружает ресурс растрового изображения с именем, lpszResourceName или идентифицированный идентификационный номер в nIDResource из исполняемого файла приложения.

Edit (чтобы завершить ответ):

Вместо этого используйте это (или LoadImage() как вы сделали):

  • 12 янв 2014 2014-01-12 14:30:58
  • Vizor

Наиболее вероятным объяснением является то, что в каком-то другом модуле процесса есть ресурс с этим идентификатором. И код MFC, который ищет ресурс, ищет в этом другом модуле модуль, который вызывает LoadBitmap .

Моя рекомендация — использовать LoadImage и, таким образом, осуществлять точный контроль над поиском ресурсов модуля.

CBitmap::LoadBitmap

Nonzero if successful; otherwise 0.

Points to a null-terminated string that contains the name of the bitmap resource.

Specifies the resource ID number of the bitmap resource.


Loads the bitmap resource named by lpszResourceName or identified by the ID number in nIDResource from the application’s executable file. The loaded bitmap is attached to the CBitmap object.

If the bitmap identified by lpszResourceName does not exist or if there is insufficient memory to load the bitmap, the function returns 0.

You can use the CGdiObject::DeleteObject function to delete bitmap loaded by the LoadBitmap function, or the CBitmap destructor will delete the object for you.

! WARNING Before you delete the object, make sure it is not selected into a device context.

The following bitmaps were added to Windows versions 3.1 and later:

These bitmaps are not found in device drivers for Windows versions 3.0 and earlier. For a complete list of bitmaps and a display of their appearance, see the Win32 Programmer’s Reference.

ВИДЕОКУРС
выпущен 4 ноября!

Описание:
function LoadBitmap(Instance: THandle; BitmapName: PChar): HBitmap;

Загpужает поименованный pесуpс каpты бит.

Паpаметpы:
Instance: Экземпляp модуля, исполнимый файл котоpого содеpжит каpту бит или 0
для пpедопpеделенной каpты бит.
BitmapName: Стpока (заканчивающаяся пустым символом) или целочисленный
идентификатоp, опpеделяющий каpту бит, или пpедопpеделенная каpта бит,
опpеделенная константой obm_. См.
pаздел «Пpедопpеделенные каpты бит, obm_» в главе 1.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp каpты бит; 0 — в пpотивном случае.

Что такое код loadbitmap

На этом уроке мы научимся использовать битмэпы в своих программах. Если быть более точным, мы научимся отображать битмэп в клиентской области нашей программы. Скачайте пример здесь.

Битмэпы можно представлять себе как изображения, хранимые в компьютере. На компьютерах используется множество различных форматов изображений, но Windows естественным образом поддерживает только формат растровых изображений Windows (.bmp). На этом уроке, когда речь будет идти о битмэпах, будет подразумеваться именно этот формат. Самый простой способ использовать битмэп — это использовать его как ресурс. Есть два способа это выполнить. Можно включить битмэп в файл определения ресурсов (.rc) следующим образом:

Илон Маск рекомендует:  Пример 1 сканер

В этом методе для представления битмэпа используется константа. В первой строчке просто задаётся константа с именем IDB_MYBITMAP и значением 100. По этому имени мы и будем обращаться к битмэпу в нашей программе. В следующей строке объявляется битмэп-ресурс. Таким образом, компилятор узнаёт, где ему искать собственно сам .bmp файл.

В другом методе для представления битмэпа используется имя, делается это следующим образом:

При использовании этого метода, в вашей программе вам придётся ссылаться на битмэп по строке «MyBitMap», а не по значению.

Оба метода прекрасно работают, главное — определиться, какой именно вы будете использовать. После включения битмэпа в файл ресурсов, можно приступить к его отображению в клиентской области нашего окна:

    Вызовите LoadBitmap чтобы узнать хэндл битмэпа. Функция LoadBitmap имеет следующий прототип:

CBitmap::LoadBitmap() refuses to load a resource

I am working on a DLL which contains a bitmap resource. I imported that bitmap through the Resource View in Visual Studio. The DLL also exports a class which has a function that tries to load the bitmap:

From an MFC application I load the DLL. Inside the applications InitInstance() function I then invoke an exported function of the DLL which eventually calls CMyExportedClass::Create() .

However, LoadBitmap() always returns 0 , which according to the documentation indicates either insufficient memory (not the case) or that the resource does not exist.

The bitmap file is part of my DLL project and IDB_BITMAP1 is defined in the .rc file as well as in resource.h:

MyDLL.rc:

resource.h:

I already checked that the ID has been defined only once. FWIW: At the time LoadBitmap() is invoked, the DLLs InitiInstance() function has already returned successfully.

What are possible reasons why LoadBitmap() refuses to load the resource and how can I fix this?

Edit:
I can successfully load the resource if instead of m_bitmap.LoadBitmap(IDB_BITMAP1) I do the following:

So what’s the difference between CBitmap::LoadBitmap() and the LoadImage() functions here?

Что такое код loadbitmap

Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда — alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.


Форум программистов > C++ > Общие вопросы C/C++
LoadBitmap
Регистрация
Поиск по форуму
Расширенный поиск
К странице.

Здесь нужно купить рекламу за 25 тыс руб в месяц! ) пишите сюда — alarforum@yandex.ru

вобщемнуно сделать по типу анимации загружая через
object. );
object. );

поочередности текстуры типо 1 потом 2

пробовал на подобии загружается 2 текстура прост 1 игнорит

Что такое код loadbitmap

Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15

У меня есть проект. Все компилируется без ошибок. Я в одном из методов пытаюсь загрузить Bitmap таким вот образом:

09.05.2009, 20:01 #1
Код
hwBmp = LoadBitmap(hInst, MAKEINTRESOURCE(104));

Чтобы не возникло недорозумений тут же привожу resource.h

Код
//<>
// Microsoft Visual C++ generated include file.
// Used by EmptyWin.rc
//
#define IDB_BITMAP1 103

// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 104
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

У меня только вопрос что возвращает макрос MAKEINTRESOURCE(). В MSDN’е написано что невнятное:The return value is the specified value in the low-order word and zero in the high-order word. Что такое low-order и high-order мне не понять Может кто-то уже лечил подобную проблему?

Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6

RAN
Дата 2.10.2003, 21:53 (ссылка) | (нет голосов) Загрузка .
Цитата
Чтобы не возникло недорозумений тут же привожу resource.h

Недорозумений не избежать
Хочу дорозуметь почему ты не используешь макроопределение вместо цифорок и почему ты пишешь 104, а не 103 (т.е. IDB_BITMAP1). Картинка не грузиться, наверное, из-за этого.

По поводу MAKEINTRESOURCE:

Цитата
The return value is the specified value in the low-order word and zero in the high-order word.

Говорит, что запихнёт твоё значение в нижнее слово (последнии 16 бит), а в верхнее слово запишет 0 (первые 16 бит). При таком раскладе LoadBitmap будет расценивать второй параметр, как ID ресурса. А если верхнее слово не 0, то LoadBitmap решит, что вторым параметром получила указатель на строку, имя ресурса.

Профиль
Группа: Участник
Сообщений: 137
Регистрация: 22.8.2003

Репутация: нет
Всего: нет

NULL
Дата 3.10.2003, 12:06 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Битовые образы / Основы программирования с помощью библиотеки MFC / Visual C++

Битовые образы — очень важная часть Windows. При хранении битовых образов в отдельном файле обычно используется расширение BMP (это единственный растровый формат, который напрямую поддерживается Windows). Часто они хранятся и в ресурсах. Битовые образы используются шире, чем все остальные ресурсы. Это объясняется наличием для них чрезвычайно мощной поддержки. Если Вы имеете большой опыт программирования только под DOS, то будете удивлены, узнав, что в Windows многие вещи, которые можно легко нарисовать программно, отображаются с помощью готовых битовых образов. Например, кнопки в нажатом и отпущенном состоянии, каркасы для целых окон. Так как компьютеры теперь имеют большие жесткие диски, то выбор между программным рисованием объекта и готовой картинкой часто однозначно решается в пользу последней.

Создание битовых образов

В MFC битовые образы описываются классом CBitmap. Для их создания можно использовать либо ресурсный редактор, либо импортировать в ресурсы готовые файлы BMP, созданные при помощи графических пакетов. Битовый образ является таким же ресурсом, как иконка или диалог. Нужно помнить, что область ресурсов с битовыми образами в EXE-файле может занимать большой размер. Но это не очень страшно, так как ресурсы автоматически не загружаются в память.

Вывод битового образа на экран

Когда битовый образ помещен в ресурсы, его можно выводить на экран. Но этот процесс не такой уж и простой.

Сначала необходимо создать объект типа CBitmap и с помощью функции LoadBitmap() загрузить в него битовый образ из ресурсов. Прототип функции таков: Параметр определяет строковый идентификатор ресурса.


После загрузки битового образа его нужно вывести в клиентскую область окна. Для этого обработчик WM_PAINT должен содержать приблизительно такой код (предполагается, что битовый образ загружен в объект backgroundBitmap): Сначала объявляются два контекста устройства. Первый связан с текущим окном. Второй не инициализирован и предназначен для области памяти, в которой будет храниться изображение. Затем с помощью функции CreateCompatibleDC() этот контекст объявляется совместимым с контекстом окна. Функция имеет прототип: Область памяти используется для вывода изображения на экран. Перед выводом на экран изображение должно быть выбрано в контекст устройства, связанный с областью памяти, с помощью функции SelectObject(). Мы используем ее вариант с прототипом: Параметр — это указатель на объект битового образа.

Для вывода изображения на экран используется функция BitBlt(), которая копирует изображение из исходного контекста устройства в контекст, связанный с вызывающим функцию объектом. Прототип функции такой: Первые два параметра задают координаты начальной точки изображения. Размеры изображения задают следующие два параметра. Параметр pSourceDC является указателем на исходный контекст устройства. Координаты SourceX и SourceY задают левый верхний угол изображения и обычно равны 0. Последний параметр задает код операции, которая будет проделана при передаче изображения из одного контекста в другой. Мы будем использовать только значение SRCCOPY, в этом случае изображение просто копируется. Существует также много других констант.

Следует отметить, что указанным методом нельзя корректно выводить битовые образы более чем с 16 цветами в видеорежимах с 256 цветами. В режимах же HiColor и TrueColor без всяких проблем этим методом выводятся любые битовые образы. Так как на всех современных компьютерах используются по крайней мере HiColor режимы, мы не будем рассматривать ограничения худших режимов и манипуляции с палитрой. На сегодняшний день этот материал устарел.

Получение системных метрик

Мы будем рассматривать пример программы, которая выводит битовый образ, хранящийся в ресурсах, в клиентскую область окна. Нужно будет установить размеры клиентской области равными размерам битового образа. Но мы можем задать прямоугольник только для всего окна. Значит, придется рассчитывать размер окна по заданным размерам клиентской области. Это можно сделать, зная размеры элементов окна (заголовка, выпуклого бордюра и т. п.). Для этого используется API-функция: Параметр определяет конкретное возвращаемое значение. Для наших целей нужны следующие значения:

RAN
Дата 3.10.2003, 16:14 (ссылка) | (нет голосов) Загрузка .
SM_CXDLGFRAME Ширина бордюра окна без выпуклой рамки (плоского диалогового окна)
SM_CYDLGFRAME Высота бордюра окна без выпуклой рамки (плоского диалогового окна)
SM_CXEDGE Ширина трехмерной выпуклой рамки окна
SM_CYEDGE Высота трехмерной выпуклой рамки окна
SM_CYCAPTION Высота заголовка окна

В нашем случае, функция возвращает указанные размеры в пикселях.

CBitmap :: LoadBitmap() отказывается загружать ресурс

Я работаю над DLL, которая содержит ресурс bitmap. Я импортировал это растровое изображение через представление ресурсов в Visual Studio. DLL экспортирует класс, который имеет функцию, которая пытается загрузить растровое изображение:

Из приложения MFC я загрузить DLL. Внутри приложений InitInstance() function Затем я вызываю экспортированную функцию DLL, которая в конечном итоге вызывает CMyExportedClass::Create() .

Однако LoadBitmap() всегда возвращает 0 , который в соответствии с documentation указывает либо недостаточную память (не в случае), либо ресурс не существует.

Растровый файл является частью моей DLL проекта и IDB_BITMAP1 определяется в файле .rc, а также в resource.h:

MyDLL.rc:

resource.h:

Я уже проверил, что идентификатор определен только один раз. FWIW: Во время вызова LoadBitmap() функция DLL InitiInstance() уже успешно вернулась.

Каковы возможные причины, по которым LoadBitmap() отказывается загружать ресурс и как я могу это исправить?

Edit:
Я могу успешно загрузить ресурс, если вместо m_bitmap.LoadBitmap(IDB_BITMAP1) я следующее:

Так что разница между CBitmap::LoadBitmap() и LoadImage() функций здесь?

    39 2
  • 8 янв 2014 2014-01-08 09:17:43
  • Alexander Tobias Bockstaller

2 ответа

Собственно, поиск не производится. MFC загружает растровый из исполняемого файла вместо DLL в соответствии с документацией:

загружает ресурс растрового изображения с именем, lpszResourceName или идентифицированный идентификационный номер в nIDResource из исполняемого файла приложения.

Edit (чтобы завершить ответ):

Вместо этого используйте это (или LoadImage() как вы сделали):

  • 12 янв 2014 2014-01-12 14:30:58
  • Vizor

Наиболее вероятным объяснением является то, что в каком-то другом модуле процесса есть ресурс с этим идентификатором. И код MFC, который ищет ресурс, ищет в этом другом модуле модуль, который вызывает LoadBitmap .

Моя рекомендация — использовать LoadImage и, таким образом, осуществлять точный контроль над поиском ресурсов модуля.

Что такое код loadbitmap

Создание программ на языке Assembler.

[администратор рассылки: Лысков Игорь Витальевич (Старший модератор)]

Лучшие эксперты в этом разделе

Коцюрбенко Алексей Владимирович
Статус: Модератор
Рейтинг: 1163
Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 458
solowey
Статус: Бакалавр
Рейтинг: 236
Перейти к консультации №:

Всем здрасте
у меня 2 проблеммы
1
есть приблезительно такой код
invoke LoadBitmap.
mov [hfistBitmap],eax
invoke LoadBitmap.
mov [hsecondBitmap],eax
invoke LoadBitmap.
mov [hmaindBitmap],eax
и так 15 битмэпов я загружаю и сохраняю их хендлы жрет все енто кучу памяти да и некрасиво 15 раз одна и таже функция загрузки
Ворос:Можно ли создать цикл чтоб в нем была только одна функция загрузки
если да то как и где надо сохранять хендлы битмепов и как их потом из (буффера. ) доставать и распозновать что где какой хендл битмапа?
Если можно пример кода на фазме или мазме
2
Почему хоть моя прога после компиляции весит 8килобай в диспечере задач она весит 2 мегабайта причем при незначительном увелечении
размера в дисп. происходит резкое возрастание выделения памяти
Какие есть методы по уменьшению использования оперативы?

Состояние: Консультация закрыта

Здесь возможно создание массива.
Делаешь обычные функции — New, Add, Sub, Delete.

В массиве будут храниться объекты, в самих объектах — номера, имена и прочее.

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Илон Маск рекомендует:  Устаревшие теги и атрибуты
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL