Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.138.113.188] |
|
Сообщ.
#1
,
|
|
|
Вот многие начинают спрашивать, как сделать так, чтобы сама форма была прозрачной полностью, а контролы на ней не прозрачные, ну или полупрозрачные... вот накатал примерчик:
'Нужно выставить у формы св-во BorderStyle = 0 'и чтобы кнопка формы отображалась на панели задач, нужно выставить св-во ShowInTaskbar = true Option Explicit 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 CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hWnd As Long, ByVal crey As Byte, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long Private Const GWL_EXSTYLE = -20 Private Const WS_EX_LAYERED = &H80000 Private Const LWA_ALPHA = &H2& Private Const RGN_OR = 2 Private Sub TranspForm(ByVal frm As Form, Transparency As Integer) ' значение Transparency может быть от 0 до 255 (0 - полностью прозрачная, 255 - непрозрачная) Dim WindowRgn As Long ' тут будет храниться регион, по которому в последствии будет вырезано окно Dim ctrlRgn As Long ' тут будет храниться регион текущео конрола Dim ctrl As Control ' текущий контрол Dim NormalWindowStyle As Long WindowRgn = CreateRectRgn(0, 0, 0, 0) ' создаем пустой регион On Error Resume Next For Each ctrl In frm.Controls ' перебираем все контролы на форме ctrlRgn = CreateRectRgn(frm.ScaleX(ctrl.Left, frm.ScaleMode, vbPixels), frm.ScaleY(ctrl.Top, frm.ScaleMode, vbPixels), frm.ScaleX(ctrl.Left + ctrl.Width, frm.ScaleMode, vbPixels), frm.ScaleY(ctrl.Top + ctrl.Height, frm.ScaleMode, vbPixels)) ' создаем регион текущего контрола CombineRgn WindowRgn, WindowRgn, ctrlRgn, RGN_OR ' комбинируем его с регионом WindowRgn Next SetWindowRgn frm.hWnd, WindowRgn, True ' вырезаем окно по региону WindowRgn DeleteObject ctrlRgn On Error GoTo win98 NormalWindowStyle = GetWindowLong(Me.hWnd, GWL_EXSTYLE) SetWindowLong Me.hWnd, GWL_EXSTYLE, NormalWindowStyle Or WS_EX_LAYERED SetLayeredWindowAttributes Me.hWnd, 0, 255, LWA_ALPHA SetLayeredWindowAttributes Me.hWnd, 0, (255 * Transparency) / 100, LWA_ALPHA win98: End Sub Private Sub Form_Load() TranspForm Me, 50 ' вызываем ф-ию которая делает форму прозрачной, а элементы на ней полупрозрачными End Sub |