Главная страница
    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.04 c
2-1164908261
aleko
2006-11-30 20:37
2006.12.24
отображение формы


15-1164960688
Любознательный
2006-12-01 11:11
2006.12.24
Что за остров?


1-1163161794
DVM
2006-11-10 15:29
2006.12.24
Вопрос про BeginThread.


15-1165306535
sasha1884
2006-12-05 11:15
2006.12.24
Нужна программа на Delphi! Оплата гарантирована


4-1155901190
Прогер
2006-08-18 15:39
2006.12.24
Как грамотно остановить сервис? Service WinNT





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