Einzelnen Beitrag anzeigen

Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: ExtraLarge Icons per SHGetImageList

  Alt 20. Feb 2007, 23:32
Moin Moin,

mein Code stellt jetzt ShellIcone wie Systemsteuerung, Netzwerk usw. in einer Größe von 48X48 dar. Um die ShellIcone zu bekommen, habe ich die von dir benutzte Funktion mitbenutzt. Deine Funktion fügt das Icon der ImageListe hinzu, und ich habe es, da es dann ja das letzte in der Imageliste ist, mit "commctrl.ImageList_GetIcon()" ausgelesen. Eventuell gibt es da noch eine bessere Möglichkeit.
Mein Beispiel zeigt oben das normale 32X32 Icon des Ordners "eigene Dateien" und darunter das große Symbol von 48X48.
Ich nehme mal an, dass es das ist was du erreichen wolltest.
Delphi-Quellcode:
uses ShellApi, Commctrl, ShlObj;

function GetCSIDLIcon(CSIDL: integer): hIcon;
var FileInfo: TSHFileInfo; PIDL: PItemIDList; Flag: Cardinal;
begin
  SHGetSpecialFolderLocation(Application.Handle, CSIDL, PIDL);
  Flag:= SHGFI_LARGEICON;
  SHGetFileInfo(PChar(PIDL), 0, FileInfo, SizeOf(TSHFileInfo),
  SHGFI_PIDL or SHGFI_SYSICONINDEX or SHGFI_ICON or Flag);
  Result := FileInfo.hIcon;
end;

function ImageListExtraLarge: HIMAGELIST;
type
  TSHGetImageList = function (iImageList: integer; const riid: TGUID; var ppv: Pointer): hResult; stdcall;
var
  hInstShell32: THandle;
  SHGetImageList: TSHGetImageList;
const
  //SHIL_LARGE= 0;//32X32
  //SHIL_SMALL= 1;//16X16
  SHIL_EXTRALARGE= 2;
  IID_IImageList: TGUID= '{46EB5926-582E-4017-9FDF-E8998DAA0950}';
begin
  Result:= 0;
  hInstShell32:= LoadLibrary('Shell32.dll');
  if hInstShell32<> 0 then
  try
    SHGetImageList:= GetProcAddress(hInstShell32, PChar(727));
    if Assigned(SHGetImageList) and (Win32Platform = VER_PLATFORM_WIN32_NT) then
      SHGetImageList(SHIL_EXTRALARGE, IID_IImageList, pointer(Result));
  finally
    FreeLibrary(hInstShell32);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  hIcon: TIcon;
  hImgList: HIMAGELIST;
begin
  hIcon:= TIcon.Create;
  try
    hImgList:= ImageListExtraLarge;
    hIcon.Handle:= GetCSIDLIcon(CSIDL_PERSONAL);//32X32
    self.Canvas.Draw(10, 10, hIcon);
    hIcon.Handle:= commctrl.ImageList_GetIcon(hImgList, Pred(ImageList_GetImageCount(hImgList)), 0);//48X48
    self.Canvas.Draw(10, 50, hIcon);
  finally
    hIcon.Free;
  end;
end;
EDIT: Code übersichtlicher gemacht
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat