На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: SCINER, B.V.
  
    > Полная прозрачность формы, но не контолов на ней
      Вот многие начинают спрашивать, как сделать так, чтобы сама форма была прозрачной полностью, а контролы на ней не прозрачные, ну или полупрозрачные... вот накатал примерчик:

      ExpandedWrap disabled
        'Нужно выставить у формы св-во 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
      Сообщение отредактировано: SCINER -
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0144 ]   [ 16 queries used ]   [ Generated: 23.04.24, 07:17 GMT ]