Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Добавление картинки на кнопку, если используются стили XP

Delphi , ОС и Железо , Windows

Code:

function Button_SetImageEx(hwndCtl:HWND;
                          Img:HGDIOBJ;
                          ImgType:integer; // IMAGE_BITMAP или IMAGE_ICON
                          cx:integer = 16; cy:integer = 16):Integer;
const
BCM_FIRST                       = $1600;
BCM_SETIMAGELIST                = $0002;
 
BUTTON_IMAGELIST_ALIGN_LEFT     = 0;
BUTTON_IMAGELIST_ALIGN_RIGHT    = 1;
BUTTON_IMAGELIST_ALIGN_TOP      = 2;
BUTTON_IMAGELIST_ALIGN_BOTTOM   = 3;
BUTTON_IMAGELIST_ALIGN_CENTER   = 4;
 
type
TButtonImageList=record
  himl   : HIMAGELIST;    // normal, hot, pushed, disabled, focused
  margin : TRECT;         // отступы
  uAlign : DWORD;         // выравнивание
end;
 
var
  hIconBlend:HICON;
  bi:TButtonImageList;
begin
   Result:=0;
   if not (ImgType in [IMAGE_BITMAP,IMAGE_ICON]) then exit;
 
   ZeroMemory(@bi, sizeof(bi));
   bi.himl := ImageList_Create(cx,cy,ILC_COLOR16 or ILC_MASK,4,0);
   bi.margin.Left:=10;
   bi.uAlign := BUTTON_IMAGELIST_ALIGN_LEFT;
 
   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;

Пример использования:

Code:

       
Button_SetImageEx(hwndButton,LoadBitmap(hInstance,'IDB_BITMAP1'),IMAGE_BITMAP);
 
// иконка
SetWindowLong(hwndButton,GWL_STYLE,GetWindowLong(hwndButton,GWL_STYLE) or BS_ICON);
Button_SetImageEx(hwndButton,LoadIcon(hInstance,'IDI_ICON1'),IMAGE_ICON);

Автор: Krid
Взято из http://forum.sources.ru

Программирование на 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-07-11 10:26:27/0.0063850879669189/0