Can 48x48 or 64x64 icons be obtained from the Vista Shell?

后端 未结 4 1423
离开以前
离开以前 2020-12-01 13:02

If 48x48 or 64x64 icons are present in the Vista Shell how can you get the handle to display one in a TImage using SHGetFileInfo?

I\'d like to select an icon from a

4条回答
  •  一个人的身影
    2020-12-01 13:13

    You must use the SHGetImageList function, to get the image list with the larger icons.

    Here you have an example in delphi

    uses ShellApi, Commctrl, ShlObj;
    
    const
      SHIL_LARGE     = $00;  //The image size is normally 32x32 pixels. However, if the Use large icons option is selected from the Effects section of the Appearance tab in Display Properties, the image is 48x48 pixels.
      SHIL_SMALL     = $01;  //These images are the Shell standard small icon size of 16x16, but the size can be customized by the user.
      SHIL_EXTRALARGE= $02;  //These images are the Shell standard extra-large icon size. This is typically 48x48, but the size can be customized by the user.
      SHIL_SYSSMALL  = $03;  //These images are the size specified by GetSystemMetrics called with SM_CXSMICON and GetSystemMetrics called with SM_CYSMICON.
      SHIL_JUMBO     = $04;  //Windows Vista and later. The image is normally 256x256 pixels.
      IID_IImageList: TGUID= '{46EB5926-582E-4017-9FDF-E8998DAA0950}';
    
    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 GetIconFromFile(aFile:String; var aIcon : TIcon;SHIL_FLAG:Cardinal);
    var
      aImgList    : HIMAGELIST;
      SFI         : TSHFileInfo;
    Begin
        //Get the index of the imagelist
        SHGetFileInfo(PChar(aFile), FILE_ATTRIBUTE_NORMAL, SFI,
                     SizeOf( TSHFileInfo ), SHGFI_ICON or SHGFI_LARGEICON or SHGFI_SHELLICONSIZE or
                     SHGFI_SYSICONINDEX or SHGFI_TYPENAME or SHGFI_DISPLAYNAME );
    
        if not Assigned(aIcon) then
        aIcon:= TIcon.Create;
        //get the imagelist
        aImgList:= GetImageListSH(SHIL_FLAG);
        //extract the icon handle
        aIcon.Handle:= ImageList_GetIcon(aImgList, Pred(ImageList_GetImageCount(aImgList)), ILD_NORMAL);
    End;
    

    You can use these functions in this way

    var
     hicon :TIcon;
    begin
        hicon:= TIcon.Create;
        try
         GetIconFromFile('C:\Tools\reflector\readme.htm',hicon,SHIL_JUMBO);
         Image1.Picture.Icon.Assign(hIcon); //assign to timage
        finally
         hIcon.Free;
        end;
    end;
    

提交回复
热议问题