• Привлечение внимания к приложению
• Окно приложения
• Полупрозрачные окна
• Окна и кнопки нестандартной формы
• Немного о перемещении окон
• Масштабирование окон
• Добавление пункта в системное меню окна
• Отображение формы поверх других окон
Было решено начать книгу именно с необычных приемов использования оконного интерфейса. Причиной стало то, что при работе с операционной системой 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—заставляет мигать кнопку на Панели задач;