if (ImgType=IMAGE_BITMAP) then
begin
ImageList_Add(bi.himl,Img,0); // Normal
ImageList_Add(bi.himl,Img,0); // hot
ImageList_Add(bi.himl,Img,0); // pushed
end else
begin
ImageList_AddIcon(bi.himl,Img); // Normal
ImageList_AddIcon(bi.himl,Img); // hot
ImageList_AddIcon(bi.himl,Img); // pushed
end;
// disabled
hIconBlend := ImageList_GetIcon(bi.himl,0,ILD_BLEND50 or ILD_TRANSPARENT);
ImageList_AddIcon(bi.himl,hIconBlend);
DestroyIcon(hIconBlend);
// focused
if (ImgType=IMAGE_BITMAP) then ImageList_Add(bi.himl,Img,0) else
ImageList_AddIcon(bi.himl,Img);
result:=SendMessage(hwndCtl,BCM_FIRST + BCM_SETIMAGELIST,0,LPARAM(@bi));
if (result=0) then
begin
ImageList_Destroy(bi.himl);
result := SendMessage(hwndCtl,BM_SETIMAGE,ImgType,Img)
end;
end;
Программирование на Delphi/Pascal: функция Button_SetImageEx для установки изображения на кнопку с использованием Windows API.
Функция принимает следующие параметры:
hwndCtl: Обратный handle кнопки.
Img: Handle к битмапу или иконе.
ImgType: Целое число, указывающее тип изображения (битмап (IMAGE_BITMAP) или иконка (IMAGE_ICON)).
cx, cy: Опциональные параметры,specifying размеры изображения.
Функция создает список изображений с помощью функции ImageList_Create, добавляет указанное изображение к нему четыре раза (нормальное, горячее, нажатое, отключенное). Она также устанавливает значение поля "Маргин" для кнопки. Наконец, она отправляет сообщение в кнопку с помощью функции SendMessage для установки изображения.
Пример использования функции показывает, как использовать ее для установки изображения на кнопке. Сначала загружается битмап из ресурсного файла и передается handle функции Button_SetImageEx вместе с константой IMAGE_BITMAP. Затем устанавливается стиль кнопки для включения иконки с помощью функции SetWindowLong, а затем загружается иконка из ресурсного файла, передается handle функции Button_SetImageEx вместе с константой IMAGE_ICON.
Вот некоторые потенциальные улучшения:
Функция может быть сделана более устойчивой, добавив обработку ошибок для случаев, когда изображение не может быть загружено или кнопка не существует.
Значение поля "Маргин", установленное в функции, является жестко закодированным; может быть лучше передавать это значение как параметр, чтобы вызывающий код мог настроить расстояние вокруг изображения.
Функция ImageList_Destroy вызывается при ошибке, но не ясно, должна ли список изображений всегда быть уничтожен. Могло бы быть более логично создавать и уничтожать список изображений в блоке try-finally.
Для добавления изображения на кнопку с использованием стиля XP можно достичь этого, установив стиль BS_ICON или BS_BITMAP для кнопки перед вызовом функции Button_SetImageEx.
Добавление картинки на кнопку с использованием стиля XP: код и пример использования.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.