Lazarus Custom Drawn Controls/ru: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: Lazarus Custom Drawn Controls/ru
| Old | New | Line | |
|---|---|---|---|
| 1 | + | **Lazarus Custom Drawn Controls** это набор элементов управления, эквивалентный стандартным элементам управления Lazarus, но для самостоятельного рисования. Они могут иметь множество применений, включая: возможность полностью настроить прорисовку, возможность одинаково выглядеть на разных платформах, а также более высокую согласованность поведения. | |
| 2 | + | ||
| 3 | + | Этот набор элементов управления разделен на две части: | |
| 4 | + | ||
| 5 | + | - настраиваемые элементы управления, необходимые для реализации наборов виджетов Lazarus и расположенные в модуле lazarus/lcl/customdrawncontrols.pas. Здесь их определения. | |
| 6 | + | - все другие пользовательские элементы управления, которые используются часто, но не являются необходимыми для реализации набора пользовательских элементов управления LCL. Те находятся в пакете lazarus/components/customdrawn. Они описаны на странице [[Lazarus Custom Drawn Package]] | |
| 7 | + | ||
| 8 | + | ## Как начать использовать эти компоненты? | |
| 9 | + | ||
| 10 | + | Чтобы использовать их в конструкторе графического интерфейса Lazarus, установите пакет lazarus/components/customdrawn.lpk | |
| 11 | + | ||
| 12 | + | Чтобы создавать компоненты **customdrawn** используя код, можно просто добавить **customdrawncontrols**, **customdrawndrawers** и **customdrawn_common** в раздел **uses**, чтобы объявить и использовать их. Обратите внимание, что в настоящее время в LCL находится Drawer (прорисовщик интерфейса) только для Win2000, поэтому любые другие Drawer'а необходимо получить из пакета customdrawn.lpk | |
| 13 | + | ||
| 14 | + | Важно отметить, что стили доступны только в том случае, если вы добавляете объявление соответствующего модуля стиля в раздел **uses**. | |
| 15 | + | ||
| 16 | + | ## Как работают эти компоненты? | |
| 17 | + | ||
| 18 | + | Базовые методы программирования, используемые этим набором элементов управления, объясняется на [[Developing with Graphics|Developing with Graphics#Create a custom control which draws itself]] странице. | |
| 19 | + | ||
| 20 | + | Код самого элемента управления реализован в модуле 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'ов, а также стиль по умолчанию: | |
| 21 | + | ||
| 22 | + | ``` pascal | |
| 23 | + | unit customdrawndrawers; | |
| 24 | + | //... | |
| 25 | + | TCDDrawStyle = ( | |
| 26 | + | // Значение по умолчанию задается глобальной переменной DefaultStyle | |
| 27 | + | // Не использовать ничего для этого Drawer | |
| 28 | + | dsDefault = 0, | |
| 29 | + | // Это общий Drawer, основа для всех остальных. Он реализует вид от dsWin2000 | |
| 30 | + | dsCommon, | |
| 31 | + | // Стили операционный систем | |
| 32 | + | dsWinCE, dsWin2000, dsWinXP, | |
| 33 | + | dsKDEPlastique, dsGNOME, dsMacOSX, | |
| 34 | + | dsAndroid, | |
| 35 | + | // Другие специальные стили для пользователя | |
| 36 | + | dsExtra1, dsExtra2, dsExtra3, dsExtra4, dsExtra5, | |
| 37 | + | dsExtra6, dsExtra7, dsExtra8, dsExtra9, dsExtra10 | |
| 38 | + | ); | |
| 39 | + | //... | |
| 40 | + | procedure RegisterDrawer(ADrawer: TCDDrawer; AStyle: TCDDrawStyle); | |
| 41 | + | function GetDefaultDrawer: TCDDrawer; | |
| 42 | + | function GetDrawer(AStyle: TCDDrawStyle): TCDDrawer; | |
| 43 | + | ||
| 44 | + | var | |
| 45 | + | DefaultStyle: TCDDrawStyle = dsCommon; // В начале по умолчанию стандартный, позже для каждой платформы | |
| 46 | + | ``` | |
| 47 | + | ||
| 48 | + | Каждый класс Drawer имеет методы для рисования всех элементов управления, а также всех доступных примитивов. Все новые Drawer'а, созданные пользователями, должны наследоваться от класса TCDCommonDrawer (который является основным общим Drawer, объявленным в модуле customdrawn_common.pas). Если Вы не будете наследоваться от TCDCommonDrawer, Ваше приложение может аварийно завершить работу, если оно попадет в абстрактный метод. TCDCommonDrawer наиболее полный блок, который реализует все абстрактные методы из своего базового класса, поэтому наследование от него гарантирует, что никогда не произойдет сбоев из-за методов, которые Вы еще не реализовали. Другие Drawer'а могут переопределять нужные методы для изменения стиля рисования. | |
| 49 | + | ||
| 50 | + | Стиль прорисовки dsCommon использует только TCanvas для всего своего рендеринга, но другие темы могут также использовать TLazIntfImage и TFPImageCanvas, чтобы иметь более быстрый доступ к пикселям. Этот метод программирования описан в [[Developing with Graphics|Developing with Graphics#Working with TLazIntfImage]]. | |
| 51 | + | ||
| 52 | + | ### Цветовая палитра | |
| 53 | + | ||
| 54 | + | Drawer'а также имеют доступ к цветовой палитре, которая имеет обычные системные цвета LCL. Drawer'а по умолчанию будут загружать свои цвета из операционной системы через LCL в соответствии с собственной платформой. Однако, за пределами своей родной платформы, ящики будут использовать стандартную цветовую палитру. | |
| 55 | + | ||
| 56 | + | ``` pascal | |
| 57 | + | TCDColorPalette = class | |
| 58 | + | public | |
| 59 | + | ScrollBar, Background, ActiveCaption, InactiveCaption, | |
| 60 | + | Menu, Window, WindowFrame, MenuText, WindowText, CaptionText, | |
| 61 | + | ActiveBorder, InactiveBorder, AppWorkspace, Highlight, HighlightText, | |
| 62 | + | BtnFace, BtnShadow, GrayText, BtnText, InactiveCaptionText, | |
| 63 | + | BtnHighlight, color3DDkShadow, color3DLight, InfoText, InfoBk, | |
| 64 | + | // | |
| 65 | + | HotLight, GradientActiveCaption, GradientInactiveCaption, | |
| 66 | + | MenuHighlight, MenuBar, Form: TColor; | |
| 67 | + | end; | |
| 68 | + | ||
| 69 | + | { Существует 5 возможных источников ввода цветовых палитр: | |
| 70 | + | palDefault - Использовать palNative, когда операционная система соответствует стилю Drawer, в противном случае - palFallback | |
| 71 | + | palNative - Получить из операционной системы | |
| 72 | + | palFallback - Использовать запасные цвета Drawer | |
| 73 | + | palUserConfig-Загрузить из пользовательских файлов конфигурации, ToDo | |
| 74 | + | palCustom - Пользовательское приложение установило свою палитру | |
| 75 | + | } | |
| 76 | + | TCDPaletteKind = (palDefault, palNative, palFallback, palUserConfig, palCustom); | |
| 77 | + | ||
| 78 | + | { TCDDrawer } | |
| 79 | + | ||
| 80 | + | TCDDrawer = class | |
| 81 | + | protected | |
| 82 | + | public | |
| 83 | + | Palette: TCDColorPalette; | |
| 84 | + | constructor Create; virtual; | |
| 85 | + | destructor Destroy; override; | |
| 86 | + | procedure SetPaletteKind(APaletteKind: TCDPaletteKind); | |
| 87 | + | procedure LoadNativePaletteColors; | |
| 88 | + | procedure LoadFallbackPaletteColors; virtual; | |
| 89 | + | ``` | |
| 90 | + | ||
| 91 | + | Как показывает приведенный выше код, Вы можете выбрать, откуда должны поступать цвета - либо из текущей темы операционной системы, либо из заданного по умолчанию Drawer, либо из пользовательской схемы, предоставленной Вашим приложением. Это позволяет вам изменять все цвета вашего приложения во время выполнения, просто изменяя палитру. | |
| 92 | + | ||
| 93 | + | ## Drawer'а | |
| 94 | + | ||
| 95 | + | ### dsCommon | |
| 96 | + | ||
| 97 | + | Это базовый Drawer для всех остальных, в нем реализован внешний вид Win2000 с некоторыми небольшими улучшениями, такими как лучшая фокусировка рисунков на элементах управления. | |
| 98 | + | ||
| 99 | + | ### dsWinCE | |
| 100 | + | ||
| 101 | + | Имитирует внешний вид Windows CE с некоторыми небольшими улучшениями, такими как улучшение фокусировки рисунков на элементах управления | |
| 102 | + | ||
| 103 | + | ### dsWin2000 | |
| 104 | + | ||
| 105 | + | Имитирует внешний вид Windows 2000. Поскольку dsCommon обеспечивает внешний вид Windows 2000, то этот класс вообще не реализует собственные методы. | |
| 106 | + | ||
| 107 | + | ### dsWinXP | |
| 108 | + | ||
| 109 | + | Имитирует внешний вид Windows XP | |
| 110 | + | ||
| 111 | + | ### dsKDEPlastique | |
| 112 | + | ||
| 113 | + | Имитирует внешний вид темы Plastique Qt / KDE | |
| 114 | + | ||
| 115 | + | ### dsAndroid | |
| 116 | + | ||
| 117 | + | Имитирует внешний вид Android | |
| 118 | + | ||
| 119 | + | ### dsWindows7 | |
| 120 | + | ||
| 121 | + | <figure> | |
| 122 | + | <img src="customdrawnwindows7.png" title="customdrawnwindows7.png" /> | |
| 123 | + | <figcaption>customdrawnwindows7.png</figcaption> | |
| 124 | + | </figure> | |
| 125 | + | ||
| 126 | + | Имитирует внешний вид Windows 7, а также может использоваться для имитации внешнего вида Windows XP и Windows 8, а также большинства стилей или оболочек Windows. В настоящее время доступен только с графической библиотекой BGRABitmap, и вы можете получить этот Drawer в пакете BGRAControls: [[BGRAControls]] | |
| 127 | + | ||
| 128 | + | Вы можете попытаться заставить это работать, если Вы конвертируете модуль slicescaling.pas. Техника, используемая для рисования изображений, - это 9-фрагментное масштабирование. | |
| 129 | + | ||
| 130 | + | Некоторый рабочий код для создания 9-фрагментного масштабирования доступен здесь: <http://sourceforge.net/p/bmpthemeutils/home/Home/> | |
| 131 | + | ||
| 132 | + | ## Элементы управления, которые имитируют Standard Palette | |
| 133 | + | ||
| 134 | + | ### TCDButton | |
| 135 | + | ||
| 136 | + | Это кнопка, с полностью настраиваемой прорисовкой. | |
| 137 | + | ||
| 138 | + | Пример использования: | |
| 139 | + | ||
| 140 | + | ``` pascal | |
| 141 | + | uses customdrawnextras; | |
| 142 | + | ||
| 143 | + | procedure TForm1.FormCreate(Sender: TObject); | |
| 144 | + | var | |
| 145 | + | MyButton: TCDButton; | |
| 146 | + | begin | |
| 147 | + | MyButton := TCDButton.Create(Self); | |
| 148 | + | MyButton.Parent := Self; | |
| 149 | + | MyButton.DrawStyle := dsWin2000; | |
| 150 | + | MyButton.Left := 100; | |
| 151 | + | MyButton.Top := 100; | |
| 152 | + | MyButton.Width := 200; | |
| 153 | + | MyButton.Height := 50; | |
| 154 | + | MyButton.Caption := 'My Button'; | |
| 155 | + | MyButton.Color := clRed; | |
| 156 | + | MyButton.OnClick := @HandleButtonClick; | |
| 157 | + | end; | |
| 158 | + | ``` | |
| 159 | + | ||
| 160 | + | <figure> | |
| 161 | + | <img src="Custom_drawn_buttons.png" title="Custom_drawn_buttons.png" /> | |
| 162 | + | <figcaption>Custom_drawn_buttons.png</figcaption> | |
| 163 | + | </figure> | |
| 164 | + | ||
| 165 | + | ### TCDEdit | |
| 166 | + | ||
| 167 | + | Это текстовое поле, с полностью настраиваемой прорисовкой. | |
| 168 | + | ||
| 169 | + | <figure> | |
| 170 | + | <img src="TCDEdit.png" title="TCDEdit.png" /> | |
| 171 | + | <figcaption>TCDEdit.png</figcaption> | |
| 172 | + | </figure> | |
| 173 | + | ||
| 174 | + | ### TCDCheckBox | |
| 175 | + | ||
| 176 | + | Это флажок, с полностью настраиваемой прорисовкой. | |
| 177 | + | ||
| 178 | + | <figure> | |
| 179 | + | <img src="TCDCheckBox.png" title="TCDCheckBox.png" /> | |
| 180 | + | <figcaption>TCDCheckBox.png</figcaption> | |
| 181 | + | </figure> | |
| 182 | + | ||
| 183 | + | ### TCDRadioButton | |
| 184 | + | ||
| 185 | + | Это переключатель, с полностью настраиваемой прорисовкой. | |
| 186 | + | ||
| 187 | + | <figure> | |
| 188 | + | <img src="TCDRadioButton.png" title="TCDRadioButton.png" /> | |
| 189 | + | <figcaption>TCDRadioButton.png</figcaption> | |
| 190 | + | </figure> | |
| 191 | + | ||
| 192 | + | ### TCDScrollBar | |
| 193 | + | ||
| 194 | + | Это панель прокрутки, с полностью настраиваемой прорисовкой. | |
| 195 | + | ||
| 196 | + | <figure> | |
| 197 | + | <img src="TCDScrollBar.png" title="TCDScrollBar.png" /> | |
| 198 | + | <figcaption>TCDScrollBar.png</figcaption> | |
| 199 | + | </figure> | |
| 200 | + | ||
| 201 | + | ### TCDGroupBox | |
| 202 | + | ||
| 203 | + | Это групповой контейнер, с полностью настраиваемой прорисовкой. | |
| 204 | + | ||
| 205 | + | <figure> | |
| 206 | + | <img src="TCDGroupBox.png" title="TCDGroupBox.png" /> | |
| 207 | + | <figcaption>TCDGroupBox.png</figcaption> | |
| 208 | + | </figure> | |
| 209 | + | ||
| 210 | + | ## Элементы управления, имитирующие Additional Palette | |
| 211 | + | ||
| 212 | + | ### TCDStaticText | |
| 213 | + | ||
| 214 | + | ## Элементы управления, имитирующие Common Controls Palette | |
| 215 | + | ||
| 216 | + | ### TCDTrackBar | |
| 217 | + | ||
| 218 | + | Замена для TTrackBar | |
| 219 | + | ||
| 220 | + | <figure> | |
| 221 | + | <img src="TCDTrackBar.png" title="TCDTrackBar.png" /> | |
| 222 | + | <figcaption>TCDTrackBar.png</figcaption> | |
| 223 | + | </figure> | |
| 224 | + | ||
| 225 | + | ### TCDProgressBar | |
| 226 | + | ||
| 227 | + | <figure> | |
| 228 | + | <img src="TCDProgressBar.png" title="TCDProgressBar.png" /> | |
| 229 | + | <figcaption>TCDProgressBar.png</figcaption> | |
| 230 | + | </figure> | |
| 231 | + | ||
| 232 | + | ### TCDListView | |
| 233 | + | ||
| 234 | + | В разработке. | |
| 235 | + | ||
| 236 | + | ### TCDTabControl | |
| 237 | + | ||
| 238 | + | Замена для TTabControl | |
| 239 | + | ||
| 240 | + | ### TCDPageControl | |
| 241 | + | ||
| 242 | + | Замена для TPageControl | |
| 243 | + | ||
| 244 | + | <figure> | |
| 245 | + | <img src="TCDPageControl.png" title="TCDPageControl.png" /> | |
| 246 | + | <figcaption>TCDPageControl.png</figcaption> | |
| 247 | + | </figure> | |
| 248 | + | ||
| 249 | + | ## Пакет Custom Drawn | |
| 250 | + | ||
| 251 | + | Находится здесь: [[Lazarus Custom Drawn Package]] | |
| 252 | + | ||
| 253 | + | ## Другие хорошие custom drawn компоненты для Lazarus | |
| 254 | + | ||
| 255 | + | - [[VirtualTreeview]] | |
| 256 | + | - [[ATTabs]] | |
| 257 | + | - [[ATStatusBar]] | |
| 258 | + | - [[ATScrollBar]] | |
| 259 | + | ||
| 260 | + | ## Сопровождающие | |
| 261 | + | ||
| 262 | + | - Felipe Monteiro de Carvalho | |
| 263 | + | - JiXian Yang | |
| 264 | + | ||
| 265 | + | ## Смотрите также | |
| 266 | + | ||
| 267 | + | - [[Lazarus Components Directory]] | |
| 268 | + | - [[Lazarus Custom Drawn Package]] | |
| 269 | + | - [[Custom Drawn Interface]] | |
| 270 | + | ||
| 271 | + | --- | |
| 272 | + | *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).* |
