Проектирование графического интерфейса пользователя______________251

где М и D — множитель и делитель, определяющие изменение масштаба компо-
нента. Масштабируются такие свойства компонента, как Width и Height, опреде-
ляющие его размер. Свойства Тор и Left остаются неизменными. Масштабируется
также размер шрифта, если только в компоненте не установлено ParentFon = true.
В последнем случае шрифт наследуется от родительского компонента и поэтому не
изменяется.

Если компонент является контейнером, содержащим другие компоненты, то
его дочерние компоненты также масштабируются. Причем у них изменяются не
только Width и Height, но также пропорционально изменяются Тор и Left, опре-
деляющие их местоположение. Если во всех дочерних компонентах установлено
ParentFont = true, а в компоненте-контейнере ParentFont = false, то пропорцио-
нально изменяются и шрифты всех компонентов (но, конечно, не непрерывно, а
скачками, доступными тому или иному типу шрифта).

Параметры М and D определяют соответственно множитель и делитель масш-
таба. Например, чтобы уменьшить размеры на 10% от начального значения, мож-
но задать М равным 9, а D равным 10 (9/10). Если же вы хотите увеличить размер
на 1/3, то можно задать М=133 и D=100 (133/100) или М=4 и D=3 (4/3).

Приведем примеры. Оператор

Editl->ScaleBy(ll,10) ;

масштабирует окно редактирования Editl. В любом случае при выполнении этого
оператора длина окна (свойство Width) увеличивается на 10%, что обеспечивает
возможность наблюдать и редактировать в нем более длинный текст. Высота окна
(свойство Height) будет изменяться пропорционально, только если свойство ком-
понента AutoSize равно false. В противном случае высота определяется только
размером шрифта и при постоянном шрифте будет неизменной. А размер шрифта
будет меняться, только если свойство компонента ParentFont равно false, т.к. ина-
че шрифт определяется родительским компонентом. Таким образом при AutoSize
= true и ParentFont = true изменяется только длина окна редактирования, т.е.
приведенный выше оператор эквивалентен оператору

Editl->Width = 11 * Editl->Width / 10;

но компактнее.

Подобный оператор можно использовать для предоставления пользователю
возможности самому менять длину окна редактирования. Можно ввести для окна,
например, комбинации клавиш Alt+U и Alt+D, нажимая которые пользователь бу-
дет при необходимости увеличивать или уменьшать его длину. Чтобы сделать это,
можно написать следующий обработчик события OnKeyUp (события, связанные с
клавиатурой, рассмотрены в разделе 4.3.2):

void_fastcall TFormI::EditlKeyUp(TObject *Sender, WORD &Key,

TShiftState Shift)
(

if ((Key == 'U') && Shift.Contains(ssAlt) )
Editl->ScaleBy(11,10);

else if ((Key == 'D') && Shift.Contains(ssAlt))
Editl->ScaleBy(10,ll) ;

)

Когда Editl находится в фокусе, при нажатии пользователем клавиши Alt и
клавиши U (в любом регистре и независимо от переключения на латинский или
русский язык) длина окна редактирования увеличится на 10%, а при нажатии Alt
и D соответственно уменьшится.

Установив для окна редактирования ParentFont = false, можно получить од-
новременно с изменением размера окна и изменение размера шрифта. Это может
быть полезно пользователю, поскольку зрение у всех разное и пользователю может
захотеться, например, увеличить размер символов. На рис. 4.10 приведено четыре