Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Кнопка + Рисунок/Иконка (http://forum.oszone.net/showthread.php?t=87152)

Maksim V 17-07-2007 15:54 614739

Кнопка + Рисунок/Иконка
 
Приветствую всех еще раз. Подскажите как средствами WinAPI загрузить из ресурса приложения в кнопку битмап или иконку. Вроде что надо использовать функции LoadIcon или LoadBitmap. А вот как их использовать? Примеров как всегда куча, а чтобы "на показ" исходники с компилированным файлом - нет. Интересует использование функции SendMessage при таких параметрах. Сделайте кто-нибудь простецкий пример и приаттачьте.

DillerInc 18-07-2007 01:01 614976

Цитата:

Цитата Maksim V
а чтобы "на показ" исходники с компилированным файлом - нет

...а вам тогда останется только заниматься "копипастингом"??

LoadImage function
BM_SETIMAGE message

Maksim V 18-07-2007 01:12 614979

Цитата:

...а вам тогда останется только заниматься "копипастингом"??
Я буду стараться в поте лица. :) Мне все равно таких кнопок около 20 надо сделать. Так что хотя бы пример с одной такой кнопкой не помешал бы.

DillerInc 18-07-2007 01:51 614987

Maksim V
Сам не проверял,но походу делатся должно следующим образом.
Ресурс тогда должен объявлятся примерно так:
Код:

MyBitmap  BITMAP  MyBitmap.bmp
Функцией LoadImage мы загружаем картинку, получая её описатель.Потом отправляем уже созданной кнопке сообщение BM_SETIMAGE.Происходить это должно скорее всего в главной оконной процедуре(если главное окно приложения вообще существует) при получении сообщения WM_PAINT.
Код:

var
 g_hBmp: HANDLE
...

 g_hBmp := LoadImage(hInstance, // понятно
                                      'MyBitmap', // Название ресурса
                                      IMAGE_BITMAP, // тип ресурса
                                      0,
                                      0,
                                      LR_DEFAULTCOLOR);

 SendMessage(hBtn, // описатель кнопки, изображение которой надо поменять
                        BM_SETIMAGE,
                        IMAGE_BITMAP, // тип изображения
                        g_hBmp);

Что-то в этом роде.

Maksim V 18-07-2007 03:01 614994

Вложений: 1
эээ... я уже ничего не соображаю, но состряпал архивчик с ресурсами. посмотрите пожалуйста и подправьте. тем более я наверное там уже и код попутал, потому что компилятор ругается на неизвестные переменные. хз что и куда... :)

DillerInc 18-07-2007 21:29 615511

Maksim V
Дельфийский компилятор выдаёт две ошибки:
1. Компилятор Дельфи,как это ни странно,не знает такого типа как HANDLE.Просто меняешь его на HWND, DWORD или Cardinal.Это походу всё одно и то же.
2. Неизвестная переменная hBtn.
Дык,правильно.Я привёл её чисто для примера,расчитывая на то,что ты в состоянии добыть самостоятельно описатель кнопки.Это можно сделать с помощью функции FindWindowEx.

Попробовал сам сделать пример.Отправлять сообщение BM_SETIMAGE необходимо во время обработки WM_INITDIALOG.Но у меня почему-то не получается сделать так,чтобы на кнопке отображались и картинка,и текст одновременно.По отдельности работает,а вместе никак.

Maksim V 19-07-2007 00:21 615582

Я совсем запутался с этим WinAPI. Приаттачьте пожалуйста архивчик, когда вы переделали мой пример, если вас не затруднит. :)

DillerInc 19-07-2007 03:20 615626

Вложений: 1
Maksim V
В общем,примерно так.Но есть одно НО...даже два.

Как вы создаёте файл ресурсов??Дело в том,что функция LoadImage должна в качестве второго параметра получать указатель на название ресурса(bitmap в нашем случае).В нашем случае bitmap явно не назывался "MY_BITMAP",а назывался он просто идентификатором 101.Поэтому функция не могла загрузить ресурс.С помощью программы ResHack я поменял название bitmap'а.
Теперь скомпилированный файл вроде работает.

Второе НО заключается в том,что существуют походу некоторые трудности с одновременным выводом на кнопку и картинки,и текста.Если делать это средствами WinAPI,то это не так-то просто.Если я неправ,пусть меня поправят.А пока мы имеем только кнопку с картинкой.

Maksim V 19-07-2007 23:40 616097

Юлагодарю. Просто я не указывал PChar(<ресурс>) и из-за этого картинка не грузилась в кнопку. Хммм... А мне интересно а в WinXP кнопка с картинкой отображаться должна с классическим стилем оформления или с манифестом? И как тогда добиться стиля flat? То есть интересует такой стиль, когда рамок кнопки (как бы сливается с диалогом) не видно и очертания кнопки показываются когда наводишь курсор на кнопку. Такое хотя бы возможно?


Время: 15:41.

Время: 15:41.
© OSzone.net 2001-