Создаем непрямоугольную форму
Очевидно, что при проектировании все непрямоугольные окна были непрямоугольными формами. Давайте создадим непрямоугольную форму, например, такую, как на Рис. 17.7. Вы видите, что форма, имеющая контур Буратино, которого мы создавали в предыдущем разделе, уже запущена и видна на экране среди прочих окон. Из всех элементов управления на форме видна лишь половинка кнопки, но это только для иллюстрации – элементы управления размещаются на фигурной форме так же привычно и легко, как и на обычной.
Рис. 17.7
Вот решающий задачу код, значительную часть которого мы скопировали из предыдущего раздела:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Гр As Graphics = Me.CreateGraphics
Dim Путь As New Drawing2D.GraphicsPath
Путь.AddArc(20, 30, 120, 120, 0, 330)
Путь.AddArc(220, 30, 10, 10, 270, 180)
Путь.CloseFigure()
Путь.AddEllipse(90, 50, 30, 30)
Me.Region = New Region(Путь)
End Sub
Пояснения: Первые шесть строк процедуры практически копируют первые шесть строк из предыдущего подраздела. Новостью для нас здесь является только последняя строка, в которой и заключен весь смысл. У формы и у элементов управления имеется свойство Region, которое представляет графическую область поверхности экрана, предназначенную для прорисовывания компьютером этого объекта. По умолчанию она имеет прямоугольные очертания. Однако мы можем изменить значение этого свойства. Правая часть строки создает объект класса Region (не путать со свойством Region). Объекты этого класса можно создавать на основе графического пути, что мы и сделали. Они тоже хранят в себе некую графическую область (в нашем случае это Буратино) и могут выполнять над ней некоторые преобразования. Но нас преобразования не интересуют, нам Буратино подходит и такой, какой он есть. Мы просто присваиваем свойству Region формы объект класса Region, хранящий контур Буратино. С этого момента контур нашей формы изменился, им стал контур созданного нами пути.
Поместите в режиме проектирования на форму кнопку, стараясь попасть в Буратино.
Запустите проект. Вы видите, что от формы виден только тот кусок со случайно попавшей на него кнопкой, который находится внутри контуров Буратино. Вся остальная поверхность формы со всеми присутствующими на ней элементами управления не видна и недоступна. Она не существует. Мы добились своей цели.
Но не совсем. На половинку кнопки можно нажимать, но это все, что мы можем! У нашего экзотического окна нет заголовка, за который его можно таскать. Окно неподвижно и сдвинуть его нет никакой возможности. У него нет границ, которые мы с таким удобством таскали, изменяя размеры окна. У него нет кнопок в правом верхнем углу, потому что самого угла нет. Значит и закрыть-то окно крестиком мы не сможем.
Что делать? – Все, что мы потеряли, будем программировать! Слава Богу, над нашим Буратино работают события формы. А пока, чтобы хоть закрывать-то нашу форму можно было, напишем процедуру для нажатия на «полкнопки»:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Me.Close()
End Sub
Можете также с этой целью создать контекстное меню.