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

Материал из DRKB

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

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);


Author: Krid
Source: Взято из http://forum.sources.ru
ID: 00403