Александр Чиртик

Программирование в 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.

Листинг 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).

Листинг 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. Теперь