Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.17.128.129] |
|
Сообщ.
#1
,
|
|
|
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 = BCM_FIRST+$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_CENTER; 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_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); ЗЫ не надо забывать о том, что вызов ImageList_Create, в общем случае требует вызова ImageList_Destroy, без которого можно получить утечку GDI-ресурсов. Поэтому нужно следить за созданием/уничтожением ImageList'а в структуре TButtonImageList. Освободить ImageList можно в любом месте кода, например, так: var bi:TButtonImageList; begin SendMessage(Button1.Handle,BCM_GETIMAGELIST,0,LPARAM(@bi)); ImageList_Destroy(bi.himl) end; PS только для Windows XP и выше. Автор: Krid |