Delphi. Трюки и эффекты. Александр Чиртик. Читать онлайн. Newlib. NEWLIB.NET

Автор: Александр Чиртик
Издательство:
Серия:
Жанр произведения: Программы
Год издания: 0
isbn: 978-5-911-80219-6
Скачать книгу
уже научились создавать и использовать простые регионы. Однако многим может показаться недостаточным тех форм окон, которые получаются с использованием лишь одного несложного региона в качестве области отсечения. Пришло время заняться созданием окон более сложной формы, применяя рассмотренные ранее операции над регионами.

«Дырявая» форма

      Этот простейший пример сомнительной полезности предназначен для знакомства с операциями над регионами. Здесь применяется только одна из возможных операций – операция XOR для формирования «дырок» в форме (рис. 1.8).

      Рис. 1.8. «Дырки» в форме

      На рис. 1.8 явно видно, как в «дырках» просвечивается одно из окон среды разработки Delphi. При этом сообщения от мыши, когда указатель находится над «дыркой», получает не наше окно, а те, часть которых видна в «дырке».

      Программный код, приводящий к созданию формы столь необычного вида, приведен в листинге 1.17.

Листинг 1.17. Создание «дырок» в форме

      procedure TfrmHole.FormCreate(Sender: TObject);

      var

      rgn1, rgn2: HRGN; //"Регионы-дырки" в форме

      formRgn: HRGN;

      begin

      //Создание региона для формы

      formRgn := CreateRectRgn(0, 0, Width – 1, Height – 1);

      //Создание регионов для «дырок»

      rgn1 := CreateEllipticRgn(10, 10, 100, 50);

      rgn2 := CreateRoundRectRgn(10, 60, 200, 90, 10, 10);

      //Создание «дырок» в регионе формы

      CombineRgn(formRgn, formRgn, rgn1, RGN_XOR);

      CombineRgn(formRgn, formRgn, rgn2, RGN_XOR);

      SetWindowRgn(Handle, formRgn, True);

      //Регионы для «дырок» больше не нужны

      DeleteObject(rgn1);

      DeleteObject(rgn2);

      end;

Сложная комбинация регионов

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

      Рис. 1.9. Сложная комбинация регионов

      Процедура, в которой производятся операции над регионами, приведена в листинге 1.18.

Листинг 1.18. Сложная комбинация регионов

      procedure TfrmManyRgn.FormCreate(Sender: TObject);

      var

      r1, r2, r3, r4, r5, r6, r7: HRGN;

      formRgn: HRGN;

      butRgn: HRGN;

      begin

      //Создание регионов

      r1 := CreateRoundRectRgn(100, 0, 700, 400, 40, 40);

      r2 := CreateRectRgn(280, 0, 300, 399);

      r3 := CreateRectRgn(500, 0, 520, 399);

      r4 := CreateEllipticRgn(140, 40, 240, 140);

      r5 := CreateEllipticRgn(0, 300, 200, 500);

      r6 := CreateEllipticRgn(500, 40, 600, 140);

      r7 := CreateEllipticRgn(540, 40, 640, 140);

      //Комбинирование

      //..разрезы в основном регионе

      CombineRgn(r1, r1, r2, RGN_XOR);

      CombineRgn(r1, r1, r3, RGN_XOR);

      //..круглая «дырка» в правой стороне

      CombineRgn(r1, r1, r4, RGN_XOR);

      //..присоединение круга в левой нижней части

      CombineRgn(r1, r1, r5, RGN_OR);

      //..создание «дырки» в форме полумесяца

      CombineRgn(r7, r7, r6, RGN_DIFF);

      CombineRgn(r1, r1, r7, RGN_XOR);

      formRgn := CreateRectRgn(0, 0, 0, 0);

      CombineRgn(formRgn, r1, 0, RGN_COPY);

      DeleteObject(r1);

      DeleteObject(r2);

      DeleteObject(r3);

      DeleteObject(r4);

      DeleteObject(r5);

      DeleteObject(r6);

      DeleteObject(r7);

      //Создание круглой кнопки закрытия

      butRgn := CreateEllipticRgn(50, 50, 150, 150);

      SetWindowRgn(Button1.Handle, butRgn, False);

      SetWindowRgn(Handle, formRgn, True);

      end;

      В листинге подписано, какие операции для создания каких элементов итогового региона предназначены. В операциях участвуют семь регионов. Расположение