-
Добрый день! Пишу 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; -
Небольшое уточнение Win7 x64 Delphi XE2
-
QAZ (21.02.12 12:27) [2]OverlayIcon это икона которая накладывается на другую икону
как ты себе представляеш существование оного в размере 256х256? -
Очень даже просто, картинка заполненяет 25% площади иконки. Пример этому SVN или CVS. Сдесь ошибка не в Overlay, а имено почему не добавляется иконка в системный ImageList (ImageList_AddIcon возращает -1)
-
Вот еще маленький пример набросал, он тоже не работает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]за две с лишним недели ты всего лишь один неработающий пример написал? о_О
я вон за вчера и сегодня штук тридцать неработающих примеров с имиджлистом наклепал... -
Я перевожу проект на XE2 и задач нерешонных у меня много, это одна из них, по приоритету не самая важная. Я тоже перепробывал много способов :)
-
CRLF (12.03.12 12:07) [7]Та я тут за последние пару недель тоже немало чудес в "системном imagelist" нарыл... Добавлю в список и твой опыт. :-)