Копия викизеркало

Это зеркало вики с pascal.chat. Правка, история и вход — там.

TImageList/ru

English · Français · Русский · 中文(中国)

TImageList является компонентом, представляющим собой список изображений, которые могут использоваться в других компонентах, таких как TToolBar или TActionList.

Пример использования с элементом ComboBox

Для использования TImageList, разместите объект TImageList на форме. В данном примере нам необходимо шесть изображений.

Все изображения должны быть одинакового размера. Если используется два разных размера изображений, то нужно использовать и два компонента TImageList.

Установите высоту и ширину изображений в Инспекторе объектов; в нашем случае 50 пикселов в ширину и 18 пикселов высоту.

Установите свойство Style в значение csOwnerDrawFixed.

Дважды щелкните по значку элемента TImageList для того, чтобы открыть редактор TImageList. Убедитесь, что при выборе значки отображаются корректно. Если они меньше, чем требуется, проверьте их размер в Инспекторе объектов (например, с помощью быстрой клавиши <F11>). При необходимости вы можете заново загрузить изображения.

Поместите элемент ComboBox на форму и присвойте ему имя cbSymbols в свойстве Name.

В событии FormCreate введите следующее:

pascal
 cbSymbols.Items.Clear;
 for I := 0 to 5 do
   cbSymbols.Items.Add('');
 cbSymbols.ItemIndex := 0;

В результате в элемент ComboBox будет добавлено 6 пустых строк и выбрана первая из них.

В событии OnDrawItem для элемента cbSymbols поместите следующий код:

pascal
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 как в предыдущем примере и используйте их с помощью следующего кода:

pascal
   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:

Изменения, влияющие на обратную совместимость

Метод Add

Альтернатива с высоким разрешением для Lazarus 1.8 и старше: изменение размеров всех изображений в элементе TImageList

Это удобно при масштабировании в приложениях с поддержкой High DPI для получения значков с высоким разрешением при работе с такими элементами, как TActionList, TMainMenu и TToolBar. Примечание: данный способ может работать некорректно со всеми компонентами на всех платформах.

pascal
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.

Версия 2, последнее изменение: WikiArchive, .