В момент выполнения программы при нажатии "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
FillMode = ALTERNATE
Обратите внимание, что если вы кликаете мышкой на "дырку", сообщение получает окно, лежащее под вашей формой. Если форма выведена на пустом десктопе, вы вполне успешно можете из "дырки" вызвать контекстное меню экрана. Т.е. это дейтсвительно "дыра", а не просто прозрачная отрисовка.
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!