Sign in Join
Wiki copytemporary

TImageList/ru: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11**TImageList** ![](/wiki-images/c/cc/Timagelist.png) является компонентом, представляющим собой список [[TImage/ru|изображений]], которые могут использоваться в других компонентах, таких как [[TToolBar/ru|TToolBar]] или [[TActionList/ru|TActionList]].
22
33## Пример использования с элементом ComboBox
44
55Для использования **TImageList**, разместите объект **TImageList** на форме. В данном примере нам необходимо шесть изображений.
66
77Все изображения должны быть одинакового размера. Если используется два разных размера изображений, то нужно использовать и два компонента **TImageList**.
88
99Установите высоту и ширину изображений в Инспекторе объектов; в нашем случае 50 пикселов в ширину и 18 пикселов высоту.
1010
1111Установите свойство *Style* в значение *csOwnerDrawFixed*.
1212
1313Дважды щелкните по значку элемента **TImageList** для того, чтобы открыть редактор **TImageList**. Убедитесь, что при выборе значки отображаются корректно. Если они меньше, чем требуется, проверьте их размер в Инспекторе объектов (например, с помощью быстрой клавиши \<F11\>). При необходимости вы можете заново загрузить изображения.
1414
15-<figure>
16-<img src="ImageListEd.png" title="ImageListEd.png" />
17-<figcaption>ImageListEd.png</figcaption>
18-</figure>
15+![](/wiki-images/1/13/ImageListEd.png)
1916
2017Поместите элемент [[TComboBox/ru|ComboBox]] на форму и присвойте ему имя **cbSymbols** в свойстве *Name*.
2118
2219В событии *FormCreate* введите следующее:
2320
2421``` pascal
2522 cbSymbols.Items.Clear;
2623 for I := 0 to 5 do
2724 cbSymbols.Items.Add('');
2825 cbSymbols.ItemIndex := 0;
2926```
3027
3128В результате в элемент ComboBox будет добавлено 6 пустых строк и выбрана первая из них.
3229
3330В событии *OnDrawItem* для элемента **cbSymbols** поместите следующий код:
3431
3532``` pascal
3633procedure TMyForm.cbSymbolsDrawItem(
3734 aControl: TWinControl;
3835 iIndex: Integer;
3936 aRect: TRect;
4037 aState: TOwnerDrawState );
4138var
4239 cnv: TCanvas;
4340begin
4441 if not (aControl is TComboBox) then exit;
4542 cnv := TComboBox( aControl ).Canvas;
4643 Imagelist1.Draw( cnv, aRect.Left+2, aRect.Top+2, iIndex );
4744end;
4845```
4946
5047При необходимости скорректируйте центрирование изображения в элементе по центру (изменяя значение +2).
5148
52-<figure>
53-<img src="combo.png" title="combo.png" />
54-<figcaption>combo.png</figcaption>
55-</figure>
49+![](/wiki-images/1/1a/Combo.png)
5650
5751## Пример использования с элементом SpeedButton
5852
5953Добавьте изображения в элемент **ImageList1** как в предыдущем примере и используйте их с помощью следующего кода:
6054
6155``` pascal
6256 ImageList1.GetBitmap(iIndex,SpeedButton1.Glyph);
6357```
6458
6559## Элемент TImageList с поддержкой нескольких разрешений изображения в Lazarus версии 1.9 и выше
6660
6761В Lazarus версии 1.9 компонент **TImageList** был переписан для того, чтобы поддерживать несколько разрешений одного изображения.
6862
69-<figure>
70-<img src="ImageListEd-1.9.png" title="ImageListEd-1.9.png" />
71-<figcaption>ImageListEd-1.9.png</figcaption>
72-</figure>
63+![](/wiki-images/5/5b/ImageListEd-1.9.png)
7364
7465Каждый элемент управления из библиотеки [[LCL/ru|LCL]], поддерживающий работу с элементом **ImageList**, теперь содержит новое свойство *\[Images\]Width*, чтобы определить какая пользовательская ширина должна использоваться для разрешения 96 PPI (100% масштаб). Примеры: TToolBar.Images/ImageWidth, TListView.LargeImages/LargeImagesWidth.
7566
7667Установите свойство *Scaled* в значение [[True/ru|True]] и элемент **ImageList** автоматически подберет масштаб изображения в вашем приложении с поддержкой High-DPI.
7768
7869### Демонстрационные приложения
7970
8071Здесь представлен исходный код 2-х демонстрационных приложений в директории с Lazarus:
8172
8273- examples/imagelist_highdpi_designtime
8374- examples/imagelist_highdpi_runtime
8475
8576### Изменения, влияющие на обратную совместимость
8677
8778#### Метод Add
8879
8980- Старое поведение: изображение было нарезано, если оно большое, или расширено, если оно слишком маленькое.
9081- Новое поведение: изображение в элементе ImageList масштабируется под все разрешения.
9182- Причина: теперь поддерживает несколько разрешений.
9283- Устранение: используйте AddSliced (если изображение состоит из нескольких добавляемых значков) или AddSlice (если нужно добавить одно изображение из пользовательского прямоугольника, также поддерживается прямоугольная область вне изображения).
9384
9485## Альтернатива с высоким разрешением для Lazarus 1.8 и старше: изменение размеров всех изображений в элементе TImageList
9586
9687Это удобно при масштабировании в приложениях с поддержкой [[High DPI]] для получения значков с высоким разрешением при работе с такими элементами, как [[TActionList/ru|TActionList]], [[TMainMenu/ru|TMainMenu]] и [[TToolBar/ru|TToolBar]]. Примечание: данный способ может работать некорректно со всеми компонентами на всех платформах.
9788
9889``` pascal
9990procedure ScaleImageList(ImgList: TImageList; NewWidth, NewHeight: Integer);
10091var
10192 TempImgList: TImageList;
10293 TempBmp1: TBitmap;
10394 TempBmp2: TBitmap;
10495 I: Integer;
10596begin
10697 TempImgList := TImageList.Create(nil);
10798 TempBmp1 := TBitmap.Create;
10899 TempBmp1.PixelFormat := pf32bit;
109100 TempBmp2 := TBitmap.Create;
110101 TempBmp2.PixelFormat := pf32bit;
111102 TempBmp2.SetSize(NewWidth, NewHeight);
112103 try
113104 TempImgList.Width := NewWidth;
114105 TempImgList.Height := NewHeight;
115106
116107 for I := 0 to ImgList.Count - 1 do begin
117108 // Load image for given index to temporary bitmap
118109 ImgList.GetBitmap(I, TempBmp1);
119110
120111 // Clear transparent image background
121112 TempBmp2.Canvas.Brush.Style := bsSolid;
122113 TempBmp2.Canvas.Brush.Color := TempBmp2.TransparentColor;
123114 TempBmp2.Canvas.FillRect(0, 0, TempBmp2.Width, TempBmp2.Height);
124115
125116 // Stretch image to new size
126117 TempBmp2.Canvas.StretchDraw(Rect(0, 0, TempBmp2.Width, TempBmp2.Height), TempBmp1);
127118 TempImgList.Add(TempBmp2, nil);
128119 end;
129120
130121 ImgList.Assign(TempImgList);
131122 finally
132123 TempImgList.Free;
133124 TempBmp1.Free;
134125 TempBmp2.Free;
135126 end;
136127end;
137128```
138129
139130## См. также
140131
141132- [[doc:lcl//controls/timagelist.html|Документация по TImageList]]
142133- [[TImage/ru|TImage]]
143134
144135---
145136*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](/wiki-contact).*

Back to history