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

Вниз

ресурсы   Найти похожие ветки 

 
APiC ©   (2006-08-21 14:28) [0]

Привет мастерам! Значит нахожу я ресурс типа RC_ICON с помощью FindResource(), как мне потом этот ресурс сохранить в *.ico-файл?


 
Rouse_ ©   (2006-08-21 14:31) [1]

////////////////////////////////////////////////////////////////////////////////
//
//  ****************************************************************************
//  * Unit Name : Unit1
//  * Purpose   : Демо соранения иконки в файл
//  * Author    : Александр (Rouse_) Багель
//  * Version   : 1.00
//  ****************************************************************************
//

unit Unit1;

interface

uses
 Windows, SysUtils, Classes, Graphics, Controls, Forms, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

(*

Информация взята вот отсюда:
http://myfileformats.com/download.php?url=/files/bmp.zip&id=150&name=BMP

struct IconDirectoryEntry {
   BYTE  bWidth;
   BYTE  bHeight;
   BYTE  bColorCount;
   BYTE  bReserved;
   WORD  wPlanes;
   WORD  wBitCount;
   DWORD dwBytesInRes;
   DWORD dwImageOffset;
};

typedef struct ICONDIR {
   WORD          idReserved;
   WORD          idType;
   WORD          idCount;
   ICONDIRENTRY  idEntries[1];
} ICONHEADER;

*)

const
 RC3_ICON = 1;

type
 PIconDirectoryEntry = ^TIconDirectoryEntry;
 TIconDirectoryEntry = packed record
   bWidth: Byte;
   bHeight: Byte;
   bColorCount: Byte;
   bReserved: Byte;
   wPlanes: Word;
   wBitCount: Word;
   dwBytesInRes: DWORD;
   dwImageOffset: DWORD;
 end;

 PIconDir = ^TIconDir;
 TIconDir = packed record
   Reserved: Word;
   wType: Word;
   Count: Word;
   idEntries: TIconDirectoryEntry;
 end;

procedure TForm1.Button1Click(Sender: TObject);
const
 IconDirSize = SizeOf(TIconDir);
 IconDirectoryEntrySize = SizeOf(TIconDirectoryEntry);
var
 Icon: HICON;
 IconInfo: TIconInfo;
 IconDir: TIconDir;
 IconDirectoryEntry: TIconDirectoryEntry;
 IconBuff: array of Byte;
 IconFile: THandle;
 ColorInfoHeaderSize,
 ColorImageSize,
 MaskInfoHeaderSize,
 MaskImageSize,
 Position,
 WriteSize: DWORD;
 ColorInfoHeader,
 ColorImage,
 MaskInfoHeader,
 MaskImage: TByteArray;
begin
 // Загружаем иконку
 Icon := LoadIcon(HInstance, "MAINICON");
 if Icon <> 0 then
 begin
   // Получаем информацию о иконке
   if GetIconInfo(Icon, IconInfo) then
   try
     // GetDIBSizes, GetDIB из модуля Graphics
     // Получаем размер заголовка и изображения цветной картинки
     GetDIBSizes(IconInfo.hbmColor, ColorInfoHeaderSize, ColorImageSize);
     // Получаем размер заголовка и изображения картинки - маски
     GetDIBSizes(IconInfo.hbmMask, MaskInfoHeaderSize, MaskImageSize);
     // Получаем сам заголовок и цветную картинку
     GetDIB(IconInfo.hbmColor, 0, ColorInfoHeader[0], ColorImage[0]);
     // Получаем сам заголовок и картинку - маску
     GetDIB(IconInfo.hbmMask, 0, MaskInfoHeader[0], MaskImage[0]);

     // Подготавливаем заголовок иконки

     // Each icon-resource file starts with an icon directory. The icon directory,
     // defined as an ICONDIR structure, specifies the number of icons in the
     // resource and the dimensions and color format of each icon image.

     with IconDir do
     begin
       Reserved := 0;
       wType := RC3_ICON;
       Count := 1;
     end;

     // Подготавливаем служебную информацию по иконке

     // The ICONDIRENTRY structure specifies the dimensions and color format for an
     // icon. The structure has the following form:
     
     with IconDir.idEntries do
     begin
       bWidth := PBitmapInfoHeader(@ColorInfoHeader[0])^.biWidth;
       bHeight := PBitmapInfoHeader(@ColorInfoHeader[0])^.biHeight;
       bColorCount := PBitmapInfoHeader(@ColorInfoHeader[0])^.biBitCount *
         PBitmapInfoHeader(@ColorInfoHeader[0])^.biPlanes;
       dwBytesInRes := ColorInfoHeaderSize + ColorImageSize + MaskImageSize;
       dwImageOffset := IconDirSize + IconDirectoryEntrySize;
     end;

     // color height includes mono bits
     with PBitmapInfoHeader(@ColorInfoHeader[0])^ do
       Inc(biHeight, biHeight);

     // Имея на руках все необходимые данные, формируем из них иконку
     SetLength(IconBuff, IconDirSize + IconDirectoryEntrySize + ColorInfoHeaderSize +
       ColorImageSize + MaskImageSize);

     // Пишем полученные данные в буффер
     Position := 0;
     Move(IconDir, IconBuff[Position], IconDirSize);
     Inc(Position, IconDirSize);
     Move(IconDirectoryEntry, IconBuff[Position], IconDirectoryEntrySize);
     Inc(Position, IconDirectoryEntrySize);
     Move(ColorInfoHeader[0], IconBuff[Position], ColorInfoHeaderSize);
     Inc(Position, ColorInfoHeaderSize);
     Move(ColorImage[0], IconBuff[Position], ColorImageSize);
     Inc(Position, ColorImageSize);
     Move(MaskImage[0], IconBuff[Position], MaskImageSize);

     // Вот и все, осталось сохранить этот буффер в файл
     IconFile := CreateFile(PChar("c:\test.ico"), GENERIC_READ or GENERIC_WRITE,
       0, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
     if IconFile <> INVALID_HANDLE_VALUE then
     try
       if not WriteFile(IconFile, IconBuff[0], Length(IconBuff), WriteSize, nil) then
         RaiseLastOSError;
       FlushFileBuffers(IconFile);
     finally
       CloseHandle(IconFile);
     end
     else
       RaiseLastOSError;
   finally
     // Освобождаем ресурсы ибо:
     // GetIconInfo creates bitmaps for the hbmMask and hbmColor members of ICONINFO.
     // The calling application must manage these bitmaps and delete them when they
     // are no longer necessary.
     DeleteObject(IconInfo.hbmColor);
     DeleteObject(IconInfo.hbmMask);
   end
   else
     RaiseLastOSError;
 end
 else
   RaiseLastOSError;
end;

end.



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

Форум: "WinAPI";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.081 c
9-1140710341
Просто_Я
2006-02-23 18:59
2006.12.24
Реализация карты (2D )


15-1164876089
Anatoly Podgoretsky
2006-11-30 11:41
2006.12.24
Перепись


2-1165493327
SMAC
2006-12-07 15:08
2006.12.24
Прозрачность (2)


3-1160811546
БогданБ
2006-10-14 11:39
2006.12.24
Как можно возвращать ScrolBar?


2-1165221191
root
2006-12-04 11:33
2006.12.24
Help





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский