
- •Валерий Викторович Борисок Юрий Иванович Корвель Александр Анатольевич Чиртик 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.1. Простая инверсия заголовка окна
procedure TForm1.cmbFlashOnceClick(Sender: TObject);
begin
FlashWindow(Handle, True);
end;
Как видите, функция принимает дескриптор нужного окна и параметр (тип BOOL) инверсии. Если значение флага равно True, то состояние заголовка окна изменяется на противоположное (из активного становится неактивным и наоборот). Если значение флага False, то состояние заголовка окна восстанавливается в свое первоначальное значение (активно или неактивно).
Более сложная функция FlashWindowEx в качестве дополнительного параметра (кроме дескриптора окна) принимает структуру FLASHWINFO, заполняя поля которой, можно настроить параметры мигания кнопки приложения и/или заголовка окна.
В табл. 1.1 приведено описание полей структуры FLASHWINFO.
Таблица 1.1. Поля структуры FLASHWINFO
Значение параметра dwFlags формируется из приведенных ниже флагов с использованием операции побитового ИЛИ:
• FLASHW_CAPTION – инвертирует состояние заголовка окна;
• FLASHWTRAY–заставляет мигать кнопку на Панели задач;
• FLASHW_ALL – сочетание FLASHW_CAPTION И FLASHW_TRAY;
• FLASHW_TIMER – периодическое изменение состояния заголовка окна и/или кнопки на Панели задач вплоть до того момента, пока фyнкцияFlashWindowEx не будет вызвана с флагом FLASHW_STOP;
• FLASHW_TIMERNOFG – периодическое изменение состояния заголовка окна и/или кнопки на Панели задач до тех пор, пока окно не станет активным;
• FLASHWSTOP – восстанавливает исходное состояние окна и кнопки на Панели задач.
Далее приведены два примера использования функции FlashWindowEx.
В первом – состояние заголовка окна и кнопки на Панели задач изменяется десять раз каждые 0,2 секунды (листинг 1.2).
Листинг 1.2. Десятикратная инверсия заголовка окна
procedure TForm1.cmbInverse10TimesClick(Sender: TObject);
var
fl: FLASHWINFO;
begin
fl.cbSize:= SizeOf(fl);
fl.hwnd:= Handle;
fl.dwFlags:= FLASHW_CAPTION or FLASHW_TRAY; // аналогично
FLASHW_ALL
fl.uCount:= 10;
fl.dwTimeout:= 200;
FlashWindowEx(fl);
end;
Второй пример демонстрирует использование флаговРЬАЗШ_Т1МЕРч и FLASHW_STOP для инверсии заголовка окна в течение заданного промежутка времени (листинг 1.3).
Листинг 1.3. Инверсия заголовка окна в течение определенного промежутка времени
//Запуск процесса периодической инверсии заголовка
procedure TForm1.cmbFlashFor4SecClick(Sender: TObject);
var
fl: FLASHWINFO;
begin
fl.cbSize:= SizeOf(fl);
fl.hwnd:= Handle;
fl.dwTimeout:= 200;
fl.dwFlags:= FLASHW_ALL or FLASHW_TIMER;
fl.uCount:= 0;
FlashWindowEx(fl);
Timer1.Enabled:= True;
end;
//Остановка инверсии заголовка
procedure TForm1.Timer1Timer(Sender: TObject);
var
fl: FLASHWINFO;
begin
fl.cbSize:= SizeOf(fl);
fl.hwnd:= Handle;
fl.dwFlags:= FLASHW_STOP;
FlashWindowEx(fl);
Timer1.Enabled:= False;
end;
В данном примере подразумевается использование таймера, срабатывающего каждые четыре секунды. Таймер первоначально неактивен. Конечно, можно было бы не использовать его, а просто посчитать количество инверсий, попадающих в нужный интервал времени (в данном случае четыре секунды), и задать его в поле uCount. Но приведенный пример рассчитан именно на демонстрацию использования флагов FLASHW_TIMERH flashw_stop.