Конференция "WinAPI" » Не добавляются иконки в системный ImageList [D7, WinXP]
 
  • irzyxa © (20.02.12 17:27) [0]
    Добрый день! Пишу shellextension. Есть там такая штука как OverlayIcon, он реализован путем добавления иконок в системные ImageList"ы, так вот работает на всех размерах(16x16,32x32,48x48) кроме 256х256. Имеется вот такой код:

    // Adding overlay icon to all used imagelists
    //   Small (16)
    ImageList := GetImageListSH(SHIL_SMALL)
    __AddNewOverlayIcon(16);
    //   Large (32)
    ImageList := GetImageListSH(SHIL_LARGE)
    __AddNewOverlayIcon(32);
    //   Extra Large (48)
    ImageList := GetImageListSH(SHIL_EXTRALARGE);
    __AddNewOverlayIcon(48);
    //   Jumbo (256x256)
    if RunningOnWinVistaAndHigher  and
      Succeeded(SHGetImageList(SHIL_JUMBO, IID_IImageList, Pointer(ImageList))) then
    __AddNewOverlayIcon(256);

     procedure __AddNewOverlayIcon(const IconListSize: Integer);
     var
       IconList: TSxIconList;
       OurSysIconIndex: Integer;
       tmpHIcon: HICON;
     begin
       Lock;
       try
         tmpHIcon := IconList.GetHIcon(OurOverlayIndex);
         if tmpHIcon <> 0 then
         try
           OurSysIconIndex := ImageList_AddIcon(ImageList, tmpHIcon);
           //!! При IconListSize = 255 ImageList_AddIcon возращает -1
           if OurSysIconIndex >= 0 then
           begin
     //
           end;
         finally
           DestroyIcon(tmpHIcon);
         end;
       finally
         UnLock;
       end;
     end;

  • irzyxa © (20.02.12 17:31) [1]
    Небольшое уточнение Win7 x64 Delphi XE2
  • QAZ (21.02.12 12:27) [2]
    OverlayIcon это икона которая накладывается на другую икону
    как ты себе представляеш существование оного в размере 256х256?
  • irzyxa © (22.02.12 17:12) [3]
    Очень даже просто, картинка заполненяет 25% площади иконки. Пример этому SVN или CVS. Сдесь ошибка не в Overlay, а имено почему не добавляется иконка в системный ImageList (ImageList_AddIcon возращает -1)
  • irzyxa © (07.03.12 19:23) [4]
    Вот еще маленький пример набросал, он тоже не работает
    function GetImageListSH(SHIL_FLAG:Cardinal): HIMAGELIST;
    type
     _SHGetImageList = function (iImageList: integer; const riid: TGUID; var ppv: Pointer): hResult; stdcall;
    var
     Handle: THandle;
     SHGetImageList: _SHGetImageList;
    begin
     Result:= 0;
     Handle:= LoadLibrary('Shell32.dll');
     if Handle<>S_OK then
     try
       SHGetImageList:=GetProcAddress(Handle, PChar(727));
       if Assigned(SHGetImageList) and (Win32Platform=VER_PLATFORM_WIN32_NT) then
         SHGetImageList(SHIL_FLAG, IID_IImageList, Pointer(Result));
     finally
       FreeLibrary(Handle);
     end;
    end;

    procedure TFmMain.bTestClick(Sender: TObject);
    var
     ImageList: HIMAGELIST;
     Ico: TIcon;
     Res: Integer;
    begin
     if odPicture.Execute then
     begin
       ImageList := GetImageListSH(SHIL_JUMBO);
       Ico := TIcon.Create;
       try
         ico.LoadFromFile(odPicture.FileName);
         Res := ImageList_AddIcon(ImageList,Ico.Handle);
         ShowMessage(IntToStr(Res));  //Res always equal -1
       finally
         ico.Free;
       end;
     end;
    end;

  • CRLF (07.03.12 23:25) [5]
    за две с лишним недели ты всего лишь один неработающий пример написал? о_О
    я вон за вчера и сегодня штук тридцать неработающих примеров с имиджлистом наклепал...
  • irzyxa © (12.03.12 11:08) [6]
    Я перевожу проект на XE2 и задач нерешонных у меня много, это одна из них, по приоритету не самая важная. Я тоже перепробывал много способов :)
  • CRLF (12.03.12 12:07) [7]
    Та я тут за последние пару недель тоже немало чудес в "системном imagelist" нарыл... Добавлю в список и твой опыт. :-)
 
Конференция "WinAPI" » Не добавляются иконки в системный ImageList [D7, WinXP]
Есть новые Нет новых   [134430   +4][b:0][p:0.002]