Читать книгу Delphi. Трюки и эффекты - Александр Чиртик - Страница 12
Глава 1
Окна
1.6. Масштабирование окон
ОглавлениеВозможность масштабирования окон (форм) является интересным приемом, который может быть заложен в дизайн приложения.
При этом имеется в виду масштабирование в буквальном смысле этого слова: как пропорциональное изменение размера элементов управления формы, так и изменение размера шрифта.
Использовать масштабирование при работе с Delphi крайне просто, ведь в класс TWinControl, от которого наследуются классы форм, встроены методы масштабирования. Вот некоторые из них:
• ScaleControls – пропорциональное изменение размера элементов управления на форме;
• ChangeScale – пропорциональное изменение размера элементов управления с изменением шрифта, которым выводится текст в них.
Оба приведенных метода принимают два целочисленных параметра: числитель и знаменатель нового масштаба формы. Пример задания параметров для методов масштабирования приводится в листинге 1.25.
Листинг 1.25. Масштабирование формы с изменением шрифта
procedure TfrmScaleBy.cmbSmallerClick(Sender: TObject);
begin
ChangeScale(80, 100); //Уменьшение на 20 % (новый масштаб – 80 %)
end;
procedure TfrmScaleBy.cmbBiggerClick(Sender: TObject);
begin
ChangeScale(120, 100); //Увеличение на 20 % (новый масштаб – 120 %)
end;
Чтобы размер шрифта правильно устанавливался, для элементов управления нужно использовать шрифты семейства TrueType (в нашем примере это шрифт Times New Roman).
На рис. 1.16 приводится внешний вид формы до изменения масштаба.
Рис. 1.16. Форма в оригинальном масштабе
Внешний вид формы после уменьшения масштаба в 1,25 раза (новый масштаб составляет 80 % от первоначального) демонстрируется на рис. 1.17.
Рис. 1.17. Форма в масштабе 80 %
То, что форма не изменяет своего размера при масштабировании, можно легко исправить, установив, например, свойство AutoSize в True при помощи редактора свойств объектов (Object Inspector).
Если по каким-либо причинам использование свойства AutoSize вас не устраивает, то можно рассчитать новый размер формы самостоятельно. Только пересчитывать нужно размер не всего окна, а его клиентской области, ведь строка заголовка при масштабировании остается без изменений. Расчет размера окна можно выполнить так:
1. Получить прямоугольник клиентской области окна (GetClientRect).
2. Посчитать новый размер клиентской области.
3. Рассчитать разницу между новой и первоначальной шириной, новой и первоначальной высотой клиентской области; сложить полученные значения с первоначальными размерами самой формы.
Пример расчета приводится ниже (для увеличения размера клиентской области в 1,2 раза):
GetClientRect(Handle, rc);
newWidth := (rc.Right – rc.Left) * 120 div 100;
newHeight := (rc.Bottom – rc.Top) * 120 div 100;
Width := Width + newWidth – (rc.Right – rc.Left);
Height := Height + newHeight – (rc.Bottom – rc.Top);
Примечание
Чтобы после уменьшения или увеличения масштаба формы можно было вернуться в точности к первоначальному масштабу (при помощи соответствующей обратной операции), нужно для уменьшения или увеличения использовать коэффициенты, произведение которых равно 1. Например, при уменьшении масштаба на 20 % (в 0,8 раза) его нужно увеличивать при обратной операции на 25 % (в 1/0,8 = 1,25 раза).