TImageList/ru
│
English (en) │
français (fr) │
русский (ru) │
中文(中国大陆) (zh_CN) │
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;
См. также