На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: jack128, Rouse_, Krid
  
    > Добавление картинки на кнопку , если используются стили XP
      ExpandedWrap disabled
        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;

      Пример использования:
      ExpandedWrap disabled
        // 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 можно в любом месте кода, например, так:
      ExpandedWrap disabled
        var
          bi:TButtonImageList;
        begin
         SendMessage(Button1.Handle,BCM_GETIMAGELIST,0,LPARAM(@bi));
         ImageList_Destroy(bi.himl)
        end;


      PS только для Windows XP и выше.

      Автор: Krid
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0162 ]   [ 16 queries used ]   [ Generated: 27.04.24, 13:46 GMT ]