Delphi. Трюки и эффекты. Александр Чиртик

Читать онлайн.
Название Delphi. Трюки и эффекты
Автор произведения Александр Чиртик
Жанр Программы
Серия
Издательство Программы
Год выпуска 0
isbn 978-5-911-80219-6



Скачать книгу

к первоначальному масштабу (при помощи соответствующей обратной операции), нужно для уменьшения или увеличения использовать коэффициенты, произведение которых равно 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);

      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;

      Обратите внимание на то, что числовые значения, которые переданы в функцию AppendMenu, используются для определения, какой именно пункт меню выбран. Чтобы меню вело себя обычным образом, все поступающие от него команды должны быть обработаны. Поэтому для всех команд, реакция на которые не заложена в реализованном нами обработчике, вызывается обработчик по умолчанию (функция DefWindowProc).

      1.8. Отображение формы поверх других окон

      Иногда вам может пригодиться возможность отображения формы поверх всех окон. За примером далеко ходить не надо: посмотрите на окно Диспетчера задач Windows. А теперь вспомните, терялось ли хоть раз окно Свойства: Экран среди других открытых окон. Это происходит из-за того, что оно перекрывается другими окнами и при этом не имеет никакого значка на Панели задач (правда, это окно все же можно найти с помощью Диспетчера задач).

      Из сказанного выше можно заключить, что как минимум в двух случаях отображение поверх других окон может пригодиться: для важных окон приложения (например, окно ввода пароля) и/или в случае, если значок приложения не выводится на Панели задач (как скрыть значок, было рассказано выше).

      После небольшого отступления рассмотрим способы, позволяющие задать положение формы так, чтобы другие окна не могли ее закрыть.

      Первый