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 раза).
1.7. Добавление пункта в системное меню окна
Обратите внимание на меню, раскрывающееся при щелчке кнопкой мыши на значке окна. В этом системном меню обычно присутствуют пункты, выполняющие стандартные действия над окном, такие, как закрытие, минимизация, максимизация и др. Однако есть функции, позволяющие получить доступ к этому меню, что дает возможность использовать его в своих целях.
Для получения дескриптора (HMENU) системного меню окна используем API-функцию GetSystemMenu, а для добавления пункта в меню – функцию AppentMenu. Пример процедуры, добавляющей пункты в системное меню, приведен в листинге 1.26.
Листинг 1.26. Добавление пунктов в системное меню окна
procedure TForm1.FormCreate(Sender: TObject);
var hSysMenu: HMENU;
begin
hSysMenu := GetSystemMenu(Handle, False);
AppendMenu(hSysMenu, MF_SEPARATOR, 0, '');
AppendMenu(hSysMenu, MF_STRING, 10001, 'Увеличить на 20%');
AppendMenu(hSysMenu, MF_STRING, 10002, 'Уменьшить на 20%');
end;
В результате системное меню формы Forml станет похожим на меню, показанное на рис. 1.18.
Рис. 1.18. Пользовательские пункты в системном меню
Однако мало просто создать пункты меню, нужно предусмотреть обработку их выбора. Это делается в обработчике сообщения WM_SYSCOMMAND (листинг 1.27).
Листинг 1.27. Обработка выбора пользовательских пунктов в системном меню
procedure TForm1.WMSysCommand(var Message: TWMSysCommand);