Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

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

01.01.2007

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;

 

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

// bitmap
 SetWindowLong(hwndButton,GWL_STYLE,GetWindowLong(hwndButton,GWL_STYLE) or BS_BITMAP);          
 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

Взято из https://forum.sources.ru