Программирование на Visual Basic

Работа с прозрачностью. Создание нестандартных форм:

Объявим функции, которые нам понадобятся
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 LongPrivate Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, _ByVal hRgn As Long, ByVal bRedraw As Long) As LongPrivate Declare Function CreateRectRgn Lib "gdi32" (ByVal x1 As Long, _ByVal y1 As Long, ByVal x2 As Long, ByVal y2 As Long) As LongPrivate Declare Function CreateEllipticRgn Lib "gdi32" (ByVal x1 As Long, _ByVal y1 As Long, ByVal x2 As Long, ByVal y2 As Long) As LongPrivate Declare Function DeleteObject Lib "gdi32" _(ByVal hObject As Long) As LongPrivate Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, _ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, _ByVal nCombineMode As Long) As LongPrivate Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As POINTAPI, _ByVal nCount As Long, ByVal nPolyFillMode As Long) As LongPrivate Declare Function BeginPath Lib "gdi32" (ByVal hdc As Long) As LongPrivate Declare Function EndPath Lib "gdi32" (ByVal hdc As Long) As LongPrivate Declare Function PathToRegion Lib "gdi32" (ByVal hdc As Long) As LongPrivate Type POINTAPI		x As Long		y As LongEnd TypePrivate Const RGN_AND = 1Private Const RGN_OR = 2Private Const RGN_XOR = 3Private Const RGN_DIFF = 4Private 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 POINTAPIp(0).x = 10p(0).y = 10p(1).x = 100p(1).y = 10p(2).x = 150p(2).y = 100p(3).x = 150p(3).y = 200p(4).x = 10p(4).y = 10r = CreatePolygonRgn(p(0), 5, 1)SetWindowRgn hwnd, r, True" Освобождаем ресурсыDeleteObject r
Есть еще один способ создания региона:
Dim r as LongBeginPath 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 LongFont.Name = "Times New Roman"Font.Bold = TrueFont.Size = 72BeginPath hdcPrint "text"EndPath hdcr = 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 - результирующим становится первый регион.
К примеру создадим регионы, которые расположены следующим образом:

Вставьте следующий код в программу и, поочередно заменяя параметр nCombineMode на RGN_AND, RGN_XOR, RGN_DIFF, посмотрите, что получится
Dim r1 As LongDim r2 As Long" Создаем первый регионr1 = CreateEllipticRgn(0, 0, 100, 100)" Создаем второй регионr2 = CreateEllipticRgn(50, 0, 150, 100)" Комбинируем регионыCombineRgn r1, r1, r2, RGN_OR" Привязываем регион к формеSetWindowRgn hwnd, r1, True" Освобождаем ресурсыDeleteObject r1DeleteObject r2
Чтобы закрепить материал напишем программу, которая делает прозрачной форму, оставляя видимыми лишь контролы, находящиеся на ней. Для это поместите на форме несколько контролов, установите предварительно свойство BorderStyle=0 и введите следующий код:
Private Sub Form_Load()Dim r1 As LongDim r2 As LongScaleMode = vbPixels" Создаем пустой регионr1 = CreateRectRgn(0, 0, 0, 0)" Для каждого контрола на формеFor Each Control In Form1.ControlsWith Control" Создаем регион в соответствии с положением и размером контролаr2 = CreateRectRgn(.Left, .Top, .Left + .Width, .Top + .Height)End With" Комбинируем регионыCombineRgn r1, r1, r2, RGN_ORNext" Привязываем регион к формеSetWindowRgn hwnd, r1, True" Освобождаем ресурсыDeleteObject r1DeleteObject r2End Sub
Hosted by uCoz