Что нового

[Элементы GUI] Вплывающие сообщения аля icq

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Всем драсьте!
Возможно ли как то реализовать такую задумку, чтобы отображались всплывающие сообщения аля аська?
Я так понимаю нужно каждое окошко делать через GUI, но как потом их отслеживать, если их кол-во заранее не известно?
Tooltip щас помогает, но больше одного вывести помоему невозможно.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
r35p3ct [?]
каждое окошко делать через GUI, но как потом их отслеживать, если их кол-во заранее не известно?
Можно так попробовать:
Код:
#include <GUIConstantsEx.au3>

Global $iW = @DesktopWidth / 5, $iH = @DesktopHeight / 5, $iRandom = Random(10, 25, 1), _
		$aGUI, $iX = 5, $iY = 5
Dim $aGUI[$iRandom + 1] = [$iRandom]
For $i = 1 To $aGUI[0]
	If $i > 1 And Not Mod($i - 1, 5) Then
		$iX = 5
		$iY += $iH
	Else
		If $i = 1 Then
			$iX = 5
		Else
			$iX += $iW
		EndIf
	EndIf
	$aGUI[$i] = GUICreate($i & ' (' & $iRandom & ')', $iW - 20, $iH - 40, $iX, $iY)
	WinSetTrans($aGUI[$i], '', 0)
	GUISetState(@SW_SHOW, $aGUI[$i])
	For $j = 0 To 255 Step 5
		WinSetTrans($aGUI[$i], '', $j)
		Sleep(5)
	Next
Next

While 1
	$aMsg = GUIGetMsg(1)
	Switch $aMsg[0]
		Case $GUI_EVENT_CLOSE
			For $i = 1 To $aGUI[0]
				If $aGUI[$i] = $aMsg[1] Then
					For $j = 255 To 0 Step -5
						WinSetTrans($aGUI[$i], '', $j)
						Sleep(5)
					Next
					GUIDelete($aGUI[$i])
					$iRandom -= 1
					ConsoleWrite($iRandom & @LF)
					If Not $iRandom Then Exit
				EndIf
			Next
	EndSwitch
WEnd
И посмотрите в этой теме: Создание всплывающих окон (изображений).
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
r35p3ct,
Модифицировал немного предыдущий код. :smile:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <ButtonConstants.au3>
#include <WinAPIEx.au3>;Yashied, http://autoit-script.ru/index.php/topic,47.0.html

Opt('MustDeclareVars', 1)
Opt('TrayMenuMode', 1)

Global $aGUI, _ ;массив с нужными данными, см. ниже;
		$iCount, _ ;счетчик окон;
		$sStringControl = '|', _ ;строка для проверки уникальности рандомного числа;
		$iMaxTimeShowWin = 60000, _ ;максимальное время показа окна (ms);
		$iX_Num = 6, _ ;кол-во окон по горизонтали;
		$iY_Num = 12, _ ;кол-во окон по вертикали;
		$iMaxWin = $iX_Num * $iY_Num, _  ;макс. кол-во окон, открытых одновременно;
		$aMsg

Dim $aGUI[$iMaxWin + 1][5] = [[$iMaxWin, '', Int(@DesktopWidth / $iX_Num - 20), Int(@DesktopHeight / $iY_Num - 20)]]
;[0][0] - макс. кол-во окон, открытых одновременно;
;[0][2] - ширина всех окон;
;[0][3] - высота всех окон;
;[1-n][0] - для Handle создаваемых окон;
;[1-n][1] - для ID создаваемых кнопок(иконок) на окнах;
;[1-n][2] - координата X окна [1-n][0];
;[1-n][3] - координата Y окна [1-n][0];
;[1-n][4] - начальное время открытия окна [1-n][0].
For $i = 1 To $aGUI[0][0]
	If $i = 1 Then
		$aGUI[$i][2] = 10
		$aGUI[$i][3] = 10
	ElseIf Mod($i - 1, $iX_Num) Then
		$aGUI[$i][2] = $aGUI[$i - 1][2] + 20 + $aGUI[0][2]
		$aGUI[$i][3] = $aGUI[$i - 1][3]
	Else
		$aGUI[$i][2] = 10
		$aGUI[$i][3] = $aGUI[$i - 1][3] + 20 + $aGUI[0][3]
	EndIf
Next

HotKeySet('3', '_Create_GUI');3 - создать окно
HotKeySet('{Esc}', '_Exit');Esc - выход
_WinAPI_EmptyWorkingSet()
While 1
	If $iCount Then
		$aMsg = GUIGetMsg(1)
		For $i = 1 To $aGUI[0][0]
			If $aGUI[$i][0] Then
				If TimerDiff($aGUI[$i][4]) >= $iMaxTimeShowWin Or _
						($aMsg[1] = $aGUI[$i][0] And $aMsg[0] = $aGUI[$i][1]) Then
					HotKeySet('3')
					For $j = 255 To 0 Step -5
						WinSetTrans($aGUI[$i][0], '', $j)
						Sleep(5)
					Next
					GUIDelete($aGUI[$i][0])
					$iCount -= 1
					If Not $iCount Then
						_WinAPI_EmptyWorkingSet()
					EndIf
					$aGUI[$i][0] = 0
					$sStringControl = StringRegExpReplace($sStringControl, '(?<=\|)(' & $i & '\|)', '')
					HotKeySet('3', '_Create_GUI')
				EndIf
			EndIf
		Next
	Else
		Sleep(20)
	EndIf
WEnd

Func _Create_GUI()
	Local $i_Random, $a_Message[6][3] = [['Привет', 0xFFE4B5, 0xDC143C], _
			['Пока', 0x00FFFF, 0x0000FF],['Доброе утро', 0xDCDCDC, 0x4B0082], _
			['Добрый день', 0xFFFF00, 0xFF0000],['Добрый вечер', 0xFFDAB9, 0x800080], _
			['Пошли все на фиг', 0xFF00FF, 0x8B4513]], _
			$s_Pic_File = @SystemDir & '\user32.dll', $h_Rgn, $i_Mess = Random(0, 5, 1)
	HotKeySet('3')
	$iCount += 1
	If $iCount <= $iMaxWin Then
		While 1
			$i_Random = Random(1, $iMaxWin, 1)
			If Not StringInStr($sStringControl, '|' & $i_Random & '|') Then
				$sStringControl &= $i_Random & '|'
				ExitLoop
			EndIf
		WEnd
	Else
		$iCount = $iMaxWin
		TrayTip('Error', 'Максимальное кол-во окон (' & $iMaxWin & ') уже открыто.', 3, 3)
		AdlibRegister('_Kill_TrayTip', 3000)
		HotKeySet('3', '_Create_GUI')
		Return
	EndIf
	$aGUI[$i_Random][0] = GUICreate($i_Random, $aGUI[0][2], $aGUI[0][3], _
			$aGUI[$i_Random][2], $aGUI[$i_Random][3], $WS_POPUP, $WS_EX_TOOLWINDOW)
	GUISetBkColor($a_Message[$i_Mess][1], $aGUI[$i_Random][0])
	$h_Rgn = _WinAPI_CreateRoundRectRgn(0, 0, $aGUI[0][2], $aGUI[0][3], 12, 12)
	_WinAPI_SetWindowRgn($aGUI[$i_Random][0], $h_Rgn)
	_WinAPI_DeleteObject($h_Rgn)
	$aGUI[$i_Random][1] = GUICtrlCreateIcon($s_Pic_File, 103, $aGUI[0][2] - 18, 2, 16, 16)
	GUICtrlSetCursor(-1, 0)
	GUICtrlCreateLabel('№ ' & $i_Random & ', ' & $a_Message[$i_Mess][0], 0, Int(($aGUI[0][3] - 15) / 2), _
			$aGUI[0][2], 15, $SS_CENTER)
	GUICtrlSetColor(-1, $a_Message[$i_Mess][2])
	GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
	WinSetTrans($aGUI[$i_Random][0], '', 0)
	GUISetState(@SW_SHOWNOACTIVATE, $aGUI[$i_Random][0])
	WinSetOnTop($aGUI[$i_Random][0], '', 1)
	For $i = 0 To 255 Step 5
		WinSetTrans($aGUI[$i_Random][0], '', $i)
		Sleep(5)
	Next
	$aGUI[$i_Random][4] = TimerInit()
	HotKeySet('3', '_Create_GUI')
EndFunc   ;==>_Create_GUI

Func _Kill_TrayTip()
	TrayTip('', '', 0)
	AdlibUnRegister('_Kill_TrayTip')
EndFunc   ;==>_Kill_TrayTip

Func _Exit()
	Exit
EndFunc   ;==>_Exit
 
Верх