Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];

Вниз

Как вытащить определенную иконку из 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.034 c
14-1101327397
Knight
2004-11-24 23:16
2004.12.12
10 буказоидов на Мегафон-Москва...


14-1100855016
Ilya___
2004-11-19 12:03
2004.12.12
Подскажите пожалуйста. правильно ли я делаю?


3-1100531559
Dionnis
2004-11-15 18:12
2004.12.12
Использование индексов


1-1101084247
Кто---то
2004-11-22 03:44
2004.12.12
Почему не срабатывает OnClick, когда кликаем по заголовку столбца


3-1100087184
ruslanyd
2004-11-10 14:46
2004.12.12
Среднее между TDBLookupListBox и TListBox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский