Glyph из ресурсов DLL

Печать
Статьи

Если Вы хотите делать приложения, которые будут иметь скины, менять внешний вид без сторонных компонентов, то изображения удобнее всего хранить в Dll с ресурсами, чтобы пользователь не смог изменить файлы изображений, а также случайно удалить. Но как же извлечь глифы для кнопок (TBitBtn, TSpeedButton и т.д.)? Ответ ниже, в исходном коде. Код простой, поэтому без комментариев:

Глиф на кнопке и изображение в Image из ресурсов

uses
  { ... }, JPEG;
  
  { ... }
  private
    { Private declarations }
    procedure LoadGlyph(Sender: TObject);

{ ... }

var
  Form1: TForm1;
  h: HWND;

{$IFDEF WIN32}
  const BadDllLoad = 0;
{$ELSE}
  const BadDllLoad = 32;
{$ENDIF}

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  h:= LoadLibrary('appres.dll');
  if h <= BadDllLoad then
    ShowMessage('Не могу загрузить DLL!')
  else
    LoadGlyph(Self);
end;

procedure TForm1.LoadGlyph(Sender: TObject);
var
  strm: TResourceStream;
  image: TJPEGImage;
  bmp: TBitmap;
begin
  image:= TJPEGImage.Create;
  strm:= TResourceStream.Create(h, '#4', RT_RCDATA);
  strm.Seek(0, soFromBeginning);
  image.LoadFromStream(strm);
  Image1.Canvas.Draw(0, 0, image);
  image.Free;
  strm.Free;

  image:= TJPEGImage.Create;
  bmp:= TBitmap.Create;
  strm:= TResourceStream.Create(h, '#3', RT_RCDATA);
  strm.Seek(0, soFromBeginning);
  image.LoadFromStream(strm);
  bmp.Assign(image);
  BitBtn1.Glyph:= bmp;
  bmp.Free;
  strm.Free;
  image.Free;
end;

Изображения в ресурсах находятся в JPG формате, так они занимают меньше места, чем BMP.

И не забудьте уничтожить дескриптор библиотеки при закрытии приложения!