
- •Валерий Викторович Борисок Юрий Иванович Корвель Александр Анатольевич Чиртик Delphi. Трюки и эффекты
- •Аннотация
- •Александр Чиртик Delphi. Трюки и эффекты Введение
- •От издательства
- •Глава 1 Окна
- •1.1. Привлечение внимания к приложению
- •Инверсия заголовка окна
- •Листинг 1.1. Простая инверсия заголовка окна
- •Листинг 1.2. Десятикратная инверсия заголовка окна
- •Листинг 1.3. Инверсия заголовка окна в течение определенного промежутка времени
- •Активизация окна
- •Листинг 1.4. Активизация окна
- •1.2. Окно приложения
- •Листинг 1.5. Показываем окно приложения
- •Листинг 1.6. Мигание кнопки приложения на Панели задач
- •Листинг 1.7. Мигание кнопки приложения и инверсия заголовка формы
- •1.3. Полупрозрачные окна
- •Листинг 1.8. Динамическое изменение прозрачности окна
- •Листинг 1.9. Исчезновение и появление формы
- •1.4. Окна и кнопки нестандартной формы
- •Регионы. Создание и использование
- •Создание и удаление регионов
- •Регион как область отсечения при рисовании окна
- •Операции над регионами
- •Закругленные окна и многоугольники
- •Листинг 1.10. Окно и кнопки в форме эллипсов
- •Листинг 1.11. Окно и кнопки с округленными краями
- •Листинг 1.12. Окно и кнопки в форме многоугольников
- •Листинг 1.13. Создание треугольника
- •Листинг 1.14. Создание шестиугольника
- •Листинг 1.15. Создание пятиугольника
- •Листинг 1.16. Создание пятиугольной звезды
- •Комбинированные регионы
- •«Дырявая» форма
- •Листинг 1.17. Создание «дырок» в форме
- •Сложная комбинация регионов
- •Листинг 1.18. Сложная комбинация регионов
- •Использование шаблона
- •Листинг 1.19. Построение региона по шаблону
- •Листинг 1.20. Создание региона для области отсечения формы
- •1.5. Немного о перемещении окон
- •Перемещение за клиентскую область
- •Листинг 1.21. Перемещение окна за клиентскую область
- •Перемещаемые элементы управления
- •Листинг 1.22. Разрешение перемещения и изменения размера
- •Листинг 1.23. Запрещение перемещения и изменения размера
- •Листинг 1.24. Управление перемещаемостью элементов управления
- •1.6. Масштабирование окон
- •Листинг 1.25. Масштабирование формы с изменением шрифта
- •1.7. Добавление пункта в системное меню окна
- •Листинг 1.26. Добавление пунктов в системное меню окна
- •Листинг 1.27. Обработка выбора пользовательских пунктов в системном меню
- •1.8. Отображение формы поверх других окон
- •Глава 2 Уменьшение размера ехе‑файла. Использование Windows api
- •2.1. Источник лишних килобайт
- •Листинг 2.1. Содержимое Unitl.Pas
- •Листинг 2.2. Содержимое файла Project1.Dpr
- •Листинг 2.3. Элементарное приложение
- •2.2. Создание окна вручную
- •Листинг 2.4. Регистрация класса окна
- •Листинг 2.5. Функция обработки сообщений
- •Листинг 2.6. Регистрация и создание окна. Цикл обработки сообщений
- •2.3. Окно с элементами управления
- •Создание элементов управления
- •Листинг 2.7. Создание кнопки
- •Листинг 2.8. Создание флажка
- •Листинг 2.9. Создание переключателя
- •Листинг 2.15. Создание многострочного текстового поля
- •Использование элементов управления
- •Листинг 2.16. Управление флажками и переключателями
- •Листинг 2.17. Управление раскрывающимся списком
- •Листинг 2.18. Управление списком
- •Листинг 2.19. Управление текстовыми полями
- •Листинг 2.20. Общие функции и процедуры
- •Реакция на события элементов управления
- •Пример приложения
- •Листинг 2.21. Создание главного окна приложения (с элементами управления)
- •Листинг 2.22. Функция обработки сообщений
- •2.4. Стандартные диалоговые окна Windows
- •Окно открытия/сохранения файла
- •Листинг 2.23. Окно открытия файла
- •Листинг 2.24. Преобразование строки фильтра
- •Листинг 2.25. Окно сохранения файла
- •Окно выбора цвета
- •Листинг 2.26. Окно выбора цвета
- •Окно выбора шрифта
- •Листинг 2.27. Окно выбора шрифта
- •Окно выбора папки
- •Листинг 2.28. Окно выбора папки
- •Листинг 2.29. Удаление структуры ItemlDList
- •Окна подключения и отключения сетевого ресурса
- •Листинг 2.30. Окно подключения сетевого ресурса
- •Листинг 2.31. Окно отключения сетевого ресурса
- •Системное окно «о программе»
- •Листинг 2.32. Окно «о программе»
- •Демонстрационное приложение
- •Листинг 2.33. Глобальные переменные, код создания окна и цикл обработки сообщений
- •Листинг 2.34. Функция обработки сообщений
- •2.5. Установка шрифта элементов управления
- •Листинг 2.35. Установка шрифта по ходу создания элементов управления
- •Листинг 2.36. Установка шрифта перебором элементов управления
- •Листинг 2.37. Реализация функции EnumFunc
- •Глава 3 Мышь и клавиатура
- •3.1. Мышь
- •Координаты и указатель мыши
- •Листинг 3.1. Как узнать, присутствует ли мышь
- •Листинг 3.2. Определение координат указателя мыши
- •Листинг 3.3. Скрытие указателя мыши
- •Листинг 3.4. Изменение координат мыши
- •Захват указателя мыши
- •Листинг 3.5. Захват и освобождение указателя мыши
- •Ограничение перемещения указателя
- •Листинг 3.6. Ограничение перемещения указателя
- •Изменение назначения кнопок мыши
- •Листинг 3.7. Изменение назначения кнопок мыши
- •Подсчет расстояния, пройденного указателем мыши
- •Листинг 3.8. Форма для измерения пробега указателя
- •Листинг 3.9. Перевод расстояния в метры с учетом масштаба
- •Листинг 3.10. Подсчет разницы между положениями указателя мыши
- •Листинг 3.11. Активизация/деактивизация режима ввода масштаба
- •Листинг 3.12. Включение/выключение обновления результатов измерения
- •Листинг 3.13. Инициализация при запуске и код сброса счетчика
- •Подсвечивание элементов управления
- •Листинг 3.14. Подчеркивание и изменение цвета надписи
- •Листинг 3.15. Изменение начертания шрифта
- •3.2. Клавиатура
- •Определение информации о клавиатуре
- •Листинг 3.16. Определение информации о клавиатуре
- •Конец ознакомительного фрагмента.
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. А теперь вспомните, терялось ли хоть раз окно Свойства: Экран среди других открытых окон. Это происходит из‑за того, что оно перекрывается другими окнами и при этом не имеет никакого значка на Панели задач (правда, это окно все же можно найти с помощью Диспетчера задач).
Из сказанного выше можно заключить, что как минимум в двух случаях отображение поверх других окон может пригодиться: для важных окон приложения (например, окно ввода пароля) и/или в случае, если значок приложения не выводится на Панели задач (как скрыть значок, было рассказано выше).
После небольшого отступления рассмотрим способы, позволяющие задать положение формы так, чтобы другие окна не могли ее закрыть.
Первый способ прост «до безобразия»: достаточно задать свойству FormStyle в окне Object Inspector значение f sStayOnTo. Результат этого действия показан на рис. 1.19 (обратите внимание, что форма закрывает Панель задач, которая по умолчанию также отображается поверх всех окон).
Рис. 1.19. Форма, отображаемая поверх других окон
Второй способ пригодится, если форма отображается постоянно как обычно, однако в определенные моменты времени требует к себе пристального внимания, для чего и помещается наверх. Способ основан на использовании API‑функции SetWindowPos, которая кроме позиции и размера окна может еще устанавливать порядок рисования окна (Z‑order).
Примечание
Под Z‑order подразумевается порядок следования окон вдоль оси Z, направленной перпендикулярно экрану (оси X и Улежат в плоскости экрана).
Вызов функции 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)
После этого другие, неотображаемые поверх остальных, окна могут снова перекрывать нашу форму.