Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.12;
Скачать: CL | DM;

Вниз

Как вытащить определенную иконку из ICO-файла?   Найти похожие ветки 

 
Islander   (2004-11-29 19:28) [0]

Здравствуйте!

Вопрос с виду простой, а не получается.

Итак, имеем Ico-файл, в нем три иконки:

32x32 16 цветов, 32x32 256 цветов, 32x32 32bit цветов

Нужно загрузить из этого ico-файла, допустим, только вторую иконку,
или только третью, или только первую и т.д.

Пробую:

NumberOfIcons := ExtractIcon(hInstance, PChar(IconsName), UINT(-1));

Возвращает 1. А где тогда еще две иконки?

Короче, как не использую функции ExtractIcon, ExtractIconEx, а ничего
кроме одной первой иконки извлечь не удается.


Знает кто-нибудь как решить эту проблему?


 
abc   (2004-11-29 19:39) [1]

Image1.Picture.Icon.Handle:=ExtractIcon(hInstance,PChar(IconsName),2); вторую иконку
может так


 
Chlavik ©   (2004-11-29 20:03) [2]

Елси тебе с ресурсов надо вытащить то вот моя функция

function LoadIconEx(ID:WORD):HICON;
var HResInfo,HGlobal:DWORD;
begin
HResInfo := FindResource(hInstance, PChar(ID), RT_ICON);
if HResInfo = 0 then Exit;
HGlobal := LoadResource(hInstance, HResInfo);
if HGlobal = 0 then Exit;
Result:=CreateIconFromResource(LockResource(HGlobal),
  SizeOfResource(hInstance, HResInfo),true,$30000);
UnlockResource(HGlobal);
FreeResource(HGlobal);
end;

Тут проверку на Result надо правильно сделать полсе вызовов Api функций...


 
Islander   (2004-11-29 20:39) [3]

2abc: пустой хендл возвращает так, не работает
2Chlavik нет, к сожалению, не из ресурсов :(


 
Davinchi ©   (2004-11-29 20:48) [4]


 Image1.Picture.Icon.LoadFromFile("FileName");
 Image1.Canvas.CopyRect(...);

смысл такой, сначала в имидж загружаешь все три иконки, а потом с канвы копируешь только ту облать иконки, которая тебе нужна


 
Ученик   (2004-11-30 21:58) [5]


unit IconMulti;

interface

uses
Windows,
Classes,
SysUtils,
Graphics;

type
TIconReader = class;
TIconReaderItem = class
private
  FIcon: TIcon;
  FOwner: TIconReader;
  FIconDim: TPoint;
public
  property Icon: TIcon read FIcon;
  property IconDim: TPoint read FIconDim;

  constructor Create(const AOwner: TIconReader); virtual;
  destructor Destroy; override;
end;

TIconReader = class
private
  FIconList: TList;

  function GetCount: integer;
  function GetIcons(index: integer): TIconReaderItem;
public
  constructor Create; virtual;
  destructor Destroy; override;

  procedure Clear; virtual;
  procedure Load(const FileName: string);

  property Count: integer read GetCount;
  property Icons[index: integer]: TIconReaderItem read GetIcons;
end;

implementation

var
SIHeader          : array[0..5] of byte = (0, 0, 1, 0, 1, 0);

{ TIconReaderItem }

constructor TIconReaderItem.Create;
begin
FIcon := TIcon.Create;
FOwner := AOwner;
FOwner.FIconList.Add(Self);
end;

destructor TIconReaderItem.Destroy;
begin
FOwner.FIconList.Remove(Self);
FIcon.Free;
inherited;
end;

{ TIconReader }

procedure TIconReader.Clear;
begin
while (FIconList.Count > 0) do
  TIconReaderItem(FIconList.Items[0]).Free;
end;

constructor TIconReader.Create;
begin
FIconList := TList.Create;
end;

destructor TIconReader.Destroy;
begin
Clear;
FIconList.Free;
inherited;
end;

function TIconReader.GetCount: integer;
begin
Result := FIconList.Count;
end;

function TIconReader.GetIcons(index: integer): TIconReaderItem;
begin
Result := TIconReaderItem(FIconList.Items[index]);
end;

type
 TIconDirEntry = packed record
   bWidth: Byte;               // Width, in pixels, of the image
   bHeight: Byte;              // Height, in pixels, of the image
   bColorCount: Byte;          // Number of colors in image (0 if >=8bpp)
   bReserved: Byte;            // Reserved ( must be 0)
   wPlanes: Word;              // Color Planes
   wBitCount: Word;            // Bits per pixel
   dwBytesInRes: DWORD;        // Total bytes of image, including Color Table
   dwImageOffset: DWORD;       // Offset from BOF for this image
 end;

procedure TIconReader.Load(const FileName: string);
var
Count, I, ILen    : Word;
SHeader           : TIconDirEntry;
TF                : TFileStream;
TI                : TIconReaderItem;
BitmapInfoHeader  : TBitmapInfoHeader;
TMS               : TMemoryStream;
CFilePos          : Int64;
begin
Clear;
if FileExists(FileName) then
  begin
    TMS := TMemoryStream.Create;
    TF := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
    try
      TF.Position := 4;
      Count := 0;
      TF.Read(Count, 2);
      CFilePos := 6 + (16 * Count);
      Dec(Count);
      for I := 0 to Count do
        begin
          TMS.Clear;
          TMS.Position := 0;
          TMS.Write(SIHeader, 6);

          TI := TIconReaderItem.Create(Self);
          TF.Read(SHeader, 16);
          TI.FIconDim.X := SHeader.bWidth;
          TI.FIconDim.Y := SHeader.bHeight;

          SHeader.dwImageOffset := 22;          // Set HEADER-Length
          TMS.Write(SHeader, 16);

          TF.Position := TF.Position - 8;

          ILen := 0;
          TF.Read(ILen, 2);

          TF.Position := CFilePos;
          TF.ReadBuffer(BitmapInfoHeader, SizeOf(BitmapInfoHeader));
          TF.Position := CFilePos;
         
          if (ILen > 0) then TMS.CopyFrom(TF, ILen);
          CFilePos := TF.Position;
          TF.Position := 6 + (16 * (I + 1));

          TMS.Position := 0;
          TI.Icon.LoadFromStream(TMS);
          TI.Icon.Width := TI.FIconDim.X;
          TI.Icon.Height := TI.FIconDim.Y;
        end;
    finally
      TMS.Free;
      TF.Free;
    end;
  end;
end;

end.




Страницы: 1 вся ветка

Текущий архив: 2004.12.12;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.03 c
4-1099035890
Erik1
2004-10-29 11:44
2004.12.12
Где найти модуль для модальных диалогов?


4-1098771740
Artemius
2004-10-26 10:22
2004.12.12
Глюк при постановке в очередь печати.


4-1098955855
Che
2004-10-28 13:30
2004.12.12
Проблемы с FrameRect


3-1100264349
Wolffgang
2004-11-12 15:59
2004.12.12
Запятые и float


1-1101642989
Frozzen
2004-11-28 14:56
2004.12.12
Копирование свойств объекта