Программирование в Delphi. Трюки и эффекты. Александр Чиртик

Чтение книги онлайн.

Читать онлайн книгу Программирование в Delphi. Трюки и эффекты - Александр Чиртик страница 6

Программирование в Delphi. Трюки и эффекты - Александр Чиртик

Скачать книгу

того окна, в котором предполагается использовать регион. Так, если у вас есть кнопка размером 40 х 30 пикселов, левый верхний угол которой расположен на форме в точке (100; 100), то для того, чтобы создать для кнопки прямоугольный регион 20 х 15 пикселов с левой верхней точкой (0;0) относительно начала координат кнопки, следует вызвать функцию CreateRectRgn с параметрами (0, 0, 19, 14), а не (100, 100, 119, 114).

      Поскольку регион является GDI-объектом (подробнее в гл. 6), то для его удаления, если он не используется системой, применяется функция удаления GDI-объектов DeleteObject:

      function DeleteObject(p1: HGDIOBJ): BOOL;

Регион как область отсечения при рисовании окна

      Обычно регион нужно удалять в том случае, если он не используется системой, однако после того, как регион назначен окну в качестве области отсечения, удалять его не следует. Функция назначения региона окну имеет следующий вид:

      function SetWindowRgn(hWnd: HWND; hRgn: HRGN; bRedraw: BOOL): Integer;

      Функция возвращает 0, если произвести операцию не удалось, и ненулевое значение в случае успешного выполнения операции. Параметры функции SetWindowRgn следующие:

      • hWnd – дескриптор окна, для которого устанавливается область отсечения (свойство Handle формы или элемента управления);

      • hRgn – дескриптор региона, назначаемого в качестве области отсечения (в простейшем случае является значением, возвращенным одной из функций создания региона);

      • bRedraw – флаг перерисовки окна после назначения новой области отсечения (для видимых окон обычно используется значение True, для невидимых – False).

      Чтобы получить копию региона, формирующего область отсечения окна, можно использовать API-функцию GetWindowRgn:

      function GetWindowRgn(hWnd: HWND; hRgn: HRGN): Integer;

      Первый параметр функции – дескриптор (Handle) интересующего окна. Второй параметр – дескриптор предварительно созданного региона, который в случае успеха модифицируется функцией GetWindowRgn так, что становится копией региона, формирующего область отсечения окна. Значения целочисленных констант – возможных возвращаемых значений функции – следующие:

      • NULLREGION – пустой регион;

      • SIMPLEREGION – регион в форме прямоугольника;

      • COMPLEXREGION – регион сложнее, чем прямоугольник;

      • ERROR – при выполнении функции возникла ошибка либо окну задана область отсечения.

      Далее приведен пример использования функции GetWindowRgn (предполагается, что приведенный ниже код является телом одного из методов класса формы).

      var rgn: HRGN;

      begin

      rgn:= CreateRectRgn(0,0,0,0); //Первоначальная форма региона не важна

      if GetWindowRgn(Handle, rgn) <> ERROR then

      begin

      //Операции с копией региона, формирующего область отсечения окна...

      end;

      DeleteObject(rgn); //Мы пользовались копией региона, которую должны

      //удалить (здесь или в ином месте, но сами)

      end;

Операции над регионами

      При рассказе о функциях создания регионов неоднократно упоминалось о возможности комбинирования регионов для получения сложных форм. Пришло время кратко рассмотреть

Скачать книгу