Sign in Join
Wiki copytemporary

TImageList/ru: what changed

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

Title: TImageList/ru

OldNewLine
1+**TImageList** ![](/wiki-images/c/cc/Timagelist.png) является компонентом, представляющим собой список [[TImage/ru|изображений]], которые могут использоваться в других компонентах, таких как [[TToolBar/ru|TToolBar]] или [[TActionList/ru|TActionList]].
2+
3+## Пример использования с элементом ComboBox
4+
5+Для использования **TImageList**, разместите объект **TImageList** на форме. В данном примере нам необходимо шесть изображений.
6+
7+Все изображения должны быть одинакового размера. Если используется два разных размера изображений, то нужно использовать и два компонента **TImageList**.
8+
9+Установите высоту и ширину изображений в Инспекторе объектов; в нашем случае 50 пикселов в ширину и 18 пикселов высоту.
10+
11+Установите свойство *Style* в значение *csOwnerDrawFixed*.
12+
13+Дважды щелкните по значку элемента **TImageList** для того, чтобы открыть редактор **TImageList**. Убедитесь, что при выборе значки отображаются корректно. Если они меньше, чем требуется, проверьте их размер в Инспекторе объектов (например, с помощью быстрой клавиши \<F11\>). При необходимости вы можете заново загрузить изображения.
14+
15+<figure>
16+<img src="ImageListEd.png" title="ImageListEd.png" />
17+<figcaption>ImageListEd.png</figcaption>
18+</figure>
19+
20+Поместите элемент [[TComboBox/ru|ComboBox]] на форму и присвойте ему имя **cbSymbols** в свойстве *Name*.
21+
22+В событии *FormCreate* введите следующее:
23+
24+``` pascal
25+ cbSymbols.Items.Clear;
26+ for I := 0 to 5 do
27+ cbSymbols.Items.Add('');
28+ cbSymbols.ItemIndex := 0;
29+```
30+
31+В результате в элемент ComboBox будет добавлено 6 пустых строк и выбрана первая из них.
32+
33+В событии *OnDrawItem* для элемента **cbSymbols** поместите следующий код:
34+
35+``` pascal
36+procedure TMyForm.cbSymbolsDrawItem(
37+ aControl: TWinControl;
38+ iIndex: Integer;
39+ aRect: TRect;
40+ aState: TOwnerDrawState );
41+var
42+ cnv: TCanvas;
43+begin
44+ if not (aControl is TComboBox) then exit;
45+ cnv := TComboBox( aControl ).Canvas;
46+ Imagelist1.Draw( cnv, aRect.Left+2, aRect.Top+2, iIndex );
47+end;
48+```
49+
50+При необходимости скорректируйте центрирование изображения в элементе по центру (изменяя значение +2).
51+
52+<figure>
53+<img src="combo.png" title="combo.png" />
54+<figcaption>combo.png</figcaption>
55+</figure>
56+
57+## Пример использования с элементом SpeedButton
58+
59+Добавьте изображения в элемент **ImageList1** как в предыдущем примере и используйте их с помощью следующего кода:
60+
61+``` pascal
62+ ImageList1.GetBitmap(iIndex,SpeedButton1.Glyph);
63+```
64+
65+## Элемент TImageList с поддержкой нескольких разрешений изображения в Lazarus версии 1.9 и выше
66+
67+В Lazarus версии 1.9 компонент **TImageList** был переписан для того, чтобы поддерживать несколько разрешений одного изображения.
68+
69+<figure>
70+<img src="ImageListEd-1.9.png" title="ImageListEd-1.9.png" />
71+<figcaption>ImageListEd-1.9.png</figcaption>
72+</figure>
73+
74+Каждый элемент управления из библиотеки [[LCL/ru|LCL]], поддерживающий работу с элементом **ImageList**, теперь содержит новое свойство *\[Images\]Width*, чтобы определить какая пользовательская ширина должна использоваться для разрешения 96 PPI (100% масштаб). Примеры: TToolBar.Images/ImageWidth, TListView.LargeImages/LargeImagesWidth.
75+
76+Установите свойство *Scaled* в значение [[True/ru|True]] и элемент **ImageList** автоматически подберет масштаб изображения в вашем приложении с поддержкой High-DPI.
77+
78+### Демонстрационные приложения
79+
80+Здесь представлен исходный код 2-х демонстрационных приложений в директории с Lazarus:
81+
82+- examples/imagelist_highdpi_designtime
83+- examples/imagelist_highdpi_runtime
84+
85+### Изменения, влияющие на обратную совместимость
86+
87+#### Метод Add
88+
89+- Старое поведение: изображение было нарезано, если оно большое, или расширено, если оно слишком маленькое.
90+- Новое поведение: изображение в элементе ImageList масштабируется под все разрешения.
91+- Причина: теперь поддерживает несколько разрешений.
92+- Устранение: используйте AddSliced (если изображение состоит из нескольких добавляемых значков) или AddSlice (если нужно добавить одно изображение из пользовательского прямоугольника, также поддерживается прямоугольная область вне изображения).
93+
94+## Альтернатива с высоким разрешением для Lazarus 1.8 и старше: изменение размеров всех изображений в элементе TImageList
95+
96+Это удобно при масштабировании в приложениях с поддержкой [[High DPI]] для получения значков с высоким разрешением при работе с такими элементами, как [[TActionList/ru|TActionList]], [[TMainMenu/ru|TMainMenu]] и [[TToolBar/ru|TToolBar]]. Примечание: данный способ может работать некорректно со всеми компонентами на всех платформах.
97+
98+``` pascal
99+procedure ScaleImageList(ImgList: TImageList; NewWidth, NewHeight: Integer);
100+var
101+ TempImgList: TImageList;
102+ TempBmp1: TBitmap;
103+ TempBmp2: TBitmap;
104+ I: Integer;
105+begin
106+ TempImgList := TImageList.Create(nil);
107+ TempBmp1 := TBitmap.Create;
108+ TempBmp1.PixelFormat := pf32bit;
109+ TempBmp2 := TBitmap.Create;
110+ TempBmp2.PixelFormat := pf32bit;
111+ TempBmp2.SetSize(NewWidth, NewHeight);
112+ try
113+ TempImgList.Width := NewWidth;
114+ TempImgList.Height := NewHeight;
115+
116+ for I := 0 to ImgList.Count - 1 do begin
117+ // Load image for given index to temporary bitmap
118+ ImgList.GetBitmap(I, TempBmp1);
119+
120+ // Clear transparent image background
121+ TempBmp2.Canvas.Brush.Style := bsSolid;
122+ TempBmp2.Canvas.Brush.Color := TempBmp2.TransparentColor;
123+ TempBmp2.Canvas.FillRect(0, 0, TempBmp2.Width, TempBmp2.Height);
124+
125+ // Stretch image to new size
126+ TempBmp2.Canvas.StretchDraw(Rect(0, 0, TempBmp2.Width, TempBmp2.Height), TempBmp1);
127+ TempImgList.Add(TempBmp2, nil);
128+ end;
129+
130+ ImgList.Assign(TempImgList);
131+ finally
132+ TempImgList.Free;
133+ TempBmp1.Free;
134+ TempBmp2.Free;
135+ end;
136+end;
137+```
138+
139+## См. также
140+
141+- [[doc:lcl//controls/timagelist.html|Документация по TImageList]]
142+- [[TImage/ru|TImage]]
143+
144+---
145+*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