Содержание материала

В момент выполнения программы при нажатии "p" мы, по идее должны получить картинку нашей формы. Но как это ни покажется странным, мы получим картинку полной, т.е. неусечённой формы. Собственно, если взглянуть на реализацию GetFormImage - ничего странного не обнаружиться, создаётся виртуальный битмап, на который себя отрисовывает форма и все контролы на ней. Но об этой забавной фиче стоит помнить: для любой, самой извратной формы всегда можно получить её первоначальную картинку функцией GetFormBitmap, а любой загруглённый/продырявленный/звездообразный контрол всегда можно отрисовать на любой левый канвас в его первозданном виде функцией PaintTo.

 

Аналогичным образом создаются и другие типы регионов, единственное внимание стоит, пожалуй, уделить полигональным. Начнём с самого простого. В делкарации функции есть интересный параметр: FillMode. Согласно SDK он может принимать два значения - ALTERNATE и WINDING. Со вторым всё просто - вычисляются границы, и всё, что между - заливается текущей кистью. А вот первый при заливке анализирует, по какую сторону ребра (чётную или нечётную) он находится. Что это означает, мы увидим на следующем примере.

Code:

procedure TForm1.FormCreate(Sender: TObject);

var

ap: array [1..5] of TPoint;

r: hRGN;

begin

ap [1] := Point (Width div 2, 0);

ap [2] := Point (Width div 3 * 2, Height);

ap [3] := Point (0, Height div 3);

ap [4] := Point (Width, Height div 3);

ap [5] := Point (Width div 3, Height);

r := CreatePolygonRgn (ap, 5, WINDING);

try

  SetWindowRgn (Handle, r, TRUE);

finally

  DeleteObject (r);

end;

end;

 

 

Запустите программу, посмотрите на результат (она превратит форму в звезду), и поменяйте значение параметра FillMode на ALTERNATE. И запустите её снова. На тот случай, если по каким-то причинам вам влом напрягаться со всякими там модами, ниже приведёны примеры того, что вы могли увидеть:

FillMode = WINDING

 

clip0082

FillMode = ALTERNATE

 

clip0083

 

Обратите внимание, что если вы кликаете мышкой на "дырку", сообщение получает окно, лежащее под вашей формой. Если форма выведена на пустом десктопе, вы вполне успешно можете из "дырки" вызвать контекстное меню экрана. Т.е. это дейтсвительно "дыра", а не просто прозрачная отрисовка.

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить