Войти

Показать полную графическую версию : Кнопка + Рисунок/Иконка


Maksim V
17-07-2007, 15:54
Приветствую всех еще раз. Подскажите как средствами WinAPI загрузить из ресурса приложения в кнопку битмап или иконку. Вроде что надо использовать функции LoadIcon или LoadBitmap. А вот как их использовать? Примеров как всегда куча, а чтобы "на показ" исходники с компилированным файлом - нет. Интересует использование функции SendMessage при таких параметрах. Сделайте кто-нибудь простецкий пример и приаттачьте.

DillerInc
18-07-2007, 01:01
а чтобы "на показ" исходники с компилированным файлом - нет
...а вам тогда останется только заниматься "копипастингом"??

LoadImage function (http://msdn2.microsoft.com/en-us/library/ms648045.aspx)
BM_SETIMAGE message (http://msdn2.microsoft.com/en-us/library/ms673567.aspx)

Maksim V
18-07-2007, 01:12
...а вам тогда останется только заниматься "копипастингом"??Я буду стараться в поте лица. :) Мне все равно таких кнопок около 20 надо сделать. Так что хотя бы пример с одной такой кнопкой не помешал бы.

DillerInc
18-07-2007, 01:51
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
эээ... я уже ничего не соображаю, но состряпал архивчик с ресурсами. посмотрите пожалуйста и подправьте. тем более я наверное там уже и код попутал, потому что компилятор ругается на неизвестные переменные. хз что и куда... :)

DillerInc
18-07-2007, 21:29
Maksim V
Дельфийский компилятор выдаёт две ошибки:
1. Компилятор Дельфи,как это ни странно,не знает такого типа как HANDLE.Просто меняешь его на HWND, DWORD или Cardinal.Это походу всё одно и то же.
2. Неизвестная переменная hBtn.
Дык,правильно.Я привёл её чисто для примера,расчитывая на то,что ты в состоянии добыть самостоятельно описатель кнопки.Это можно сделать с помощью функции FindWindowEx (http://msdn2.microsoft.com/en-us/library/ms633500.aspx).

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

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

DillerInc
19-07-2007, 03:20
Maksim V
В общем,примерно так.Но есть одно НО...даже два.

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

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

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




© OSzone.net 2001-2012