Иногда возникает подобный косяк при использовании transparent окна:
Форма-то прозрачной становится, но вот если есть поверх нее окно "on top" другой программы, то мое окно перекрывает его, хотя я "on top" не ставил. Но это не все. Такая фишка: Закрываю своим окно окно этой программы, и нажимаю сквозь свое окно кнопки на программе, которая визуально находится ЗА моим окном! Т.е. когда применяю transparent, форма визуально отрисовывается поверх всех onTop-окон, даже дочерних модальных окон этой же программы с не выставленным transparent'ом. С обычными окнами нормальньно. Причем, это не всегда, раз на раз...
Могу даж пояснить картинкой: http:\\truerezult.nm.ru\kosyak.gif
Для transparentа использую след. код:
Option Explicit
'Функция определяет стиль окна
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long) As Long
'Функция задаёт стиль окна
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
'Функция делает окно прозрачным
Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hWnd As Long, _
ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
'Константы
Public Const LWA_ALPHA = &H3
Public Const GWL_EXSTYLE = (-20)
Public Const WS_EX_LAYERED = &H80000
'hWnd - манипулятор окна, Layered - степень прозрачности от 0 до 255
Public Function SetTransparent(hWnd As Long, Layered As Byte) As Boolean
On Error GoTo er
Dim Ret As Long
Ret = GetWindowLong(hWnd, GWL_EXSTYLE) 'Определяем стиль нужного окна
Ret = Ret Or WS_EX_LAYERED
SetWindowLong hWnd, GWL_EXSTYLE, Ret 'Задаём стиль окна как заслоённый
SetLayeredWindowAttributes hWnd, 1, Layered, LWA_ALPHA 'Задём степень прозрачности окна
SetTransparent = True
er: Exit Function
End Function
Ответить
|