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

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

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

Всем добрый день.(...сразу предупрежу, что я новичок-самоучка, пожалуйста, не бейте тапком, если что) Сперва немного теории. Вроде как известно, что все control'ы, созданные на форме, принадлежат ей и располагаются в её пределах. Если форму сделать невидимой, то и все элементы, расположенные на ней становятся невидимыми, даже несмотря что для каждого из них установлено свойство visible = true. Допускается, чтобы размер формы был меньше размера каких-либо контролов на ней, тогда при отображении всё не уместившееся в поле формы просто обрезается. Но возможно ли сделать так, чтобы control был больше поля формы, но при этом не обрезался? Иными словами - так, чтобы его можно было отобразить вне видимого прямоугольника формы? Техзадача. Хочу сделать программку с окном непрямоугольной формы, по типу различных splashscreen и т.п. В основе фона лежит GIF изображение (как свойство Picture у формы, или в виде контрола Image, это не суть важно). Форме присвоены: BackColor = &H00000000& (просто чёрный) BorderStyle = 0 DrawMode = Copy Pen DrawStyle = Transparent Однако Gif рисунок всё равно отображается в чёрном прямоугольнике фона формы. Увы, у форм нет свойства типа BackStyle = 0 (Transparent), иначе бы не было такой проблемы. Я уже читал интернет, применял, к примеру, вот такой способ :
Он действительно удаляет всё поле формы вокруг всех элементов на ней ...прямоугольниками. Что, как уже понятно, тоже не решает задачи. Применял другие способы и советы, что смог найти - не помогло. Читал ранее созданные темы на форуме, относительно рисования вне формы, но там про крестик или эллипс возле указателя мышки (это не про control'ы). Если возможно как-то адаптировать те методы для отображения рисунков и иных контролов, или существует иной хитрый способ... Прошу помощи!

Решение задачи: «Отображение 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

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


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

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

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