Программирование в Delphi. Трюки и эффекты. Александр Чиртик
Читать онлайн книгу.не изменяется. Расчет размера окна можно выполнить следующим образом.
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);
Примечание
Чтобы после изменения масштаба формы можно было вернуться в точности к исходному масштабу (с помощью соответствующей обратной операции), нужно для уменьшения и увеличения использовать коэффициенты, произведение которых равно единице. Например, при уменьшении масштаба на 20 % (в 0,8 раз) его нужно увеличивать при обратной операции на 25 % (в 1/0,8 = 1,25 раза).
Добавление команды в системное меню окна
Обратите внимание на меню, раскрывающееся при щелчке кнопкой мыши на значке окна. В этом системном меню обычно присутствуют пункты, выполняющие стандартные действия над окном, такие как закрытие, минимизация, максимизация и др. Для доступа к этому меню предусмотрены специальные функции, что дает возможность использовать его в своих целях.
Для получения дескриптора (HMENU) системного меню окна используется API-функция GetSystemMenu, а для добавления пункта в меню – функция AppendMenu. Пример процедуры, добавляющей пункты в системное меню, приведен в листинге 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;
В результате выполнения этого кода системное меню формы Form1 станет похожим на меню, показанное на рис. 1.18.
Рис. 1.18. Пользовательские команды в системном меню
Однако недостаточно просто создать команды меню – нужно предусмотреть обработку их выбора. Это делается в обработчике сообщения WM_SYSCOMMAND (листинг 1.27).
procedure TForm1.WMSysCommand(var Message: TWMSysCommand);
begin
if Message.CmdType = 10001 then
//Увеличение масштаба
ChangeScale(120, 100)
else if Message.CmdType = 10002 then
ChangeScale(80, 100)
else
//Обработка по умолчанию
DefWindowProc(Handle, Message.Msg, Message.CmdType, 65536 * Message.YPos+ Message.XPos);
end;
Обратите внимание на то, что числовые значения, переданные в функцию Append-Menu, используются для определения, какой именно пунктменю выбран. Чтобы меню работало стандартным образом, все поступающие от него команды должны быть обработаны. Поэтому для всех команд, реакция на которые не заложена в реализованном обработчике, вызывается обработчик по умолчанию (функция DefWindowProc).
Отображение формы поверх других окон
Иногда вам может пригодиться возможность отображения формы поверх всех окон. За примером далеко ходить не надо: посмотрите на окно Диспетчера задач Windows. Теперь