Что нового

Передача "фокуса" в окне с прозрачными слоями

UnEpicFail

Новичок
Сообщения
24
Репутация
0
Доброго всем времени суток.
Возникла необходимость сделать окно программы, состоящее из нескольких слоев с различной и переменной прозрачностью. Создать такое окно оказалось не сложно, спасибо библиотеке WinAPIEx.au3, а вот управлять "фокусом" в этих слоях оказалось крайне сложно, сначала я узнал что полностью прозрачная часть объекта, является не "кликабельной", потом оказалось что если полностью видимый объект сделать прозрачным, а потом вернуть ему видимость он безвозвратно теряет фокус. К сожалению как победить последнюю описанную проблему я так и не придумал. Ниже приведен небольшой пример в котором есть 3 слоя:подложка, средний с практически прозрачной кнопкой и верхний с полностью непрозрачной кнопкой. Нажатие на практически прозрачную кнопку меняет прозрачность непрозрачной кнопки из слоя выше с непрозрачного на полностью прозрачный и обратно в зависимости от текущего состояния кнопки. После изменения прозрачности верхняя кнопка рас и навсегда теряет "фокус" и возможность быть нажатой.
Код:
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#Include <WinAPIEx.au3>

Local $trans = False

Local $hDown = GUICreate('Layer', 800, 600, -1, -1)

Local $hMiddle = GUICreate('', 800, 600, 0, 0, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD),  $hDown)
GUISetBkColor(0xFFFFFF)
Local $transparentButton = GUICtrlCreateButton('',0,0,800,600,-1, $GUI_WS_EX_PARENTDRAG)
_WinAPI_SetLayeredWindowAttributes($hMiddle, 0xEEEEEE, 10)

Local $hUp = GUICreate('', 800, 600, 0, 0, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD),  $hDown)
GUISetBkColor(0xEEEEEE)
Local $pressMeButton = GUICtrlCreateButton("Press Me",375,275,50,50)
_WinAPI_SetLayeredWindowAttributes($hUp, 0xEEEEEE,255)

GUISetState(@SW_SHOW, $hDown)
GUISetState(@SW_SHOW, $hMiddle)
GUISetState(@SW_SHOW, $hUp)


While 1
   $Msg = GUIGetMsg()
   Switch $Msg
	  Case $GUI_EVENT_CLOSE
		 Exit
	  Case $pressMeButton
		 MsgBox(0,'Press Me Button','Eeeee, Do It Again')
	  case $transparentButton
		 showHide()	  
   EndSwitch
WEnd


func showHide()
   if ($trans) Then
	  _WinAPI_SetLayeredWindowAttributes($hUp, 0xEEEEEE,255)
	  $trans = False
   Else
	  _WinAPI_SetLayeredWindowAttributes($hUp, 0xEEEEEE,0)
	  $trans = True
   EndIf
EndFunc

Есть ли кто-нибудь кто подскажет как вернуть "фокус" верхней кнопке? Заранее спасибо.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Модератор.
 

Dm666

Осваивающий
Сообщения
221
Репутация
48
UnEpicFail [?]
Есть ли кто-нибудь кто подскажет как вернуть "фокус" верхней кнопке?
Так?
Код:
#Region    ;************ Includes ************
#Include <GUIConstantsEx.au3>
#Include <GuiButton.au3>
;~ #include <GUIConstants.au3>;~~~
#include <WindowsConstants.au3>
;~ #Include <WinAPIEx.au3>;~~~
#EndRegion ;************ Includes ************

Local $trans = False

Local $hDown = GUICreate('Layer', 800, 600, -1, -1)

Local $hMiddle = GUICreate('', 800, 600, 0, 0, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD),  $hDown)
GUISetBkColor(0xFFFFFF)
Local $transparentButton = GUICtrlCreateButton('',0,0,800,600,-1, $GUI_WS_EX_PARENTDRAG)
_WinAPI_SetLayeredWindowAttributes($hMiddle, 0xEEEEEE, 10)

Local $hUp = GUICreate('', 800, 600, 0, 0, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD),  $hDown)
GUISetBkColor(0xEEEEEE)
Local $pressMeButton = GUICtrlCreateButton("Press Me",375,275,50,50)
_WinAPI_SetLayeredWindowAttributes($hUp, 0xEEEEEE,255)

GUISetState(@SW_SHOW, $hDown)
GUISetState(@SW_SHOW, $hMiddle)
GUISetState(@SW_SHOW, $hUp)


While 1
   $Msg = GUIGetMsg()
   Switch $Msg
      Case $GUI_EVENT_CLOSE
         Exit
      Case $pressMeButton
         MsgBox(0,'Press Me Button','Eeeee, Do It Again')
      case $transparentButton
         showHide()  
   EndSwitch
WEnd


func showHide()
   if ($trans) Then
      _WinAPI_SetLayeredWindowAttributes($hUp, 0xEEEEEE,255)
      $trans = False
	_GUICtrlButton_SetFocus ($pressMeButton)	  
   Else
      _WinAPI_SetLayeredWindowAttributes($hUp, 0xEEEEEE,0)
      $trans = True
   EndIf
EndFunc
 
Верх