Отображение Control вне окна формы - VB

Узнай цену своей работы

Формулировка задачи:

Всем добрый день.(...сразу предупрежу, что я новичок-самоучка, пожалуйста, не бейте тапком, если что) Сперва немного теории. Вроде как известно, что все control'ы, созданные на форме, принадлежат ей и располагаются в её пределах. Если форму сделать невидимой, то и все элементы, расположенные на ней становятся невидимыми, даже несмотря что для каждого из них установлено свойство visible = true. Допускается, чтобы размер формы был меньше размера каких-либо контролов на ней, тогда при отображении всё не уместившееся в поле формы просто обрезается. Но возможно ли сделать так, чтобы control был больше поля формы, но при этом не обрезался? Иными словами - так, чтобы его можно было отобразить вне видимого прямоугольника формы? Техзадача. Хочу сделать программку с окном непрямоугольной формы, по типу различных splashscreen и т.п. В основе фона лежит GIF изображение (как свойство Picture у формы, или в виде контрола Image, это не суть важно). Форме присвоены: BackColor = &H00000000& (просто чёрный) BorderStyle = 0 DrawMode = Copy Pen DrawStyle = Transparent Однако Gif рисунок всё равно отображается в чёрном прямоугольнике фона формы. Увы, у форм нет свойства типа BackStyle = 0 (Transparent), иначе бы не было такой проблемы. Я уже читал интернет, применял, к примеру, вот такой способ :
Листинг программы
  1. Option Explicit
  2. Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
  3. Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
  4. Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
  5. Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hWnd As Long, ByVal crey As Byte, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
  6. Private Sub TranspForm(ByVal frm As Form, Transparency As Integer)
  7. Dim WindowRgn As Long
  8. Dim ctrlRgn As Long
  9. Dim ctrl As Control
  10. WindowRgn = CreateRectRgn(0, 0, 0, 0)
  11. For Each ctrl In frm.Controls
  12. 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))
  13. CombineRgn WindowRgn, WindowRgn, ctrlRgn, 2
  14. Next
  15. SetWindowRgn frm.hWnd, WindowRgn, True
  16. End Sub
  17. Private Sub Form_Load()
  18. TranspForm Me, 0
  19. End Sub
Он действительно удаляет всё поле формы вокруг всех элементов на ней ...прямоугольниками. Что, как уже понятно, тоже не решает задачи. Применял другие способы и советы, что смог найти - не помогло. Читал ранее созданные темы на форуме, относительно рисования вне формы, но там про крестик или эллипс возле указателя мышки (это не про control'ы). Если возможно как-то адаптировать те методы для отображения рисунков и иных контролов, или существует иной хитрый способ... Прошу помощи!

Решение задачи: «Отображение Control вне окна формы»

textual
Листинг программы
  1. Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
  2.  
  3. Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  4.  
  5. Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
  6.  
  7. Const LWA_COLORKEY = &H1
  8. Const LWA_ALPHA = &H2
  9. Const GWL_EXSTYLE = (-20)
  10. Const WS_EX_LAYERED = &H80000
  11.  
  12.  
  13. Private Sub Form_Load()
  14.    Dim Style As Long
  15.    Style = GetWindowLong(Me.hwnd, GWL_EXSTYLE) Or WS_EX_LAYERED
  16.    SetWindowLong Me.hwnd, GWL_EXSTYLE, Style
  17.    SetLayeredWindowAttributes Me.hwnd, vbWhite, 0, LWA_COLORKEY
  18. End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут