Что нового

Прокрутка текста без мерцаний

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Один из способов избежать мерцаний при прокрутке текста. Для руссифицированной версии Windows замените Wind.jpg на Ветер.jpg.


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

$Width = 420
$Height = 150
$sText = 'AutoIt v3 is a freeware BASIC-like scripting language designed for automating the ' & _
         'Windows GUI and general scripting. It uses a combination of simulated keystrokes, mouse ' & _
         'movement and window/control manipulation in order to automate tasks in a way not possible or ' & _
         'reliable with other languages (e.g. VBScript and SendKeys). AutoIt is also very small, ' & _
         'self-contained and will run on all versions of Windows out-of-the-box with no annoying "runtimes" ' & _
         'required!'

; Main Window
$Form1 = GUICreate('Test', $Width, $Height, 620, 500)
$Pic1 = GUICtrlCreatePic(@WindowsDir & '\Web\Wallpaper\Wind.jpg', 0, 0, 348, 150)
$Label1 = GUICtrlCreateLabel($sText, 0, 150, 348, 150, $SS_CENTER)
GUICtrlSetFont(-1, 10)
GUICtrlSetColor(-1, 0xFFD800)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
$Close = GUICtrlCreateButton('Close', 354, 105, 60, 40)

GUIRegisterMsg($WM_MOVE, 'WM_MOVE')

$Pos = WinGetPos($Form1)
$Border = ($Pos[2] - $Width) / 2
$X = $Pos[0] + $Border
$Y = $Pos[1] + $Pos[3] - $Height - $Border

; Popup Window
$Form2 = GUICreate('', 348, 150, $X, $Y, BitOR($WS_DISABLED, $WS_POPUP), -1, $Form1)
GUICtrlCreatePic(@WindowsDir & '\Web\Wallpaper\Wind.jpg', 0, 0, 348, 150)
$Label2 = GUICtrlCreateLabel($sText, 0, 150, 348, 150, $SS_CENTER)
GUICtrlSetFont(-1, 10)
GUICtrlSetColor(-1, 0xFFD800)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

GUISetState(@SW_SHOW, $Form2)
GUISetState(@SW_SHOW, $Form1)

For $i = 150 To -150 Step -1
	$Msg = GUIGetMsg()
	Switch $Msg
		Case $Close, $GUI_EVENT_CLOSE
			Exit
	EndSwitch
	GUICtrlSetPos($Label1, 0, $i)
	WinSetTrans($Form2, '', 0)
	GUICtrlSetPos($Label2, 0, $i)
	WinSetTrans($Form2, '', 255)
	Sleep(20)
Next

Func WM_MOVE($hWnd, $iMsg, $wParam, $lParam)
	WinMove($Form2, '', BitAND($lParam, 0xFFFF), BitShift($lParam, 16))
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_MOVE
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Все хорошо, но зачем этот едкий желтый цвет?! :wacko:
Уж сразу бы серый, что бы невидно вообще было :D
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Пример хороший, но имхо, на полезняшку не тянет, это бы в примеры (на раздел выше)...

P.S
Файла «@WindowsDir & '\Web\Wallpaper\Wind.jpg'» у меня нету, папка есть, но в ней «Ветер.jpg» а не «Wind.jpg» :smile:
WinXP SP2 Rus.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
CreatoR сказал(а):
Пример хороший, но имхо, на полезняшку не тянет, это бы в примеры (на раздел выше)...

Это и есть полезняшка, так как не является законченной программой, просто демонстрация.

CreatoR сказал(а):
Файла «@WindowsDir & '\Web\Wallpaper\Wind.jpg'» у меня нету, папка есть, но в ней «Ветер.jpg» а не «Wind.jpg»...

Я поправил первый пост.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Ещё одна (простая) вариация на эту тему...

* Используется Timer.
* Без картинки, на чёрном фоне.
* Опция включения стереоэффекта :laugh:
* Опция включения эффекта движения окна против текста.
* Регулировка скорости прокрутки.

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

Global $iScroll_Pos = -160
Global $iScroll_Speed = 1
Global $iStereo_Effect_On = False
Global $iWinMove_Effect_On = False

$sScrollText = 'A long time ago in a galaxy' & @CRLF & _
'far, far away...' & @CRLF & @CRLF & _
'It is a period of civil war.' & @CRLF & _
'Rebel spaceships, striking' & @CRLF & _
'from a hidden base, have won' & @CRLF & _
'their first victory against' & @CRLF & _
'the evil Galactic Empire.' & @CRLF & @CRLF & _
'During the battle, Rebel' & @CRLF & _
'spies managed to steal secret' & @CRLF & _
'plans to the Empire''s' & @CRLF & _
'ultimate weapon, the DEATH' & @CRLF & _
'STAR, an armored space' & @CRLF & _
'station with enough power to' & @CRLF & _
'destroy an entire planet.' & @CRLF & @CRLF & _
'Pursued by the Empire''s' & @CRLF & _
'sinister agents, Princess' & @CRLF & _
'Leia races home aboard her' & @CRLF & _
'starship, custodian of the' & @CRLF & _
'stolen plans that can save her' & @CRLF & _
'people and restore' & @CRLF & _
'freedom to the galaxy...'

#Region Parent GUI
$hParent_GUI = GUICreate('Scrolling label', 290, 250)

$nStereoEffect_CheckBox = GUICtrlCreateCheckbox("Enable Stereo Effect", 20, 5, -1, 15)
$nWinMoveEffect_CheckBox = GUICtrlCreateCheckbox("Enable WinMove Effect", 20, 25, -1, 15)

GUICtrlCreateLabel("Scroll Speed:", 20, 45)
$nScrollSpeed_Input = GUICtrlCreateInput("1", 95, 44, 40, 18, BitOR($ES_LEFT, $ES_AUTOHSCROLL, $ES_READONLY))
$nScrollSpeed_UpDown = GUICtrlCreateUpdown(-1)
GUICtrlSetLimit(-1, 10, 1)

GUICtrlCreateLabel('Scrolling label example:', 90, 65, -1, 15)

GUISetState(@SW_SHOW, $hParent_GUI)
#EndRegion Parent GUI
;

#Region Child GUI
$hChild_GUI = GUICreate('', 250, 160, 20, 80, $WS_CHILD, $WS_EX_CLIENTEDGE, $hParent_GUI)
GUISetBkColor(0)

$nLabel = GUICtrlCreateLabel($sScrollText, 0, 160, 250, 510, $SS_CENTER)
GUICtrlSetFont(-1, 11, 800)
GUICtrlSetColor(-1, 0xFFD800)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

GUISetState(@SW_SHOW, $hChild_GUI)
#EndRegion Child GUI
;

$iTimerID = _Timer_SetTimer($hParent_GUI, 40, "_ScrollText_Proc")

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			_Timer_KillTimer($hParent_GUI, $iTimerID)
			Exit
		Case $nStereoEffect_CheckBox
			$iStereo_Effect_On = (GUICtrlRead($nStereoEffect_CheckBox) = $GUI_CHECKED)
		Case $nWinMoveEffect_CheckBox
			$iWinMove_Effect_On = (GUICtrlRead($nWinMoveEffect_CheckBox) = $GUI_CHECKED)
		Case $nScrollSpeed_UpDown
			$iScroll_Speed = GUICtrlRead($nScrollSpeed_Input)
	EndSwitch
WEnd

Func _ScrollText_Proc($hWnd, $uiMsg, $idEvent, $dwTime)
	Local $aParent_Pos = WinGetPos($hParent_GUI)
	
	$iScroll_Pos += $iScroll_Speed
	ControlMove($hChild_GUI, "", $nLabel, 0, -$iScroll_Pos)
	
	If $iStereo_Effect_On Then
		WinMove($hParent_GUI, "", $aParent_Pos[0]-1, $aParent_Pos[1]+1)
		WinMove($hParent_GUI, "", $aParent_Pos[0], $aParent_Pos[1])
	EndIf
	
	If $iWinMove_Effect_On Then WinMove($hParent_GUI, "", $aParent_Pos[0], $aParent_Pos[1]+$iScroll_Speed)
	
	If $iScroll_Pos > 480 Then $iScroll_Pos = -160
EndFunc
 
Верх