Главная » Delphi » Эллиптическое окно

0

Вся магия  создания непрямоугольных окон  заключена в методе  ActivateHint(). В действительности же это  вовсе  не магия,  а просто два вызова  функций API Win32: CreateRoundRectRgn() и SetWindowRgn().

Функция  CreateRoundRectRgn() определяет  прямоугольную  область  со  скруг

ленными углами внутри  заданного окна.  Область (region) —  это  специальный объект

API, позволяющий выполнить прорисовку, закрашивание, обрезание и анализ  необ ходимости вывода  подсказки в некоторой области. Помимо функции  CreateRoun- dRectRgn(), существуют  и другие  функции API Win32,  предназначенные для созда ния областей различных типов:

•  CreateEllipticRgn()

•  CreateEllipticRgnIndirect()

•  CreatePolygonRgn()

•  CreatePolyPolygonRgn()

•  CreateRectRgn()

•  CreateRectRgnIndirect()

•  CreateRoundRectRgn()

•  ExtCreateRegion()

Кроме  того,  можно  использовать функцию  CombineRgn() для  объединения не скольких различных областей в один  сложный участок.  Все эти  функции  подробно описаны в интерактивной справке по интерфейсу API Win32.

Затем  вызывается функция SetWindowRgn(), которой в качестве параметра переда ется  дескриптор вновь  созданной области. Эта функция заставляет операционную сис тему стать владельцем области, и все последующие перерисовки для данного окна будут происходить только  внутри  указанной области. Таким  образом, если область  определе на как скругленный прямоугольник, перерисовка будет выполняться только в нем.

CОВЕТ

Стоит упомянуть о двух побочных эффектах применения функции SetWindowRgn(). Во- первых, поскольку перерисовывается лишь часть окна, то у него, вероятно, не будет рам- ки и заголовка. Следует быть готовым к тому, что придется обеспечить пользователя альтернативным способом перемещения, изменения размера и закрытия окна — без по- мощи рамки и заголовка. Во-вторых, поскольку областью, определенной в функции Set- WindowRgn(), владеет операционная система, обращаться с ней необходимо осторож- но, т.е. не изменять и не удалять ее во время использования. В компоненте TDDGHintWindow сначала  вызывается  метод  FreeCurrentRegion() и  лишь  затем уничтожается старое или создается новое окно.

Активизация потомка класса THintWindow

Код инициализации модуля RndHint делает  компонент TDDGHintWindow активным окном подсказки для всего приложения. Установка свойства Application.ShowHint в состояние False приводит к отмене старого окна  подсказки. Далее  следует назначить класс, являющийся потомком класса THintWindow, глобальной переменной HintWin- dowClass. Теперь можно  установить свойство Application.ShowHint в состояние True. В результате этого  будет создано  новое  окно,  представляющее собой  экземпляр пользовательского класса.

Применение TddgHintWindow

Применение псевдовизуального компонента отличается от методов использования обычных визуальных или  невизуальных компонентов. Поскольку вся работа по созда нию экземпляра компонента выполняется в разделе инициализации (initialization) его модуля, компонент не может  быть  добавлен в пакет  разработки и установлен в па литру  компонентов. Поэтому  необходимо просто добавлять имя  его  модуля  в раздел uses исходных файлов проекта.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии