Оценить:
 Рейтинг: 4.6

Программирование в Delphi. Трюки и эффекты

Год написания книги
2010
Теги
<< 1 ... 11 12 13 14 15 16 17 18 19 ... 42 >>
На страницу:
15 из 42
Настройки чтения
Размер шрифта
Высота строк
Поля

Примечание

Чтобы после изменения масштаба формы можно было вернуться в точности к исходному масштабу (с помощью соответствующей обратной операции), нужно для уменьшения и увеличения использовать коэффициенты, произведение которых равно единице. Например, при уменьшении масштаба на 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. Теперь вспомните, терялось ли хоть раз окно Свойства: Экран среди других открытых окон. Это происходит благодаря тому, что это окно перекрывается другими окнами и при этом не имеют никакого значка на Панели задач (правда, это окно все же можно найти с помощью Диспетчера задач).

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

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

Первый способ прост до предела: достаточно присвоить свойству FormStyle в окне Object Inspector значение fsStayOnTo. Результат этого действия показан на рис. 1.19 (обратите внимание, что форма закрывает Панель задач, которая по умолчанию также отображается поверх всех окон).

Рис. 1.19. Форма, отображаемая поверх других окон

Второй способ пригодится, если форма постоянно отображается обычным образом, но в определенные моменты времени требует к себе более пристального внимания, для чего и помещается наверх. Способ основан на использовании API-функции SetWindowPos, которая, кроме позиции и размера окна, может устанавливать и порядок рисования окна (Z-order).

Примечание

Под Z-order подразумевается порядок следования окон вдоль оси Z, направленной перпендикулярно экрану (оси X и Y лежат в плоскости экрана).

Вызов функции SetWindowPos для перемещения окна наверх выглядит следующим образом (Handle – дескриптор нужного окна):

SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE)

В этом случае окно может быть закрыто другим окном, также отображающимся поверх других (например, Диспетчером задач).

Чтобы восстановить нормальное положение (порядок рисования) окна, можно вызвать функцию SetWindowPos со следующим набором параметров:

SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE)

После этого другие окна, не отображаемые поверх других, смогут снова перекрывать форму.

Глава 2

Уменьшение размера EXE-файла. Использование Windows API

• Источник лишних килобайт

• Создание окна вручную

• Окно с элементами управления
<< 1 ... 11 12 13 14 15 16 17 18 19 ... 42 >>
На страницу:
15 из 42

Другие электронные книги автора Александр Анатольевич Чиртик