В разд. 12.5.1 рассказывалось, как получать пиктограммы из файлов и DLL. Пиктограммы получались или в виде их дескрипторов, или в виде компонентов типа TIcon, или заносились в списки изображений ImageList (непосредственно, или через TIcon). Теперь коротко рассмотрим, как получать их изображения в приложении.

Рисовать пиктограммы можно функцией Drawlcon, объявленной в модуле Windows следующим образом:

function Drawlcon(hDC: HDC;
X, Y: Integer;
hlcon: HICON): BOOL;
stdcall;

Параметр hDC - дескриптор контекста, на котором должна изображаться пиктограмма. Обычно это дескриптор канвы. Параметры X и Y задают координаты левого верхнего угла изображения, а параметр hlcon - дескриптор пиктограммы.

Например, если Icon - дескриптор пиктограммы, полученой из файла или иным путем, то оператор

Drawlcon(Imagel.Canvas.Handle, 10, 10, Icon);

изобразит эту пиктограмму на канве компонента Imagel.

Пиктограммы, в отличие от битовых матриц, не масштабируются, т.е. их размеры неизменны. Тем не менее, размер изображения можно изменять. Это позволяет делать функция DrawIconEx:

function DrawIconEx(hdc: HDC;
xLeft, yTop: Integer;
hlcon: HICON;
cxWidth, cyWidth: Integer;
istepIfAniCur: UINT;

hbrFlickerFreeDraw: HBRUSH; diFlags: UINT):

BOOL;
stdcall;

Параметр hDC - дескриптор контекста, обычно канвы. Параметры X и Y задают координаты левого верхнего угла изображения, а параметр hlcon - дескриптор пиктограммы. Параметры cxWidth и су Width - это логическая ширина и высота изображения пиктограммы. Эти значения могут отличаться от ее реальных размеров. Параметр stepIfAniCur имеет отношение к изображениям курсоров и при изображении пиктограмм может быть задан равным 0. Параметр hbrFlic-kerFreeDraw - дескриптор кисти Brush канвы. Параметр diFlags - флаг, определяющий, в частности, размер изображения. Если задать diFlags = 0, то размеры изображения будут определяться значениями параметров cxWidth и cyWidth. А если значения этих параметров заданы равными 0, то размер изображения будет равен истинному размеру пиктограммы. Если задать diFlags = DI_COMPAT, то значения cxWidth и су Width будут игнорироваться, и размер пиктограммы будет равен заданным в системе по умолчанию. Если задать diFlags = DI__DEFAULT-SIZE, то размеры будут равны размерам по умолчанию, даже если cxWidth и су Width равны нулю.

Рассмотрим примеры. Если Icon - дескриптор пиктограммы типа HICON, то изображения этой пиктограммы на канве компонента Image 1 можно получить следующими операторами:

DrawIconEx(Imagel.Canvas.Handle, 10, 10, Icon, 16, 16, 0, Imagel.Canvas.Brush.Handle, 0) ;
DrawIconEx(Imagel.Canvas.Handle, 100, 10, Icon, 32, 32, 0, Imagel.Canvas.Brush.Handle, 0) ;
DrawIconEx(Imagel.Canvas.Handle, 150, 10, Icon, 64, 64, 0, Imagel.Canvas.Brush.Handle, 0);

Эти операторы дадут 3 изображения одной и той же пиктограммы с размерами 16 х 16, 32 х 32 и 64 х 64.

Функцию DrawIconEx можно использовать и для масштабированного изображения пиктограмм, хранящихся в списках ImageList. Методику такого изображения иллюстрирует следующий код:

var Mylcon: TIcon;
Mylcon := TIcon.Create;
ImageListl.Getlcon(0, Mylcon);
DrawIconEx(Imagel.Canvas.Handle, 10, 10, Mylcon.Handle, 32, 32, 0, Imagel.Canvas.Brush.Handle, 0);
Mylcon.Free;

В этом коде создается объект Mylcon типа TIcon, в него методом Getlcon загружается первая пиктограмма из списка ImageListl, а затем эта пиктограмма рисуется функцией DrawIconEx. После этого объект Mylcon уничтожается.

Теперь рассмотрим отображение пиктограмм из списков TImageList. Отображение получается методом Draw. Например, следующий оператор отобразит на канве компонента Imagel первую пиктограмму, хранящуюся в ImageListl:

ImageListl.Draw(Imagel.Canvas, 10, 10, 0);

Размер изображения определяется не истинным размером пиктограммы, а размерами, заданными в компоненте TImageList. Например, вы можете создать два списка ImageListl и ImageList2, в первом оставить значения Height и Width по умолчанию (эти значения равны 16), а во втором задать их значения равными 32. Если вы заполните эти списки одинаковыми пиктограммами, то применение метода Draw к первому списку даст изображение 16 х 16, а ко второму - 32 х 32.

Список пиктограмм с измененным размером можно создать и программно. Например, так:

var Icon: TIcon;
ImageListTmp: TImageList;
i: integer;
Icon := TIcon.Create;
ImageListTmp := TImageList.CreateSize (32, 32);

for i:= 0 to ImageListl.Count - 1 do begin

ImageListl.GetIcon(i, Icon);
ImageListTmp.Addlcon(Icon);
end;
Icon.Free;
ImageListl.Draw(Imagel.Canvas, 10, 10, 0) ;
ImageListTmp.Draw(Imagel.Canvas, 100, 10, 0);
ImageListTmp.Free;

Здесь конструктором Create Size создается список ImageListTmp с размером изображений 32 х 32. Далее в цикле в него переносятся все пиктограммы из ImageListl. Каждая пиктограмма извлекается из списка ImageListl методом Getlcon и заносится в список ImageListTmp методом Addlcon. К сожалению, в данном случае нельзя для переноса изображений между списками воспользоваться методом Addlmages, поскольку в этом случае изображения перенесутся вместе со своими размерами.

Отметим также, что рассмотренный прием масштабирования работает только для пиктограмм. Битовые изображения TBitmap невозможно без дополнительных преобразований перенести в список другого размера.

12.5.2 Стандартные пиктограммы и изображения для кнопок || Оглавление || 12.6 Динамически присоединяемые библиотеки DLL


Приемы программирования в Delphi на основе VCL



Новости за месяц

  • Февраль
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс