Народ как изменить форму формы

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
xxxDemoNxxx
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 20.06.2006 (Вт) 20:53

Народ как изменить форму формы

Сообщение xxxDemoNxxx » 21.06.2006 (Ср) 15:21

Народ как изменить форму формы ну например чтоб она била в форме черепа или что-то в этом роде?(Извеняюсь за засорение форума столь глупыми вопросами)

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 21.06.2006 (Ср) 15:49

Посмотри Вот этот архив. А вообще на будущее, пользуйся поиском...
Последний раз редактировалось Lumen 21.06.2006 (Ср) 15:50, всего редактировалось 2 раз(а).
Подпись проходит рефакторинг

xxxDemoNxxx
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 20.06.2006 (Вт) 20:53

Сообщение xxxDemoNxxx » 21.06.2006 (Ср) 15:49

В поиск по функциям по CreatePolygonRgn, SetWindowRgn...
А это где находится и что это такое?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.06.2006 (Ср) 16:01

А там посмотри вверху страницы, красное такое...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

xxxDemoNxxx
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 20.06.2006 (Вт) 20:53

Сообщение xxxDemoNxxx » 21.06.2006 (Ср) 16:04

Ладно буду пользоваться поиском!Всем спасибо вопрос изчерпан.

AntonGV
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 24.05.2006 (Ср) 12:10
Откуда: г. Пермь

Сообщение AntonGV » 21.06.2006 (Ср) 16:45

Объявим функции, которые нам понадобятся
Код: Выделить всё
Private Declare Function CreateRoundRectRgn Lib "gdi32" _
(ByVal x1 As Long, ByVal y1 As Long, ByVal x2 As Long, _
ByVal y2 As Long, ByVal x3 As Long, ByVal y3 As Long) As Long

Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, _
ByVal hRgn As Long, ByVal bRedraw As Long) As Long

Private Declare Function CreateRectRgn Lib "gdi32" (ByVal x1 As Long, _
ByVal y1 As Long, ByVal x2 As Long, ByVal y2 As Long) As Long

Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal x1 As Long, _
ByVal y1 As Long, ByVal x2 As Long, ByVal y2 As Long) As Long

Private Declare Function DeleteObject Lib "gdi32" _
(ByVal hObject As Long) As Long

Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, _
ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, _
ByVal nCombineMode As Long) As Long

Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As POINTAPI, _
ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long

Private Declare Function BeginPath Lib "gdi32" (ByVal hdc As Long) As Long

Private Declare Function EndPath Lib "gdi32" (ByVal hdc As Long) As Long

Private Declare Function PathToRegion Lib "gdi32" (ByVal hdc As Long) As Long

Private Type POINTAPI
x As Long
y As Long
End Type

Private Const RGN_AND = 1
Private Const RGN_OR = 2
Private Const RGN_XOR = 3
Private Const RGN_DIFF = 4
Private Const RGN_COPY = 5


Работа с прозрачностью сводится к созданию региона т.е. определение непрозрачной
части и привязка региона к форме или контролу. Например создадим круглую форму

Код: Выделить всё
Dim r As Long
' Создаем круглый регион
r = CreateEllipticRgn(10, 10, 100, 100)
' Привязываем регион к форме
SetWindowRgn hwnd, r, True
' Освобождаем ресурсы
DeleteObject r


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

CreateRectRgn(x1, y1, x2, y2) - создает прямоугольный регион;
CreateRoundRectRgn(x1, y1, x2, y2, x3, y3) - создает прямоугольный регион с

закругленными краями. Параметры x3 и y3 определяют закругленность углов по
ширине и высоте.
CreatePolygonRgn(lpPoint, nCount, nPolyFillMode) - создает многоугольный регион,
, где lpPoint - начальный элемент массива, содержащего координаты вершин
многоугольника, nCount - число вершин. Последняя точка многоугольника должна
совпадать с начальной. Например:

Код: Выделить всё
Dim p(4) As POINTAPI
p(0).x = 10
p(0).y = 10
p(1).x = 100
p(1).y = 10
p(2).x = 150
p(2).y = 100
p(3).x = 150
p(3).y = 200
p(4).x = 10
p(4).y = 10
r = CreatePolygonRgn(p(0), 5, 1)
SetWindowRgn hwnd, r, True
' Освобождаем ресурсы
DeleteObject r


Есть еще один способ создания региона:

Код: Выделить всё
Dim r as Long
BeginPath hdc
' Здесь мы может что-либо нарисовать с помощью следующих API функций
' ExtTextOut
' LineTo
' MoveToEx
' PolyBezier
' PolyBezierTo
' Polygon
' Polyline
' PolylineTo
' PolyPolygon
' PolyPolyline
' TextOut
EndPath hdc
' Создаем регион из нарисованного
r = PathToRegion(hdc)


Для примера создадим регион из текстовой строки. Для этого используем
стандартный метод Print. Еще надо учесть, что регион создается только из
TrueType шрифтов (например Times New Roman)

Код: Выделить всё
Dim r As Long
Font.Name = "Times New Roman"
Font.Bold = True
Font.Size = 72
BeginPath hdc
Print "text"
EndPath hdc
r = PathToRegion(hdc)
SetWindowRgn hWnd, r, True
' Освобождаем ресурсы
DeleteObject r


Интересных результатов можно добиться путем комбинирования регионов. Для этого
используется функция CombineRgn(hDestRgn, hSrcRgn1, hSrcRgn2, nCombineMode), где
hDestRgn - результирующий регион, hSrcRgn1, hSrcRgn2 - регионы, которые
комбинируются, nCombineMode - способ комбинирования, может принимать следующие
значения:
RGN_OR - складывает 2 региона;
RGN_AND - перемножает регионы т.е. непрозрачным становится то место, где регионы
накладываются друг на друга;
RGN_XOR - в том мете, где регионы накладываются результирующий регион становится
прозрачным;
RGN_DIFF - вычитает второй регион из первого;
RGN_COPY - результирующим становится первый регион.

Чтобы закрепить материал напишем программу, которая делает прозрачной форму,
оставляя видимыми лишь контролы, находящиеся на ней. Для это поместите на форме
несколько контролов, установите предварительно свойство BorderStyle=0 и введите
следующий код:

Код: Выделить всё
Private Sub Form_Load()
Dim r1 As Long
Dim r2 As Long
ScaleMode = vbPixels
' Создаем пустой регион
r1 = CreateRectRgn(0, 0, 0, 0)
' Для каждого контрола на форме
For Each Control In Form1.Controls
With Control
' Создаем регион в соответствии с положением и размером контрола
r2 = CreateRectRgn(.Left, .Top, .Left + .Width, .Top + .Height)
End With
' Комбинируем регионы
CombineRgn r1, r1, r2, RGN_OR
Next
' Привязываем регион к форме
SetWindowRgn hwnd, r1, True
' Освобождаем ресурсы
DeleteObject r1
DeleteObject r2
End Sub
Если долго мучиться, что-нибудь получится


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 7

    TopList