"Delphi. Трюки и эффекты", как и все издания данной серии, адресована тем, кто хочет научиться делать с помощью уже знакомых программных пакетов новые, интересные вещи. В первой части книги многое говорится о среде разработки Delphi (самых последних версий) и программировании на языке Object Pascal. Благодаря этому издание подходит и новичкам, и начинающим программистам. Вторая (основная) часть книги описывает удивительные возможности, скрытые в языке, и на примерах учит читателя программистским фокусам – от "мышек-невидимок" и "непослушных окон" до воспроизведения МРЗ и управления офисными программами Word и Excel из приложений Delphi. Купив эту книгу, вы пройдете непростой путь к вершинам программистского мастерства весело и интересно.
Содержание:
Александр Чиртик - Delphi. Трюки и эффекты 1
Введение 1
От издательства 1
Глава 1 Окна 1
1.1. Привлечение внимания к приложению 2
1.2. Окно приложения 2
1.3. Полупрозрачные окна 3
1.4. Окна и кнопки нестандартной формы 3
1.5. Немного о перемещении окон 6
1.6. Масштабирование окон 7
1.7. Добавление пункта в системное меню окна 8
1.8. Отображение формы поверх других окон 8
Глава 2 Уменьшение размера ЕХЕ-файла. Использование Windows API 8
2.1. Источник лишних килобайт 9
2.2. Создание окна вручную 10
2.3. Окно с элементами управления 10
2.4. Стандартные диалоговые окна Windows 13
2.5. Установка шрифта элементов управления 16
Глава 3 Мышь и клавиатура 16
3.1. Мышь 16
3.2. Клавиатура 18
Глава 4 Диски, каталоги, файлы 20
4.1. Диски 20
4.2. Каталоги и пути 22
4.3. Файлы 27
Глава 5 Мультимедиа 29
5.1. Воспроизведение звука с помощью системного динамика 29
5.2. Использование компонента MediaPlayer 29
5.3. Компонент Animate 30
5.4. Разработка звукового проигрывателя 31
5.5. Видеопроигрыватель 32
Глава 6 Использование Windows GDI 33
6.1. Графические объекты 33
6.2. Аппаратно-независимый графический вывод 33
6.3. Контекст устройства 33
6.4. Графические режимы 34
6.5. Работа со шрифтами 34
6.6. Рисование примитивов 35
6.7. Работа с текстом 36
6.8. Работа с растровыми изображениями 37
6.9. Альфа-смешивание 37
Глава 7 Системная информация и реестр Windows 38
7.1. Системная информация 39
7.2. Системное время 41
7.3. Реестр 43
Глава 8 Обмен данными между приложениями 47
8.1. Сообщение WM_COPYDATA 47
8.2. Использование буфера обмена 48
8.3. Проецируемые в память файлы 49
Глава 9 Возможности COM в Microsoft Word и Microsoft Excel 50
9.1. Технология OLE 50
9.2. Технология СОМ 50
9.3. Использование OLE в Delphi 50
9.4. Управление Microsoft Word и Microsoft Excel 51
Глава 10 Окна других приложений 52
10.1. Ловушки Windows 52
10.2. Программа "Оконный шпион" 53
Глава 11 Сетевое взаимодействие 58
11.1. Краткое описание сетевых компонентов 58
11.2. Простой обмен данными 58
11.3. Слежение за компьютером по сети 59
11.4. Многопользовательский разговорник 60
Глава 12 Шифрование 64
12.1. Основы криптографии 65
12.2. Шифр простой подстановки 65
12.3. Транспозиция 67
12.4. Шифр Виженера и его варианты 69
12.5. Шифр с автоключом 70
12.6. Взлом 71
Заключение 73
Приложение 1 Коды и обозначения основных клавиш 73
Приложение 2 Оконные стили 73
Приложение 3 Сообщения 73
Александр Чиртик
Delphi. Трюки и эффекты
Введение
В настоящее время количество книг, посвященных различным языкам программирования, настолько велико, что иногда просто не знаешь, какую выбрать. Цель этой книги – не просто тривиальное изложение материала о Delphi. Она поможет вам получить опыт в решении многих задач. В итоге у вас будет необходимый базис знаний, который даст возможность легко и быстро усваивать что-то новое. Здесь вы найдете ответы на вопросы, которые возникают у большинства людей при разработке своих собственных приложений. Вам больше не придется задумываться над тем, как решать мелкие задачи, которые являются повседневной работой большинства программистов. У вас появится возможность тратить больше времени именно на основную цель, поставленную перед вами, а не на второстепенные.
Данная книга рассчитана на читателей, которые уже имеют некий опыт в программировании, причем достаточный, чтобы не излагать тривиальные вещи заново. Но сразу отмечу, пусть даже вы делаете свои первые шаги на пути к написанию приложений на высоком уровне, книга окажет вам неоценимую помощь. Она построена так, чтобы вы смогли с высокой степенью эффективности узнавать новый материал. В конце книги есть приложения в удобном для восприятия виде. В них вы найдете информацию, которая часто используется при написании программ.
Зачастую люди выбирают Delphi за его простоту. Программа подкупает начинающих пользователей, которые хотят почти сразу писать программы, а не разбираться в особенностях синтаксиса языка. Простота в совокупности с мощью дают вам целый набор инструментов для воплощения задуманного. Однако запомните: чтобы научиться хорошо программировать, недостаточно иметь огромный объем теоретических знаний, хотя и он немаловажен. Следует научиться думать в концепции выбранного вами языка, и тогда вас ждет успех. Ведь не понимая, зачем все это нужно, вы не сможете эффективно воспользоваться ресурсами языка для наиболее удачного решения поставленных задач.
В этой книге описано множество примеров. Есть как относительно простые, так и довольно сложные. Но пусть последнее вас не пугает. К тому моменту, когда вы начнете их рассматривать, они не покажутся вам особенно трудными.
От издательства
Ваши замечания, предложения, вопросы отравляйте по адресу электронной почты dgurski@minsk.piter.com (издательство "Питер", компьютерная редакция).
На сайте издательства вы найдете подробную информацию о наших книгах.
Глава 1 Окна
• Привлечение внимания к приложению
• Окно приложения
• Полупрозрачные окна
• Окна и кнопки нестандартной формы
• Немного о перемещении окон
• Масштабирование окон
• Добавление пункта в системное меню окна
• Отображение формы поверх других окон
Было решено начать книгу именно с необычных приемов использования оконного интерфейса. Причиной стало то, что при работе с операционной системой Windows мы видим окна постоянно и везде (отсюда, собственно, и название). Речь идет не только об окнах приложений, сообщений, свойств – понятие о таких окнах есть у любого начинающего пользователя Windows.
В своих собственных окнах рисуются и элементы управления (текстовые поля, панели инструментов, таблицы, полосы прокрутки, раскрывающиеся списки и т. д.). Взгляните на интерфейс, например, Microsoft Word. Здесь вы увидите, что даже содержимое документа находится в своем собственном окне с полосами прокрутки (правда, это не обязательно элемент управления). Окна элементов управления отличаются от "самостоятельных" окон (упрощенно) отсутствием стиля, позволяющего им иметь заголовок, а также тем, что являются дочерними по отношению к другим окнам. Понимание этого момента является важным, так как на нем основана часть примеров данной главы.
Рассматриваемые примеры частично используют средства, которые предусмотрены в Borland Delphi, а частично – возможности "чистого" API (см. гл. 2). Практически все API-функции работы с окнами требуют задания параметра типа HWND – дескриптора окна. Это уникальное значение, идентифицирующее каждое существующее в текущем сеансе Windows окно. В Delphi дескриптор окна формы и элемента управления хранится в параметре Handle соответствующего объекта.
Нужно также уточнить, что в этой главе термины "окно" и "форма" употребляются как синонимы, когда речь идет о форме (в том смысле, который это слово имеет при программировании с использованием Delphi). Когда же речь идет об элементах управления, то так и говорится: окно элемента управления.
1.1. Привлечение внимания к приложению
Начнем с простых примеров, позволяющих привлечь внимание пользователя к определенному окну приложения. Это может пригодиться в различных ситуациях: от уведомления пользователя об ошибке программы до простой сигнализации ему, какое окно в данный момент времени ожидает пользовательского ввода.
Инверсия заголовка окна
Вероятно, вы не раз могли наблюдать, как некоторые приложения после выполнения длительной операции или при возникновении ошибки как бы подмигивают. При этом меняется цвет кнопки приложения на Панели задач, а также состояние окна с активного на неактивное. Такой эффект легко достижим при использовании API-функции FlashWindow или ее усовершенствованного, но более сложного варианта – функции FlashWindowEx.
...
Примечание
Здесь сказано, что функции изменяют цвет кнопки приложения на Панели задач. Однако этого не происходит при выполнении приведенных ниже примеров. Почему так получается и как с этим бороться, рассказано в разд. 1.2.
Первая из этих функций позволяет один раз изменить состояние заголовка окна и кнопки на Панели задач (листинг 1.1).
...
Листинг 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.
Активизация окна
Рассмотрим другой, гораздо более гибкий способ привлечение внимания к окну приложения. Он базируется на использовании API-функции SetForegroundWindow. Функция принимает один единственный параметр – дескриптор окна. Если выполняется ряд условий, то окно с заданным дескриптором будет выведено на передний план и пользовательский ввод будет направлен в это окно. Функция возвращает нулевое значение, если не удалось сделать окно активным.
В приведенном ниже примере окно активизируется при каждом срабатывании таймера (листинг 1.4).
...
Листинг 1.4.
Активизация окна
procedure TForm1.Timer1Timer(Sender: TObject);
begin
SetForegroundWindow(Handle);
end;
В операционных системах старше Windows 95 и Windows NT 4.0 введен ряд ограничений на действие функции SetForegroundWindow. Так, приведенный выше пример как раз и является одним из случаев недружественного использования активизации окна, но это всего лишь пример.
Чтобы активизировать окно, процесс должен быть не фоновым либо должен иметь право устанавливать активное окно, назначенное ему другим процессом с таким правом, и т. п. Все возможные нюансы в пределах одного трюка рассматривать не имеет смысла. Стоит отметить, что в случае, когда окно не может быть активизировано, автоматически вызывается функция FlashWindow для окна приложения (заставляет мигать кнопку этого приложения на Панели задач). Поэтому даже при неудачном вызове функции SetForegroundWindow приложение, нуждающееся во внимании, не останется незамеченным.
1.2. Окно приложения
Обратите внимание на то, что название приложения, указанное на кнопке, расположенной на Панели задач, совпадает в названием проекта (можно установить на вкладке Application диалога Project options, вызываемого командой меню Project → Options), но не с заголовком главной формы приложения. Взгляните на приведенный ниже код, который можно найти в DPR-файле (несущественная часть опущена).
...
program…
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
В конструкторе класса TApplication, экземпляром которого является глобальная переменная Application (ее объявление находится в модуле Forms), происходит неявное создание главного окна приложения. Заголовок именно этого окна отображается на Панели задач (кстати, этот заголовок можно также изменить с помощью свойства Title объекта Application). Дескриптор главного окна приложения можно получить при помощи свойства Handle объекта Application.
Главное окно приложения делается невидимым (ему задается нулевая высота и ширина), чтобы создавалась иллюзия его отсутствия и можно было считать, что главной является именно создаваемая первой форма.
Для подтверждения вышесказанного можно отобразить главное окно приложения, используя следующий код (листинг 1.5).