Страница: 1 |
Проблема такая. Сделал вроде свой калькулятор, задал ему 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
Спрошу проще: Как отследить когда форма становится неактивной, но не в пределах приложения, а в системе. Т.е. в приложении я фокус не менял, но переключился на другое приложение. Как это прослеживается? Таймер + условие, если Not GetActiveWindow = Me.hWnd, то выполняем код, используем переменную для запоминания текущего состояния... Другой способ - сабклассинг... пример с саб-классингом: ' в модуле: 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 |
Вопрос: Прозрачность и события
Добавлено: 26.03.04 16:19
Автор вопроса: LamerOnLine | ICQ: 334781088
Ответы
Всего ответов: 3
Номер ответа: 1
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #1
Добавлено: 26.03.04 16:34
Номер ответа: 2
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #2
Добавлено: 26.03.04 17:19
Номер ответа: 3
Автор ответа:
fallen66
Вопросов: 9
Ответов: 12
Web-сайт:
Профиль | | #3
Добавлено: 27.03.04 02:42