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

hBitmap

09.05.2010, 18:27. Показов 4052. Ответов 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
Ответ Создать тему
Новые блоги и статьи
изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru