
- •Валерий Викторович Борисок Юрий Иванович Корвель Александр Анатольевич Чиртик 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. Определение информации о клавиатуре
- •Конец ознакомительного фрагмента.
Окно выбора цвета
Вызов следующего диалогового окна – окна выбора цвета – приводится в листинге 2.26.
Листинг 2.26. Окно выбора цвета
function ShowChooseColor(lastColor: COLORREF = 0):COLORREF;
var
choose: TChooseColor;
begin
ZeroMemory(Addr(choose), SizeOf(choose));
//Заполнение структуры для диалогового окна
choose.lStructSize := SizeOf(choose);
choose.hWndOwner := hParentWnd;
choose.hInstance := hAppInst;
choose.rgbResult := lastColor;
choose.lpCustColors := Addr(colors);
choose.Flags := CC_RGBINIT or CC_ANYCOLOR or CC_FULLOPEN;
//Отображение окна диалога и обработка результата
if (ChooseColor(choose) = True) then ShowChooseColor :=
choose.rgbResult
else ShowChooseColor := lastColor;
end;
Здесь также заполняется структура похожего назначения. Используются следующие флаги диалогового окна:
• CC_RGBINIT – использовать значение поля rgbResult в качестве предустановленного значения цвета (по умолчанию как ранее выбранного);
• CC_ANYCOLOR – отображать все доступные предопределенные цвета (левая часть, рис. 2.4);
• CC_FULLOPEN – раскрывать панель подбора цвета (правая часть, рис. 2.4).
Рис. 2.4. Окно выбора цвета
Поясним, что за переменная, а точнее, ее адрес, сохраняется в поле lpCustColors – это массив из 16 значений типа COLORREF:
colors: array [1..16] of COLORREF;
Обратите внимание на 16 квадратов в левой нижней области окна (рис. 2.4) – это места для определенных пользователем цветов. Для заполнения этой области окна и используются значения из массива colors. Массив может быть как локальным, так и глобальным (что удобнее, так как значения определенных пользователем цветов сохраняются между вызовами диалогового окна).
Окно выбора шрифта
Для вывода диалогового окна выбора шрифта вполне подойдет функция, приведенная в листинге 2.27.
Листинг 2.27. Окно выбора шрифта
function ShowChooseFont(var font: LOGFONT):BOOL;
var
choose: TChooseFont;
begin
ZeroMemory(Addr(choose), SizeOf(choose));
//Заполнение структуры для диалогового окна
choose.lStructSize := SizeOf(choose);
choose.hWndOwner := hParentWnd;
choose.hInstance := hAppInst;
choose.lpLogFont := Addr(font);
choose.Flags := CF_BOTH or CF_INITTOLOGFONTSTRUCT;
//Отображение окна диалога и обработка результата
if (ChooseFont(choose) = True) then
begin
CopyMemory(Addr(font), choose.lpLogFont, SizeOf(font));
ShowChooseFont := True;
end
else ShowChooseFont := False;
end;
Здесь используются флаги окна, имеющие следующие значения:
• CF_BOTH – отображать экранные и принтерные шрифты (для показа экранных или принтерных шрифтов можно использовать флаги CFSCREENFONTS и CF_PRINTERFONTS соответственно);
• CF_INITTOLOGFONTSTRUCT – выбрать в диалоговом окне шрифт, соответствующий (или максимально похожий) шрифту, описываемому структурой LOGFONT, указатель на которую сохраняется в поле lpLogFont.
Окно выбора папки
Чтобы иметь возможность пользоваться окном Обзор папок для выбора папки, можно использовать листинг 2.28.
Листинг 2.28. Окно выбора папки
function ShowChooseFolder(strTitle: string):string;
var
choose: BROWSEINFO;
buffer: string;
pidl: PItemIDList;
begin
ZeroMemory(Addr(choose), SizeOf(choose));
SetLength(buffer, MAX_PATH);
//Заполнение структуры для диалога
choose.hwndOwner := hParentWnd;
choose.pidlRoot := nil; //Корень – папка Рабочего стола
choose.pszDisplayName := PAnsiChar(buffer);
choose.lpszTitle := PAnsiChar(strTitle);
choose.ulFlags := 0;
//Вывод диалогового окна и обработка результата
pidl := SHBrowseForFolder(choose);
if (pidl <> nil) then
begin
//Получение полного пути выбранной папки
SHGetPathFromIDList(pidl, PAnsiChar(buffer));
ShowChooseFolder := buffer;
DeletePIDL(pidl);
end
else
ShowChooseFolder := '';
end;
В листинге 2.28 функция ShowChooseFolder возвращает полный путь указанной папки, если она выбрана, и пустую строку в противном случае. Само окно Обзор папок показано на рис. 2.5.
Рис. 2.5. Окно выбора папки
Особенностью использованной в данном примере функции SHBrowseForFolder является то, что она возвращает не путь выбранного каталога, а указатель на структуру ItemlDList (что‑то вроде внутреннего представления путей). Для извлечения построения пути по содержимому этой структуры используется функция SHGetPathFromlDList. После этого структура нам больше не нужна, и ее следует правильно удалить (с использованием специального интерфейса IMalloc). Для этого используется процедура DeletePIDL, реализованная в листинге 2.29.