Sign in Join
Wiki copytemporary

Lazarus Custom Drawn Controls/ru: what changed

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

OldNewLine
11**Lazarus Custom Drawn Controls** это набор элементов управления, эквивалентный стандартным элементам управления Lazarus, но для самостоятельного рисования. Они могут иметь множество применений, включая: возможность полностью настроить прорисовку, возможность одинаково выглядеть на разных платформах, а также более высокую согласованность поведения.
22
33Этот набор элементов управления разделен на две части:
44
55- настраиваемые элементы управления, необходимые для реализации наборов виджетов Lazarus и расположенные в модуле lazarus/lcl/customdrawncontrols.pas. Здесь их определения.
66- все другие пользовательские элементы управления, которые используются часто, но не являются необходимыми для реализации набора пользовательских элементов управления LCL. Те находятся в пакете lazarus/components/customdrawn. Они описаны на странице [[Lazarus Custom Drawn Package]]
77
88## Как начать использовать эти компоненты?
99
1010Чтобы использовать их в конструкторе графического интерфейса Lazarus, установите пакет lazarus/components/customdrawn.lpk
1111
1212Чтобы создавать компоненты **customdrawn** используя код, можно просто добавить **customdrawncontrols**, **customdrawndrawers** и **customdrawn_common** в раздел **uses**, чтобы объявить и использовать их. Обратите внимание, что в настоящее время в LCL находится Drawer (прорисовщик интерфейса) только для Win2000, поэтому любые другие Drawer'а необходимо получить из пакета customdrawn.lpk
1313
1414Важно отметить, что стили доступны только в том случае, если вы добавляете объявление соответствующего модуля стиля в раздел **uses**.
1515
1616## Как работают эти компоненты?
1717
1818Базовые методы программирования, используемые этим набором элементов управления, объясняется на [[Developing with Graphics|Developing with Graphics#Create a custom control which draws itself]] странице.
1919
2020Код самого элемента управления реализован в модуле customdrawncontrols.pas, но этот модуль совсем не имеет кода для рисования. Customdrawncontrols.pas предоставляет код, который обрабатывает все события клавиатуры и мыши элемента управления, реализуя все действия мыши и реакции на нажатия клавиш. Каждый экземпляр элемента управления имеет связанный с ним Drawer. Drawer в нашем представлении (экземпляр класса TCDDrawer) похож на движок рендеринга или нечто подобное. Модуль **customdrawndrawers.pas** управляет списком всех известных Drawer'ов, а также объявляет все основные типы данных, необходимые для State и StateEx. Эти свойства содержат всю информацию о текущем состоянии элемента управления, которая передается в Drawer, чтобы он имел информацию, необходимую для правильного рисования элемента управления. В программе может существовать только один экземпляр каждого Drawer'а, и все элементы управления ссылаются на этот единственный экземпляр через менеджер в customdrawndrawers.pas. Каждый элемент управления имеет свойство DrawStyle, которое позволяет вам выбрать (из перечисляемого типа), какой стиль рисования использовать, а затем customdrawndrawers.pas преобразует эту информацию в экземпляр Drawer. Вы можете указать dsDefault DrawStyle, который затем будет использовать стиль, указанный в глобальной переменной DefaultStyle. Это было сделано для одновременного изменения стиля всех элементов управления. Просто измените эту глобальную переменную и затем вызовите Invalidate для элементов управления. Ниже вы можете увидеть фрагмент кода из customdrawndrawers.pas, который показывает методы, которые были представлены для управления списком Drawer'ов, а также стиль по умолчанию:
2121
2222``` pascal
2323unit customdrawndrawers;
2424//...
2525 TCDDrawStyle = (
2626 // Значение по умолчанию задается глобальной переменной DefaultStyle
2727 // Не использовать ничего для этого Drawer
2828 dsDefault = 0,
2929 // Это общий Drawer, основа для всех остальных. Он реализует вид от dsWin2000
3030 dsCommon,
3131 // Стили операционный систем
3232 dsWinCE, dsWin2000, dsWinXP,
3333 dsKDEPlastique, dsGNOME, dsMacOSX,
3434 dsAndroid,
3535 // Другие специальные стили для пользователя
3636 dsExtra1, dsExtra2, dsExtra3, dsExtra4, dsExtra5,
3737 dsExtra6, dsExtra7, dsExtra8, dsExtra9, dsExtra10
3838 );
3939//...
4040procedure RegisterDrawer(ADrawer: TCDDrawer; AStyle: TCDDrawStyle);
4141function GetDefaultDrawer: TCDDrawer;
4242function GetDrawer(AStyle: TCDDrawStyle): TCDDrawer;
4343
4444var
4545 DefaultStyle: TCDDrawStyle = dsCommon; // В начале по умолчанию стандартный, позже для каждой платформы
4646```
4747
4848Каждый класс Drawer имеет методы для рисования всех элементов управления, а также всех доступных примитивов. Все новые Drawer'а, созданные пользователями, должны наследоваться от класса TCDCommonDrawer (который является основным общим Drawer, объявленным в модуле customdrawn_common.pas). Если Вы не будете наследоваться от TCDCommonDrawer, Ваше приложение может аварийно завершить работу, если оно попадет в абстрактный метод. TCDCommonDrawer наиболее полный блок, который реализует все абстрактные методы из своего базового класса, поэтому наследование от него гарантирует, что никогда не произойдет сбоев из-за методов, которые Вы еще не реализовали. Другие Drawer'а могут переопределять нужные методы для изменения стиля рисования.
4949
5050Стиль прорисовки dsCommon использует только TCanvas для всего своего рендеринга, но другие темы могут также использовать TLazIntfImage и TFPImageCanvas, чтобы иметь более быстрый доступ к пикселям. Этот метод программирования описан в [[Developing with Graphics|Developing with Graphics#Working with TLazIntfImage]].
5151
5252### Цветовая палитра
5353
5454Drawer'а также имеют доступ к цветовой палитре, которая имеет обычные системные цвета LCL. Drawer'а по умолчанию будут загружать свои цвета из операционной системы через LCL в соответствии с собственной платформой. Однако, за пределами своей родной платформы, ящики будут использовать стандартную цветовую палитру.
5555
5656``` pascal
5757 TCDColorPalette = class
5858 public
5959 ScrollBar, Background, ActiveCaption, InactiveCaption,
6060 Menu, Window, WindowFrame, MenuText, WindowText, CaptionText,
6161 ActiveBorder, InactiveBorder, AppWorkspace, Highlight, HighlightText,
6262 BtnFace, BtnShadow, GrayText, BtnText, InactiveCaptionText,
6363 BtnHighlight, color3DDkShadow, color3DLight, InfoText, InfoBk,
6464 //
6565 HotLight, GradientActiveCaption, GradientInactiveCaption,
6666 MenuHighlight, MenuBar, Form: TColor;
6767 end;
6868
6969 { Существует 5 возможных источников ввода цветовых палитр:
7070 palDefault - Использовать palNative, когда операционная система соответствует стилю Drawer, в противном случае - palFallback
7171 palNative - Получить из операционной системы
7272 palFallback - Использовать запасные цвета Drawer
7373 palUserConfig-Загрузить из пользовательских файлов конфигурации, ToDo
7474 palCustom - Пользовательское приложение установило свою палитру
7575 }
7676 TCDPaletteKind = (palDefault, palNative, palFallback, palUserConfig, palCustom);
7777
7878 { TCDDrawer }
7979
8080 TCDDrawer = class
8181 protected
8282 public
8383 Palette: TCDColorPalette;
8484 constructor Create; virtual;
8585 destructor Destroy; override;
8686 procedure SetPaletteKind(APaletteKind: TCDPaletteKind);
8787 procedure LoadNativePaletteColors;
8888 procedure LoadFallbackPaletteColors; virtual;
8989```
9090
9191Как показывает приведенный выше код, Вы можете выбрать, откуда должны поступать цвета - либо из текущей темы операционной системы, либо из заданного по умолчанию Drawer, либо из пользовательской схемы, предоставленной Вашим приложением. Это позволяет вам изменять все цвета вашего приложения во время выполнения, просто изменяя палитру.
9292
9393## Drawer'а
9494
9595### dsCommon
9696
9797Это базовый Drawer для всех остальных, в нем реализован внешний вид Win2000 с некоторыми небольшими улучшениями, такими как лучшая фокусировка рисунков на элементах управления.
9898
9999### dsWinCE
100100
101101Имитирует внешний вид Windows CE с некоторыми небольшими улучшениями, такими как улучшение фокусировки рисунков на элементах управления
102102
103103### dsWin2000
104104
105105Имитирует внешний вид Windows 2000. Поскольку dsCommon обеспечивает внешний вид Windows 2000, то этот класс вообще не реализует собственные методы.
106106
107107### dsWinXP
108108
109109Имитирует внешний вид Windows XP
110110
111111### dsKDEPlastique
112112
113113Имитирует внешний вид темы Plastique Qt / KDE
114114
115115### dsAndroid
116116
117117Имитирует внешний вид Android
118118
119119### dsWindows7
120120
121-<figure>
122-<img src="customdrawnwindows7.png" title="customdrawnwindows7.png" />
123-<figcaption>customdrawnwindows7.png</figcaption>
124-</figure>
121+![](/wiki-images/4/4e/Customdrawnwindows7.png)
125122
126123Имитирует внешний вид Windows 7, а также может использоваться для имитации внешнего вида Windows XP и Windows 8, а также большинства стилей или оболочек Windows. В настоящее время доступен только с графической библиотекой BGRABitmap, и вы можете получить этот Drawer в пакете BGRAControls: [[BGRAControls]]
127124
128125Вы можете попытаться заставить это работать, если Вы конвертируете модуль slicescaling.pas. Техника, используемая для рисования изображений, - это 9-фрагментное масштабирование.
129126
130127Некоторый рабочий код для создания 9-фрагментного масштабирования доступен здесь: <http://sourceforge.net/p/bmpthemeutils/home/Home/>
131128
132129## Элементы управления, которые имитируют Standard Palette
133130
134131### TCDButton
135132
136133Это кнопка, с полностью настраиваемой прорисовкой.
137134
138135Пример использования:
139136
140137``` pascal
141138uses customdrawnextras;
142139
143140procedure TForm1.FormCreate(Sender: TObject);
144141var
145142 MyButton: TCDButton;
146143begin
147144 MyButton := TCDButton.Create(Self);
148145 MyButton.Parent := Self;
149146 MyButton.DrawStyle := dsWin2000;
150147 MyButton.Left := 100;
151148 MyButton.Top := 100;
152149 MyButton.Width := 200;
153150 MyButton.Height := 50;
154151 MyButton.Caption := 'My Button';
155152 MyButton.Color := clRed;
156153 MyButton.OnClick := @HandleButtonClick;
157154end;
158155```
159156
160-<figure>
161-<img src="Custom_drawn_buttons.png" title="Custom_drawn_buttons.png" />
162-<figcaption>Custom_drawn_buttons.png</figcaption>
163-</figure>
157+![](/wiki-images/5/54/Custom_drawn_buttons.png)
164158
165159### TCDEdit
166160
167161Это текстовое поле, с полностью настраиваемой прорисовкой.
168162
169-<figure>
170-<img src="TCDEdit.png" title="TCDEdit.png" />
171-<figcaption>TCDEdit.png</figcaption>
172-</figure>
163+![](/wiki-images/b/bd/TCDEdit.png)
173164
174165### TCDCheckBox
175166
176167Это флажок, с полностью настраиваемой прорисовкой.
177168
178-<figure>
179-<img src="TCDCheckBox.png" title="TCDCheckBox.png" />
180-<figcaption>TCDCheckBox.png</figcaption>
181-</figure>
169+![](/wiki-images/2/20/TCDCheckBox.png)
182170
183171### TCDRadioButton
184172
185173Это переключатель, с полностью настраиваемой прорисовкой.
186174
187-<figure>
188-<img src="TCDRadioButton.png" title="TCDRadioButton.png" />
189-<figcaption>TCDRadioButton.png</figcaption>
190-</figure>
175+![](/wiki-images/3/34/TCDRadioButton.png)
191176
192177### TCDScrollBar
193178
194179Это панель прокрутки, с полностью настраиваемой прорисовкой.
195180
196-<figure>
197-<img src="TCDScrollBar.png" title="TCDScrollBar.png" />
198-<figcaption>TCDScrollBar.png</figcaption>
199-</figure>
181+![](/wiki-images/e/e8/TCDScrollBar.png)
200182
201183### TCDGroupBox
202184
203185Это групповой контейнер, с полностью настраиваемой прорисовкой.
204186
205-<figure>
206-<img src="TCDGroupBox.png" title="TCDGroupBox.png" />
207-<figcaption>TCDGroupBox.png</figcaption>
208-</figure>
187+![](/wiki-images/4/48/TCDGroupBox.png)
209188
210189## Элементы управления, имитирующие Additional Palette
211190
212191### TCDStaticText
213192
214193## Элементы управления, имитирующие Common Controls Palette
215194
216195### TCDTrackBar
217196
218197Замена для TTrackBar
219198
220-<figure>
221-<img src="TCDTrackBar.png" title="TCDTrackBar.png" />
222-<figcaption>TCDTrackBar.png</figcaption>
223-</figure>
199+![](/wiki-images/b/b5/TCDTrackBar.png)
224200
225201### TCDProgressBar
226202
227-<figure>
228-<img src="TCDProgressBar.png" title="TCDProgressBar.png" />
229-<figcaption>TCDProgressBar.png</figcaption>
230-</figure>
203+![](/wiki-images/a/af/TCDProgressBar.png)
231204
232205### TCDListView
233206
234207В разработке.
235208
236209### TCDTabControl
237210
238211Замена для TTabControl
239212
240213### TCDPageControl
241214
242215Замена для TPageControl
243216
244-<figure>
245-<img src="TCDPageControl.png" title="TCDPageControl.png" />
246-<figcaption>TCDPageControl.png</figcaption>
247-</figure>
217+![](/wiki-images/a/ab/TCDPageControl.png)
248218
249219## Пакет Custom Drawn
250220
251221Находится здесь: [[Lazarus Custom Drawn Package]]
252222
253223## Другие хорошие custom drawn компоненты для Lazarus
254224
255225- [[VirtualTreeview]]
256226- [[ATTabs]]
257227- [[ATStatusBar]]
258228- [[ATScrollBar]]
259229
260230## Сопровождающие
261231
262232- Felipe Monteiro de Carvalho
263233- JiXian Yang
264234
265235## Смотрите также
266236
267237- [[Lazarus Components Directory]]
268238- [[Lazarus Custom Drawn Package]]
269239- [[Custom Drawn Interface]]
270240
271241---
272242*From the Free Pascal wiki, page "Lazarus Custom Drawn Controls/ru", as it stood on 2020-02-18 after a change by Trev, 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