Прозрачность формы, но не контролов на ней!

Здесь можно найти готовые «кирпичики» — части кода, пригодные для построения более крупных проектов, а также решения различных типовых и не очень задач на VB.

Модератор: Brickgroup

Jenizix
Географ
Географ
Аватара пользователя
 
Сообщения: 545
Зарегистрирован: 20.04.2004 (Вт) 20:52
Откуда: Москва

Прозрачность формы, но не контролов на ней!

Сообщение Jenizix » 13.07.2005 (Ср) 20:12

Выставляем у формы св-во BorderStyle = 0

Код: Выделить всё
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 Const RGN_OR = 2

Private Sub TranspForm(ByVal frm As Form)
    Dim WindowRgn As Long ' тут будет храниться регион, по которому в последствии будет вырезано окно
    Dim ctrlRgn As Long ' тут будет храниться регион текущео конрола
    Dim ctrl As Control ' текущий контрол
   
    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
End Sub

Private Sub Form_Load()
    TranspForm Me ' вызываем ф-ию которая делает форму прозрачной
End Sub


Вот и все! Юзайте!!!
Последний раз редактировалось Jenizix 15.07.2005 (Пт) 0:24, всего редактировалось 2 раз(а).
Ушел в себя, вернусь не скоро...

Если вам нужно сделать прозрачной только форму, а контролы на ней нет, то вам сюда!!!

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 26.08.2005 (Пт) 17:05

Особого интереса разбираться нет, но работает криво 8)
ГОСПОДА, Юзайте .NET (Там это все свойствами (обычными) сделать можно 8)

zaf
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 194
Зарегистрирован: 27.03.2006 (Пн) 23:04

Сообщение zaf » 28.03.2006 (Вт) 11:33

Ramzes писал(а):Особого интереса разбираться нет, но работает криво 8)
ГОСПОДА, Юзайте .NET (Там это все свойствами (обычными) сделать можно 8)


А чем .NET отличается от VB?
Они похожи?
Есть русская версия .NET ?

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 28.03.2006 (Вт) 12:03


Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 13.08.2006 (Вс) 8:29

Ну что можно сказать?.. Работает, действительно, криво.
Что я заметил:
1. Не работает с линиями.
2. Круглые и овальные Shape вырезаются в форме прямоугольника.
3. Че-то там орет про Timer.

А так, вроде со стандартными контролами нормально работает.
Подпись находится в стадии разработки...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 13.08.2006 (Вс) 10:00

Естественно, кирпич изначально расчитан на прямоугольные контролы. Так что с шейпами и лайнами будут проблемы. А так же со всеми прозрачными кнопками.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 13.08.2006 (Вс) 10:32

Хакер
И как тогда быть? Я сейчас взялся писать программу, а на форме исключительно шейпы и лайны:)
Подпись находится в стадии разработки...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 13.08.2006 (Вс) 16:39

Отскринить экран под формой, и нарисовать это на форме.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 14.08.2006 (Пн) 11:41

Ну ещё можно сделать все контролы невидимыми временно(шейпы и лайны) и сделать Path по ним, затем PathToRegion, и контролы обратно видимыми.
<--800
Если всё делать своими ручками, они скоро отвалятся !

nikivas
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 17.12.2011 (Сб) 17:05

Re: Прозрачность формы, но не контролов на ней!

Сообщение nikivas » 31.12.2011 (Сб) 11:29

вот код:
Код: Выделить всё
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 crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
Private Const LWA_COLORKEY = &H1
Private Const LWA_ALPHA = &H2
Private Const LWA_ALPHAANDCOLORKEY = &H3
Private Const GWL_EXSTYLE = (-20)
Private Const WS_EX_LAYERED = &H80000
Private Const CLR_Black = &H0&
Private Const CLR_Fon = &HFF8080
Private X As Byte


Public Sub SetTransparent2(hWnd As Long, Layered As Byte, ID_Color As Variant)
Dim Ret As Long
    Ret = GetWindowLong(hWnd, GWL_EXSTYLE)
    Ret = Ret Or WS_EX_LAYERED
    SetWindowLong hWnd, GWL_EXSTYLE, Ret
    SetLayeredWindowAttributes hWnd, ID_Color, Layered, LWA_COLORKEY
    End Sub

Private Sub Form_Click()
End
End Sub

Private Sub Form_Load()
Form1.BackColor = &HFF8080
SetTransparent2 Form1.hWnd, X, CLR_Fon
End Sub



Вернуться в Кирпичный завод

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

    TopList