
- •Валерий Викторович Борисок Юрий Иванович Корвель Александр Анатольевич Чиртик 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. Определение информации о клавиатуре
- •Конец ознакомительного фрагмента.
Закругленные окна и многоугольники
Сначала самые простые примеры: создание регионов без операций над ними. Формы всех трех приведенных здесь примеров содержат по три кнопки различной ширины и высоты, которым также задаются области отсечения.
Примечание
В приведенных далее примерах регионы для области отсечения окна создаются при обработке события FormCr eate. Однако это сделано только для удобства отладки и тестирования примеров и ни в коем случае не должно наталкивать вас на мысль, что этот способ является единственно правильным. На самом деле, если в приложении много окон, использующих области отсечения сложной формы, то старт приложения (время от момента запуска до показа первой формы) может длиться по крайней мере несколько секунд. Так происходит потому, что все формы создаются перед показом первой (главной) формы (см. DPR‑файл проекта). Исправить ситуацию можно, создавая формы вручную в нужный момент времени либо создавая регионы для областей отсечения, например, перед первым отображением каждой конкретной формы.
Итак, в приведенном ниже обработчике события FormCreate создается окно в форме эллипса с тремя кнопками такой же формы (листинг 1.10).
Листинг 1.10. Окно и кнопки в форме эллипсов
procedure TfrmElliptic.FormCreate(Sender: TObject);
var
formRgn, but1Rgn, but2Rgn, but3Rgn: HRGN;
begin
//Создаем регионы кнопок
but1Rgn:= CreateEllipticRgn(0, 0, Button1.Width–1, Button1.
Height–1);
SetWindowRgn(Button1.Handle, but1Rgn, False);
but2Rgn:= CreateEllipticRgn(0, 0, Button2.Width–1, Button2.
Height–1);
SetWindowRgn(Button2.Handle, but2Rgn, False);
but3Rgn:= CreateEllipticRgn(0, 0, Button3.Width–1, Button3.
Height–1);
SetWindowRgn(Button3.Handle, but3Rgn, False);
//Регион для окна
formRgn:= CreateEllipticRgn(0, 0, Width–1, Height–1);
SetWindowRgn(Handle, formRgn, True);
end;
Ширина и высота эллипсов в приведенном примере равна соответственно ширине и высоте тех окон, для которых создаются регионы (формы и каждой из кнопок). При необходимости это можно изменить, например, если требуется, чтобы все кнопки были одной величины независимо от размера, установленного во время проектирования формы.
Результат работы листинга 1.10 можно увидеть на рис. 1.5.
Рис. 1.5. Окно и кнопки в форме эллипсов
Далее рассмотрим не менее интересный (возможно, даже более полезный на практике) пример, а именно округление углов формы и кнопок на ней, то есть применение к ним области отсечения в форме прямоугольника с округленными углами. Ниже приводится реализация соответствующего обработчика события FormCreate (листинг 1.11).
Листинг 1.11. Окно и кнопки с округленными краями
procedure TfrmRoundRect.FormCreate(Sender: TObject);
var
formRgn, but1Rgn, but2Rgn, but3Rgn: HRGN;
begin
//Создаем регионы для кнопок
but1Rgn:= CreateRoundRectRgn(0, 0, Button1.Width–1,
Button1.Height–1,
Button1.Width div 5,
Button1. Height div 5);
SetWindowRgn(Button1.Handle, but1Rgn, False);
but2Rgn:= CreateRoundRectRgn(0, 0, Button2.Width–1,
Button2.Height–1,
Button2.Width div 5,
Button2.Height div 5);
SetWindowRgn(Button2.Handle, but2Rgn, False);
but3Rgn:= CreateRoundRectRgn(0, 0, Button3.Width–1,
Button3.Height–1,
Button3.Width div 5,
Button3.Height div 5);
SetWindowRgn(Button3.Handle, but3Rgn, False);
//Регион для окна
formRgn:= CreateRoundRectRgn(0, 0, Width–1, Height–1,
Width div 5, Height div 5);
SetWindowRgn(Handle, formRgn, False);
end;
В листинге 1.11 размеры округляющих эллипсов вычисляются в зависимости от размеров конкретного окна (20 % от ширины и 20 % от высоты). Это смотрится не всегда красиво. В качестве альтернативы для ширины и высоты скругляющих эллипсов можно использовать фиксированные небольшие значения.
Результат работы листинга 1.11 можно увидеть на рис. 1.6.
Рис. 1.6. Окно и кнопки с округленными краями
Теперь самый интересный из предусмотренных примеров – создание окна и кнопок в форме многоугольников, а конкретно: окна в форме звезды, кнопок в форме треугольника, пяти– и шестиугольника (рис. 1.7).
Рис. 1.7. Окно и кнопки в форме многоугольников
Создание регионов для областей отсечения формы, показанной на рис. 1.7, выглядит следующим образом (листинг 1.12).