Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/19: Рейтинг темы: голосов - 19, средняя оценка - 4.68
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307

hBitmap

09.05.2010, 18:27. Показов 4082. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Помогите пожалуйста разобраться с hBitmap.

Я "переделываю" кнопку CommandButton через WinAPI. С начала назначяя её стиль как BS_BITMAP



C
1
SendmessageA(Button.hwnd, BM_SETSTYLE, BS_BITMAP, True)
A потом надо передать ей BMP-шку через hBitmap.

C
1
SendmessageA(Button.hwnd, BM_SETIMAGE, IMAGE_BITMAP, hBitmap)


Но я никак не могу получить hBitmap ни через сам WinAPI (с помощю функций LoadBitmap/LoadImage, hBitmap постоянно разный, то негативное число то позитивное, и кнопка так и не отображает BMP-шку) ни помещая BMP-шку с начала в ImageControl и передавая её hwnd...
Миниатюры
hBitmap  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.05.2010, 18:27
Ответы с готовыми решениями:

WinApi HBITMAP
Доброе время суток. Недавно начал разбираться с winapi и возникли некоторые проблемы. Нужно создать небольшое окно без заголовков,...

Утекает память при использовании HBITMAP
Добрый день, по таймеру рисую какое-то изображение в окне. Заметил, что при выполнении понемногу утекает память, подскажите пожалуйста в...

Рисование битмапов: (HBITMAP)SelectObject(hMemDC, hBitmap) выдаёт ошибку
Использовал пример из книг Фроловых "Библиотека системного программиста" рисование битовых изображений в формате DDB. Загрузил битмап из...

22
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
09.05.2010, 19:28
Цитата Сообщение от Kukstyler Посмотреть сообщение
с помощю функций LoadBitmap/LoadImage, hBitmap постоянно разный, то негативное число то позитивное, и кнопка так и не отображает BMP-шку
покажи код загрузки.
...а вообще, при LoadBitmap/LoadImage хэндл и не должен быть одинаковым.

это раз.
и два: ты перегруженному классу СButton пытаешся изменить стиль на НЕ Button?
сомневаюсь, что это вообще может получится.
ты-же окно субклассировал.
1
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
10.05.2010, 02:23  [ТС]
Цитата Сообщение от Patch Посмотреть сообщение
покажи код загрузки.
...а вообще, при LoadBitmap/LoadImage хэндл и не должен быть одинаковым.

это раз.
и два: ты перегруженному классу СButton пытаешся изменить стиль на НЕ Button?
сомневаюсь, что это вообще может получится.
ты-же окно субклассировал.
Спасибо огромное за ответ. B WinAPI я можно сказать не разбераюсь, сейчас рассматриваю...
Возможно из за этого я делаю несовместимые действия, впрочем вот оно как делаю (кстати вызов WinApi происходит из COBOL программы, не удивляйся коду )

В первую очередь превращаю кнопку в стиль BITMAP

WS-HANDLE = hwnd от CommandButton
BM-SETSTYLE = 244
BS-BITMAP = 128
BN-PAINT = 1 (что бы кнопка нарисовалась сама заново)

Code
1
2
3
4
5
     CALL "SendMessageA" WITH STDCALL USING BY VALUE WS-HANDLE
                                            BY VALUE BM-SETSTYLE
                                            BY VALUE BS-BITMAP
                                            BY VALUE BN-PAINT.                                            
     CANCEL "SendMessageA".
Code
1
2
3
4
5
6
 
MODULE-HANDLE = переменная получающая hwnd модуля
 
     CALL "GetModuleHandleA" WITH STDCALL USING BY VALUE 0 
                                          RETURNING MODULE-HANDLE
     CANCEL "GetModuleHandleA".
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
MODULE-HANDLE = hwnd модуля
IMAGEN = String[6] название БМП-шки заданное ей в проекте длинной в 6 букв
IMAGE-BITMAP = 0
16 и 16 = размеры БМП-шки
LR-CREATEDIBSECTION = 8192
WS-HBITMAP = переменная получающая handle БМП-шки
 
     CALL "LoadImageA" WITH STDCALL USING BY VALUE MODULE-HANDLE
                                          BY REFERENCE IMAGEN
                                          BY VALUE IMAGE-BITMAP
                                          BY VALUE 16
                                          BY VALUE 16
                                          BY VALUE LR-CREATEDIBSECTION
                                          RETURNING WS-HBITMAP.                                            
     CANCEL "LoadImageA".
Code
1
2
3
4
5
6
7
8
9
10
WS-HANDLE = hwnd от CommandButton
BM-SETIMAGE = 247
IMAGE-BITMAP = 0
WS-HBITMAP = полученная handle БМП-шки
 
     CALL "SendMessageA" WITH STDCALL USING BY VALUE WS-HANDLE
                                            BY VALUE BM-SETIMAGE
                                            BY VALUE IMAGE-BITMAP
                                            BY VALUE WS-HBITMAP.
     CANCEL "SendMessageA".
Всё это запускается кнопкой-1 с текстом "ACCION" и действует на конпку-2 с текстом "Boton". На скриншоте с первого сообщения видно что конпка-2 преобразилась в стиль XP но БМП-шка на ней так и не появляется...

Что я делаю не так, или в чём трабл? У самой кнопки есть такая опция (prperty) - называется "ImageName", сюда можно прописат название БМП-шки и она видна, как можно увидеть на скриншоте (кнопка-1), но эта опция уже не действует если кнопка в стиле XP, а передать БМП-шку через WinAPI я так и не сумел...

Поможешь? Буду очень благодарен, уже несколько дней бьюсь с этим, и ни в какую...
0
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
10.05.2010, 02:31  [ТС]
Вот значения полученные нажатием кнопки-1, то есть результат всего процесса что я описал
Миниатюры
hBitmap  
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
10.05.2010, 06:52
а! ты хочешь, чтобы кнопка рисовала иконку?

а ты уверен, что у тебя функции данные возвращают?
ты хоть проверь, что картинка-то загружается.
а если не загружается - делай GetLastError() и получишь код ошибки.
1
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
10.05.2010, 15:26  [ТС]
LoadImage даёт ошибку 8
SetImage даёт ошибку 87

Сейчас буду смотреть что означают эти ошибки...

Добавлено через 3 минуты
Уже нашёл!

LoadImage - ERROR_NOT_ENOUGH_MEMORY: Not enough storage is available to process this command.

SetImage - ERROR_INVALID_PARAMETER: The parameter is incorrect.

Ну, почему ошибка в SetImage я конечно понимаю, а вот почему в LoadImage - нет...
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
10.05.2010, 16:11
Цитата Сообщение от Kukstyler Посмотреть сообщение
Ну, почему ошибка в SetImage я конечно понимаю, а вот почему в LoadImage - нет...
попробуй загрузить для начала иконку. это проще.
затем - монохромную картинку.
и только если хоть какая-то картинка загрузится - делай ее LR-CREATEDIBSECTION
но ей-богу, зачем тебе картинка при размере 16х16 пикселей - ума не приложу.
даже иконки бывают и 16х16 и 32х32.
1
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
10.05.2010, 16:31  [ТС]
ОК, сейчас попробую всё как говоришь
А картинки 16х16 в кнопках - и для быстрой идентификации кнопки, и интерфейс с ними "радостнее", да и плюс ко всему, иногда я в кнопки сажаю только картинки, без текста...

Посмотри скриншот и увидешь о чём я говорю
Миниатюры
hBitmap  
0
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
10.05.2010, 16:48  [ТС]
Загружает иконку хорошо (Return Code = 0), а в SetImage то же самое ERROR 87...
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
10.05.2010, 17:59
с параметром IMAGE_ICON ( = 1 ) ?
1
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
10.05.2010, 19:07  [ТС]
Да, с параметром 1...
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
10.05.2010, 21:06
Цитата Сообщение от Kukstyler Посмотреть сообщение
Загружает иконку хорошо (Return Code = 0)
а разве это хорошо?
должен быть хэндл иконки.
интересно, что можно напутать в 2-х параметрах функции LoadIcon() ?
там-же только хэндл приложения и строка с именем ресурса...
1
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
10.05.2010, 21:40  [ТС]
Точно блин!!! Уже мозга за мозгу заехала... Какой хорошо если там 00000?!!!
Не знаю... Cтранно то, что передать название иконки/бмп-шки в виде hard-code не удаётся, компилятор выводит ошибку. Приходится объявлять константу, длинной соответствующую длинне названия (ArrayOfChar[1..x], в ином сучае Error типа "ресурс не найден"...
0
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
11.05.2010, 19:02  [ТС]
Блин! Точнее всё правильно, hIcon получен, а 0000000000 - это результат GetLastError.
Вот смотри, первые 4 цифры это результаты GetLastError, а внизу полученные данные, в том числе hIcon...
Миниатюры
hBitmap  
0
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
11.05.2010, 19:05  [ТС]
А вот сам код, кажется всё правильно написано...

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
*--->>> CONVIERTE EL BOTON EN GRAFICO    
     CALL "SendMessageA" WITH STDCALL USING BY VALUE WS-HANDLE
                                            BY VALUE BM-SETSTYLE
                                            BY VALUE BS-ICON
                                            BY VALUE BN-PAINT.                                            
     CANCEL "SendMessageA".
     
     CALL "GetLastError" WITH STDCALL RETURNING SV-ERROR
     CANCEL "GetLastError".
     
     DISPLAY SV-ERROR
     
*--->>> OBTIENE EL hwnd DEL MODULO     
     CALL "GetModuleHandleA" WITH STDCALL USING BY VALUE 0 
                                          RETURNING MODULE-HANDLE
     CANCEL "GetModuleHandleA".                                     
     
     CALL "GetLastError" WITH STDCALL RETURNING SV-ERROR
     CANCEL "GetLastError".
     
     DISPLAY SV-ERROR
 
*--->>> CARGA EL BITMAP PARA OBTENER SU hwnd     
     CALL "LoadImageA" WITH STDCALL USING BY VALUE MODULE-HANDLE
                                          BY REFERENCE IMAGEN
                                          BY VALUE IMAGE-ICON
                                          BY VALUE 32
                                          BY VALUE 32
                                          BY VALUE LR-CREATEDIBSECTION
                                          RETURNING WS-HBITMAP.                                            
     CANCEL "LoadImageA".  
     
     CALL "GetLastError" WITH STDCALL RETURNING SV-ERROR
     CANCEL "GetLastError".
     
     DISPLAY SV-ERROR             
     
*--->>> PASA EL hwnd DEL BITMAP AL BOTON
     CALL "SendMessageA" WITH STDCALL USING BY VALUE WS-HANDLE
                                            BY VALUE BM-SETIMAGE
                                            BY VALUE IMAGE-ICON
                                            BY VALUE WS-HBITMAP.
     CANCEL "SendMessageA".
     
     CALL "GetLastError" WITH STDCALL RETURNING SV-ERROR
     CANCEL "GetLastError".
     
     DISPLAY SV-ERROR
*---     
     DISPLAY "Module hwnd: " MODULE-HANDLE " Button hwnd: " WS-HANDLE " hBitmap: " WS-HBITMAP
*---
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
11.05.2010, 19:13
т.е., все правильно, GetLastError нигде ошибок не дает, но иконка не отображается?

пробовал сделать Invalidate() на кнопку?
1
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
12.05.2010, 00:50  [ТС]
Не совсем, есть 1 GetLastError с ошибкой, последний шаг - BM-SETIMAGE

Return-Code = 87, ERROR_INVALID_PARAMETER

Invalidate() не пробовал, попробую и напишу как дела...

Добавлено через 3 часа 48 минут
Invalidate() если я правильно понял это метод для "перерисовки" объектов заново?! В таком случае не действует, то есть не в этом причина. Почему-то именно в SetImage ошибка параметра (EC 87), но какого и почему не понятно...
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
12.05.2010, 11:52
все уже должно работать...
попробуй загрузить одну из стандартных иконок.
может, твоя ему не нравится?

какая версия OC?

Добавлено через 4 часа 4 минуты
случайно тоже возникла необходимость рисовать картинки в кнопках.
долбался полтора часа с той-же проблемой, что и у тебя.

оказалось, что при установке картинки в кнопку, картинка не копируется.
т.е., кнопка получает только хэндл картинки в памяти.
а сама картинка в памяти удаляется при выходе из функции, поскольку картинку загружал во временную переменную.

сделал переменную для картинки глобальной, и загрузку в главной функции приложения - все работает.
...но какого фига в msdn ничего про это ни сном, ни духом???
1
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
12.05.2010, 16:44  [ТС]
Понятненько! Майкософт - молодци вообще, и обьяснения у них недоделанные, половину инфы должен рыскать на других сайтах...
Ладно, спасибо за помощь, я сегодня наверное буду дома поздно, попробую сделать так как ты говоришь и отпишу результат! Но, всё же не очень понятно, ведь во время исполнения SetImage, handle кнопки ещё жив?! Тoгда почему ошибка 87?...
Кстати, тогда получается что нужно создавать по одной глобальной переменной для каждой кнопки что ли??? К тому же, нельзя вынести процесс в отдельную субпрограмму (конкретной функции преобразования кнопки) вне главной формы (MainForm)? Облом, что за фигня такая, блин...


P.S. иконки я использую стандартные от Windows XP, СО на моём компе Windows XP Home SP3
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
12.05.2010, 16:55
Цитата Сообщение от Kukstyler Посмотреть сообщение
Кстати, тогда получается что нужно создавать по одной глобальной переменной для каждой кнопки что ли???
нет, только для каждого изображения.
Цитата Сообщение от Kukstyler Посмотреть сообщение
К тому же, нельзя вынести процесс в отдельную субпрограмму (конкретной функции преобразования кнопки) вне главной формы (MainForm)?
даже там, наверно, не будет работать.

наверно поэтому вся такая инициализация, вроде загрузки картинок из ресурсов, делается Визардом VC++ в функции InitInstance() в классе CApp, там-же, где создается и сам MainForm.

идиотизм, согласен...
по идее, можно попробовать делать загрузку и в других функциях, но тогда нужно выделять память в хипе, чтобы переменная-хэндл не грохнулась при закрытии функции.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.05.2010, 16:55
Помогаю со студенческими работами здесь

Копирование HBITMAP
Добрый дешь есть функция копирования одного hbitmap в новый, с новыми размерами. Но возвращается черное изображение, Что не так? (исходное...

HBITMAP convert
как я понял HBITMAP, возвращаемый функцией LoadImage - это указатель на память в которой храняться данные битмапа так? всякие там...

HBITMAP и bitmap
У меня есть bitmap, как из него получить HBITMAP? HBITMAP hbm=bmp->Canvas->Handle;//Не работает Можно через одно место, но медленно(( ...

HBITMAP в AUX_RGBImageRec
Доброго времени суток. Получаю изображение из ресурса DLL. Каким образом полученный HBITMAP преобразовать в AUX_RGBImageRec? И как...

Смещение HBITMAP
Привет , волнует вопрос что такое смещение или выравнивание байт(пикселей). Видел несколько кодов для считывания bmp файла , но принцип...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru