Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Прозрачность и события Добавлено: 26.03.04 16:19  

Автор вопроса:  LamerOnLine | ICQ: 334781088 

Проблема такая. Сделал вроде свой калькулятор, задал ему TOPMOST, т.е. всегда висит поверх других окон. Хочу сделать чтобы при потере им фокуса он становился полупрозрачным.

Вешал на события form_lostfocus() и form_deactivate() функции прозрачности, но результат тухлый. Форма не получает прозрачность при потере фокуса, но получает ее при повторном получении фокуса. Чем это объясняется? Привожу вырезку кода:

Option Explicit

Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags 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 WS_EX_TRANSPARENT = &H20&

Private Const LWA_ALPHA = &H2&

Private NormalWindowStyle As Long

Const HWND_TOPMOST = -1

Private Sub Form_Load()

ComboCalc.Text = 0

Dim Ret As Long

Ret = SetWindowPos(Me.hwnd, HWND_TOPMOST, Me.Left, Me.Top, Me.Width / 15, Me.Height / 15, 0)

NormalWindowStyle = GetWindowLong(Me.hwnd, GWL_EXSTYLE)

SetWindowLong Me.hwnd, GWL_EXSTYLE, NormalWindowStyle Or WS_EX_LAYERED

SetLayeredWindowAttributes Me.hwnd, 0, 255, LWA_ALPHA

End Sub

Private Sub Form_lostfocus()

SetLayeredWindowAttributes Me.hwnd, 0, 155, LWA_ALPHA

End Sub

Private Sub Form_GotFocus()

SetLayeredWindowAttributes Me.hwnd, 0, 255, LWA_ALPHA

End Sub

Ответить

  Ответы Всего ответов: 3  

Номер ответа: 1
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #1 Добавлено: 26.03.04 16:34

Спрошу проще: Как отследить когда форма становится неактивной, но не в пределах приложения, а в системе. Т.е. в приложении я фокус не менял, но переключился на другое приложение. Как это прослеживается?

Ответить

Номер ответа: 2
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #2
Добавлено: 26.03.04 17:19

Таймер + условие, если Not GetActiveWindow = Me.hWnd, то выполняем код, используем переменную для запоминания текущего состояния... Другой способ - сабклассинг...

Ответить

Номер ответа: 3
Автор ответа:
 fallen66



Вопросов: 9
Ответов: 12
 Web-сайт: www.littlehumans.nm.ru
 Профиль | | #3
Добавлено: 27.03.04 02:42

пример с саб-классингом:

' в модуле:

Private Const WM_ACTIVATEAPP = &H1C

Private Const GWL_WNDPROC = (-4)

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 CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Private m_lWndProc As Long

Public Sub WindowHook(hwnd As Long)

m_lWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf MessageCenter)

End Sub

Public Sub WindowFree(hwnd As Long)

SetWindowLong hwnd, GWL_WNDPROC, m_lWndProc

End Sub

Private Function MessageCenter(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

If Msg = WM_ACTIVATEAPP Then

If wParam Then

OnAppActivate

Else

OnAppDeActivate

End If

End If

MessageCenter = CallWindowProc(m_lWndProc, hwnd, Msg, wParam, lParam)

End Function

Public Sub OnAppActivate

'установка прозрачности активного окна

End Sub

Public Sub OnAppDeActivate

'установка прозрачности неактивного окна

End Sub

'в форме

Private Sub Form_Load()

WindowHook Me.hwnd

End Sub

Private Sub Form_Unload(Cancel as Integer)

WindowFree Me.hwnd

End Sub

пример взят (вроде) с этого сайта

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам