На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: jack128, Rouse_, Krid
  
    > Как сохранить иконку в файл имея её хендл
      ExpandedWrap disabled
        ////////////////////////////////////////////////////////////////////////////////
        //
        //  ****************************************************************************
        //  * 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.


      Автор: Rouse_

      Ссылка по теме: Как сохранить иконку в файл имея её хендл
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0200 ]   [ 16 queries used ]   [ Generated: 27.04.24, 22:29 GMT ]