Что нового

[Окна, Диалоги] Как отследить события окна функции SplashTextOn()

tech-gs

Знающий
Сообщения
54
Репутация
5
После вызова SplashTextOn() с флагом opt=1 (Thin bordered titleless window) необходимо реализовать по клику мыши закрытие этого SplashText.
Вроде бы функция SplashTextOn() возвращает дескриптор окна. Но, ни через GUISetOnEvent(), ни через GUICtrlSetOnEvent() не удается отслеживать его события, например, такие как $GUI_EVENT_PRIMARYUP или $EN_SETFOCUS. Как можно реализовать данный функционал?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
tech-gs
Попробуйте так:
Код:
#include <Misc.au3>

SplashTextOn("Пример", "Кликните средней кнопкой мыши и это окно закроется")

$dll = DllOpen("user32.dll")
While 1
	Sleep(20)
	If _IsPressed("04", $dll) Then ;средняя кнопка мыши
		SplashOff()
		ExitLoop
	EndIf
WEnd
DllClose($dll)
MsgBox(0,"", "Окно закрылось.")
 
Автор
T

tech-gs

Знающий
Сообщения
54
Репутация
5
Спасибо за отклик.
_IsPressed("04", $dll) хорошо, быстро, но срабатывает на любое нажатие указанной кнопки, а смысл вопроса был в закрытии окна SplashText только при нажатии кнопки мыши именно по этому окну (открытому с помощью SplashTextOn()).
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
tech-gs [?]
смысл вопроса был в закрытии окна SplashText только при нажатии кнопки мыши именно по этому окну

Код:
#include <Misc.au3>
#include <WinAPI.au3>

$hSplash = SplashTextOn("Пример", "Кликните средней кнопкой мыши и это окно закроется")

$hDll = DllOpen("user32.dll")
AdlibRegister("_SplashCheckEvent", 100)

While 1
    Sleep(10)
WEnd

Func _SplashCheckEvent()
	If _IsPressed("04", $hDll) Then ;средняя кнопка мыши
		$tPoint = DllStructCreate("int;int")
		
		DllStructSetData($tPoint, 1, MouseGetPos(0))
		DllStructSetData($tPoint, 2, MouseGetPos(1))
		
		If _WinAPI_WindowFromPoint($tPoint) = $hSplash Then
			SplashOff()
			Exit MsgBox(0,"", "Окно закрылось.")
		EndIf
    EndIf
EndFunc


А вообще я бы сделал самодельный Splash.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
tech-gs [?]
а смысл вопроса был в закрытии окна SplashText только при нажатии кнопки мыши именно по этому окну
Из первого сообщения мне это было не понятно :smile:
 
Автор
T

tech-gs

Знающий
Сообщения
54
Репутация
5
Последний скрипт работает нормально. Спасибо.
Боюсь быть назойливым, но здесь есть небольшой минус. Функция _SplashCheckEvent() каждые ХХХмс (в данном случае 100мс) срабатывает, дергая систему. Нельзя ли все это реализовать переназначением функции обработки событий формы SplashText? Что-нибудь типа:
GUISetOnEvent($GUI_EVENT_PRIMARYUP, 'FORM_Event', $hGUI)
или
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND_Event')
У меня обрабатывать события основной формы и ее элементов получается, а вот обработать события SplashText таким образом не выходит.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
tech-gs [?]
Нельзя ли все это реализовать переназначением функции обработки событий формы
Нет, но как я уже писал, проще создать своё окошко:

Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Global $hSplash = _SplashTextOnEx("Пример", "Кликните средней кнопкой мыши и это окно закроется", _
	800, 600, -1, -1, "Tahoma", 10, 800, 0, -1, BitOR($WS_CAPTION, $WS_POPUP))

GUIRegisterMsg($WM_MBUTTONUP, "WM_MBUTTONUP")

While 1
    Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			_SplashOffEx($hSplash)
			MsgBox(0,"", "Окно закрылось.")
			Exit
	EndSwitch
WEnd

Func WM_MBUTTONUP($hWndGUI, $MsgID, $WParam, $LParam)
	If $hWndGUI = $hSplash Then
		WinClose($hSplash)
	EndIf
EndFunc

Func _SplashTextOnEx($sTitle, $sText, $iW=800, $iH=600, $iX=-1, $iY=-1, $sFntName=-1, $iFntSz=-1, $iFntWd=-1, $iFntAtrb=0, $nFntClr=-1, $nStyle=-1, $nExStyle=-1, $hParent=0)
	If IsHWnd($hParent) Then
		GUISetState(@SW_DISABLE, $hParent)
	EndIf
	
	Local $hSplash = GUICreate($sTitle, $iW, $iH, $iX, $iY, $nStyle, $nExStyle, $hParent)
	GUISetBkColor(0xFFFFFF, $hSplash)
	
	Local $nLabel = GUICtrlCreateLabel($sText, 10, ($iH/2)-15, $iW-20, $iH, $SS_CENTER)
	
	GUICtrlSetFont($nLabel, $iFntSz, $iFntWd, $iFntAtrb, $sFntName)
	GUICtrlSetColor($nLabel, $nFntClr)
	GUICtrlSetState($nLabel, $GUI_DISABLE)
	
	Local $nStatusLabel = GUICtrlCreateLabel("", 0, 5, $iW, 15, $SS_CENTER)
	
	GUICtrlSetFont($nStatusLabel, 8, 800, 4, "Tahoma")
	GUICtrlSetColor($nStatusLabel, 0x757575)
	GUICtrlSetState($nStatusLabel, $GUI_DISABLE)
	
	GUISetState(@SW_SHOW, $hSplash)
	Return $hSplash
EndFunc

Func _SplashTextSetText($hSplash, $sText, $sTitle = -1, $sCtrlClass = "Static1")
	ControlSetText($hSplash, "", $sCtrlClass, $sText)
	
	If $sTitle <> -1 Then
		WinSetTitle($hSplash, "", $sTitle)
	EndIf
EndFunc

Func _SplashOffEx($hSplash, $hParent = 0)
	If IsHWnd($hParent) Then
		GUISetState(@SW_ENABLE, $hParent)
	EndIf
	
	Return GUIDelete($hSplash)
EndFunc
 
Автор
T

tech-gs

Знающий
Сообщения
54
Репутация
5
Отличное решение, то что нужно. :ok: Создателю CreatoR за это 5+ !
Считаю, что проблема решена и тема закрыта. Осталось только проверить, не будет ли конфликтовать основная форма программы и руками созданная SplashText.
 
Верх