TImageList/ru
English · Français · Русский · 中文(中国)
TImageList
является компонентом, представляющим собой список изображений, которые могут использоваться в других компонентах, таких как TToolBar или TActionList.
Пример использования с элементом ComboBox
Для использования TImageList, разместите объект TImageList на форме. В данном примере нам необходимо шесть изображений.
Все изображения должны быть одинакового размера. Если используется два разных размера изображений, то нужно использовать и два компонента TImageList.
Установите высоту и ширину изображений в Инспекторе объектов; в нашем случае 50 пикселов в ширину и 18 пикселов высоту.
Установите свойство Style в значение csOwnerDrawFixed.
Дважды щелкните по значку элемента TImageList для того, чтобы открыть редактор TImageList. Убедитесь, что при выборе значки отображаются корректно. Если они меньше, чем требуется, проверьте их размер в Инспекторе объектов (например, с помощью быстрой клавиши <F11>). При необходимости вы можете заново загрузить изображения.

Поместите элемент ComboBox на форму и присвойте ему имя cbSymbols в свойстве Name.
В событии FormCreate введите следующее:
cbSymbols.Items.Clear;
for I := 0 to 5 do
cbSymbols.Items.Add('');
cbSymbols.ItemIndex := 0;В результате в элемент ComboBox будет добавлено 6 пустых строк и выбрана первая из них.
В событии OnDrawItem для элемента cbSymbols поместите следующий код:
procedure TMyForm.cbSymbolsDrawItem(
aControl: TWinControl;
iIndex: Integer;
aRect: TRect;
aState: TOwnerDrawState );
var
cnv: TCanvas;
begin
if not (aControl is TComboBox) then exit;
cnv := TComboBox( aControl ).Canvas;
Imagelist1.Draw( cnv, aRect.Left+2, aRect.Top+2, iIndex );
end;При необходимости скорректируйте центрирование изображения в элементе по центру (изменяя значение +2).

Пример использования с элементом SpeedButton
Добавьте изображения в элемент ImageList1 как в предыдущем примере и используйте их с помощью следующего кода:
ImageList1.GetBitmap(iIndex,SpeedButton1.Glyph);Элемент TImageList с поддержкой нескольких разрешений изображения в Lazarus версии 1.9 и выше
В Lazarus версии 1.9 компонент TImageList был переписан для того, чтобы поддерживать несколько разрешений одного изображения.

Каждый элемент управления из библиотеки LCL, поддерживающий работу с элементом ImageList, теперь содержит новое свойство [Images]Width, чтобы определить какая пользовательская ширина должна использоваться для разрешения 96 PPI (100% масштаб). Примеры: TToolBar.Images/ImageWidth, TListView.LargeImages/LargeImagesWidth.
Установите свойство Scaled в значение True и элемент ImageList автоматически подберет масштаб изображения в вашем приложении с поддержкой High-DPI.
Демонстрационные приложения
Здесь представлен исходный код 2-х демонстрационных приложений в директории с Lazarus:
- examples/imagelist_highdpi_designtime
- examples/imagelist_highdpi_runtime
Изменения, влияющие на обратную совместимость
Метод Add
- Старое поведение: изображение было нарезано, если оно большое, или расширено, если оно слишком маленькое.
- Новое поведение: изображение в элементе ImageList масштабируется под все разрешения.
- Причина: теперь поддерживает несколько разрешений.
- Устранение: используйте AddSliced (если изображение состоит из нескольких добавляемых значков) или AddSlice (если нужно добавить одно изображение из пользовательского прямоугольника, также поддерживается прямоугольная область вне изображения).
Альтернатива с высоким разрешением для Lazarus 1.8 и старше: изменение размеров всех изображений в элементе TImageList
Это удобно при масштабировании в приложениях с поддержкой High DPI для получения значков с высоким разрешением при работе с такими элементами, как TActionList, TMainMenu и TToolBar. Примечание: данный способ может работать некорректно со всеми компонентами на всех платформах.
procedure ScaleImageList(ImgList: TImageList; NewWidth, NewHeight: Integer);
var
TempImgList: TImageList;
TempBmp1: TBitmap;
TempBmp2: TBitmap;
I: Integer;
begin
TempImgList := TImageList.Create(nil);
TempBmp1 := TBitmap.Create;
TempBmp1.PixelFormat := pf32bit;
TempBmp2 := TBitmap.Create;
TempBmp2.PixelFormat := pf32bit;
TempBmp2.SetSize(NewWidth, NewHeight);
try
TempImgList.Width := NewWidth;
TempImgList.Height := NewHeight;
for I := 0 to ImgList.Count - 1 do begin
// Load image for given index to temporary bitmap
ImgList.GetBitmap(I, TempBmp1);
// Clear transparent image background
TempBmp2.Canvas.Brush.Style := bsSolid;
TempBmp2.Canvas.Brush.Color := TempBmp2.TransparentColor;
TempBmp2.Canvas.FillRect(0, 0, TempBmp2.Width, TempBmp2.Height);
// Stretch image to new size
TempBmp2.Canvas.StretchDraw(Rect(0, 0, TempBmp2.Width, TempBmp2.Height), TempBmp1);
TempImgList.Add(TempBmp2, nil);
end;
ImgList.Assign(TempImgList);
finally
TempImgList.Free;
TempBmp1.Free;
TempBmp2.Free;
end;
end;См. также
From the Free Pascal wiki, page "TImageList/ru", as it stood on 2020-03-01 after a change by GAN, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.
Talk about this page
Nobody has opened a bench for this page yet. Sign in to open one.
