Отображение Control вне окна формы - VB
Формулировка задачи:
Всем добрый день.(...сразу предупрежу, что я новичок-самоучка, пожалуйста, не бейте тапком, если что)
Сперва немного теории.
Вроде как известно, что все control'ы, созданные на форме, принадлежат ей и располагаются в её пределах. Если форму сделать невидимой, то и все элементы, расположенные на ней становятся невидимыми, даже несмотря что для каждого из них установлено свойство visible = true. Допускается, чтобы размер формы был меньше размера каких-либо контролов на ней, тогда при отображении всё не уместившееся в поле формы просто обрезается.
Но возможно ли сделать так, чтобы control был больше поля формы, но при этом не обрезался? Иными словами - так, чтобы его можно было отобразить вне видимого прямоугольника формы?
Техзадача.
Хочу сделать программку с окном непрямоугольной формы, по типу различных splashscreen и т.п. В основе фона лежит GIF изображение (как свойство Picture у формы, или в виде контрола Image, это не суть важно). Форме присвоены:
BackColor = &H00000000& (просто чёрный)
BorderStyle = 0
DrawMode = Copy Pen
DrawStyle = Transparent
Однако Gif рисунок всё равно отображается в чёрном прямоугольнике фона формы. Увы, у форм нет свойства типа BackStyle = 0 (Transparent), иначе бы не было такой проблемы. Я уже читал интернет, применял, к примеру, вот такой способ :
Он действительно удаляет всё поле формы вокруг всех элементов на ней ...прямоугольниками. Что, как уже понятно, тоже не решает задачи.
Применял другие способы и советы, что смог найти - не помогло.
Читал ранее созданные темы на форуме, относительно рисования вне формы, но там про крестик или эллипс возле указателя мышки (это не про control'ы). Если возможно как-то адаптировать те методы для отображения рисунков и иных контролов, или существует иной хитрый способ... Прошу помощи!
Листинг программы
- 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 SetLayeredWindowAttributes Lib "user32" (ByVal hWnd As Long, ByVal crey As Byte, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
- Private Sub TranspForm(ByVal frm As Form, Transparency As Integer)
- Dim WindowRgn As Long
- Dim ctrlRgn As Long
- Dim ctrl As Control
- WindowRgn = CreateRectRgn(0, 0, 0, 0)
- 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, 2
- Next
- SetWindowRgn frm.hWnd, WindowRgn, True
- End Sub
- Private Sub Form_Load()
- TranspForm Me, 0
- End Sub
Решение задачи: «Отображение Control вне окна формы»
textual
Листинг программы
- 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
- Const LWA_COLORKEY = &H1
- Const LWA_ALPHA = &H2
- Const GWL_EXSTYLE = (-20)
- Const WS_EX_LAYERED = &H80000
- Private Sub Form_Load()
- Dim Style As Long
- Style = GetWindowLong(Me.hwnd, GWL_EXSTYLE) Or WS_EX_LAYERED
- SetWindowLong Me.hwnd, GWL_EXSTYLE, Style
- SetLayeredWindowAttributes Me.hwnd, vbWhite, 0, LWA_COLORKEY
- End Sub
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д