Форум: "Основная";
Текущий архив: 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.05 c