
- •Валерий Викторович Борисок Юрий Иванович Корвель Александр Анатольевич Чиртик 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.15. Создание многострочного текстового поля
function CreateMemo(x, y, width, height, id: Integer;
strInitText: String):HWND;
begin
CreateMemo:=
CreateWindowEx(WS_EX_CLIENTEDGE, 'EDIT',
PAnsiChar(strInitText),
WS_CHILD or WS_VISIBLE or ES_AUTOVSCROLL or
ES_MULTILINE or WS_TABSTOP,
x, y, width, height, hParentWnd,
HMENU(id), hAppInst, nil);
end;
Приведенные здесь функции не претендуют на абсолютную универсальность и гибкость. Они введены для того, чтобы упростить создание элементов управления в тех частных случаях, которые приводятся далее в примерах этой главы.
Использование элементов управления
Элементы управления, как и все окна, управляются путем посылки им сообщений. Этим же способом они уведомляют родительские окна о некоторых произошедших событиях (например, выделение элемента в списке, нажатие кнопки и т. д.).
Описание наиболее используемых сообщений для рассматриваемых элементов управления приводится в приложении 3. Мы же рассмотрим, как можно упростить работу с элементами управления в некоторых частных случаях, написав для этого специальные функции.
Итак, в демонстрационном проекте для управления переключателями и флажками предусмотрены следующие функции и процедуры (листинг 2.16).
Листинг 2.16. Управление флажками и переключателями
//Установка/снятие флажка (установка/снятие переключателя)
procedure SetChecked(id: Integer; checked: BOOL);
var state: Integer;
begin
if (checked) then state := BST_CHECKED
else state := BST_UNCHECKED;
SendDlgItemMessage(hParentWnd, id, BM_SETCHECK, state, 0);
end;
//Получение информации о том, установлен ли флажок
//(установлен ли переключатель)
function GetChecked(id: Integer):BOOL;
begin
if (SendDlgItemMessage(hParentWnd, id, BM_GETCHECK, 0, 0) =
BST_CHECKED)
then GetChecked := True
else GetChecked := False;
end;
Функции и процедуры листинга 2.17 предназначены для управления элементом ComboBox.
Листинг 2.17. Управление раскрывающимся списком
//Добавление строки в список
procedure AddToCombo(id: Integer; str: String);
begin
SendDlgItemMessage(hParentWnd, id, CB_ADDSTRING, 0,
Integer(PAnsiChar(str)));
end;
//Удаление строки из списка
procedure DeleteFromCombo(id: Integer; index: Integer);
begin
SendDlgItemMessage(hParentWnd, id, CB_DELETESTRING, index, 0);
end;
//Выделение строки с заданным номером
procedure SetComboSel(id: Integer; index: Integer);
begin
SendDlgItemMessage(hParentWnd, id, CB_SETCURSEL, index, 0);
end;
//Получение номера выделенной строки (CB_ERR, если нет выделения)
function GetComboSel(id: Integer): Integer;
begin
GetComboSel := SendDlgItemMessage(hParentWnd, id,
CB_GETCURSEL, 0, 0);
end;
//Получение количества строк
function GetComboCount(id: Integer): Integer;
begin
GetComboCount := SendDlgItemMessage(hParentWnd, id,
CB_GETCOUNT, 0, 0);
end;
//Получение текста строки по ее индексу
function GetComboItemText(id: Integer; index: Integer):String;
var buffer: String;
begin
SetLength(buffer,
SendDlgItemMessage(hParentWnd, id, CB_GETLBTEXTLEN,
index, 0)
);
SendDlgItemMessage(hParentWnd, id, CB_GETLBTEXT, index,
Integer(Addr(buffer)));
GetComboItemText := buffer;
end;
Сходные функции и процедуры в листинге 2.18 предназначены для управления элементом ListBox.