Um einen Text auf einer GUI als Laufschrift auszugeben, gibt es in AutoIt standardmäßig nur die Möglichkeit den Text zeichenweise nach links laufen zu lassen.
Das sieht nicht so toll aus und meistens ruckelt es auch.
Hier kommt jetzt meine UDF zum Einsatz, die den gesamten Text vorab rendert und als HBitmap speichert. Anschließend kann man diese HBitmap dann pixelweise in ein Pic-Control blitten.
Das ist (zumindest auf meinem Rechner) schön flüssig und sieht ganz gut aus (siehe Beispielscript im Anhang).
Was bietet meine UDF:
1. beliebiger Text (kann bis 2^32 Pixel lang sein, das sollte selbst fuer sehr viel Text reichen)
2. jeder installierte Zeichensatz kann benutzt werden
3. die Hoehe des Zeichensatzes wird automatisch ermittelt (anhand der Größe des Scrolltext-Control)
4. der Zeichensatzstil (Kombinationen möglich) kann ausgewählt werden (0 = normal, 1 = bold, 2 = italic, 4 = underline, 8 = strikethrough)
5. die Vorder- und Hintergrundfarbe des Textes sind frei wählbar (RGB-Format)
6. wenn der Text komplett durchgescrollt wurde, wird "True" statt "False" zurückgegeben, sodass man dann darauf reagieren kann
Update 16.02.2022:
Mit der "_ShortSleep"-Funktion von Velted läuft das Beispiel auch mit einer niedrigeren Verzögerung als 10ms (Standard-Sleep) mit einer geringen Prozessorlast. Vielen Dank Velted!
Hier das Example mit der erwähnten Funktion:
#include <GUIConstantsEx.au3>
#include '_GUICtrlScrolltext.au3'
Opt('GUIOnEventMode', 1)
_SetMinSleep()
OnAutoItExitRegister('_AutoItExit')
Global $aText[2], $iTextIdx = 0
$aText[0] = 'Ein Beispieltext: Anlässlich des europäischen Tags des Notrufs möchten wir daran erinnern, ' & _
'dass Sie Notfallkontakte oder Notfalldaten in Ihrem Smartphone hinterlegen können. ' & _
'Notfallkontakte können Sie beispielsweise auch informieren, ohne direkt einen Notruf abzusetzen. ' & _
'Vielen Menschen sind diese Funktionen ihres Smartphones nach wie vor nicht bekannt, dabei können ' & _
'diese Daten in medizinischen Notfällen lebensrettend sein, vor allem, wenn die Person nicht in ' & _
'der Lage ist, die benötigten Informationen selbst mitzuteilen.'
$aText[1] = 'Bei dieser Scrolltext-UDF wird der zu scrollende Text komplett gerendert und als HBitmap ' & _
'zwischengespeichert. Diese HBitmap wird dann pixelweise in das vorher erstellte Pic-Control geblittet. ' & _
'Die Schriftgröße wird beim erstellen des Textes an die Höhe des Pic-Control angepasst. Die Schriftart, ' & _
'der Style und die Vorder-/Hintergrundfarbe der Schrift können bei jedem neuen Text geändert werden. '
Global $g_iMainWidth = @DesktopWidth / 2, $g_iMainHeight = 180
Global $g_hMainGui = GUICreate('Scrolltext Example', $g_iMainWidth, $g_iMainHeight, @DesktopWidth / 2 - $g_iMainWidth / 2, 10)
GUISetBkColor(0x202020, $g_hMainGui)
GUISetOnEvent($GUI_EVENT_CLOSE, '_AutoItExit')
; Parameter: Text, Left, Top, Width, Height, Fontname, Fontstyle, TextColor, BkColor
; Fontstyle: 0 = normal, 1 = bold, 2 = italic, 4 = underline, 8 = strikethrough
Global $g_tScroll = _GUICtrlScrolltext_Create('Test 5 4 3 2 1', 0, 40, _
$g_iMainWidth, $g_iMainHeight - 80, 'Courier New', 1, 0xFFFF00, 0x000066)
GUISetState(@SW_SHOW, $g_hMainGui)
#Region *** MainLoop ***
While True
; wenn die Laufschrift komplett durchgelaufen ist (Funktion gibt TRUE zurueck), dann...
If _GUICtrlScrolltext_DrawNextFrame($g_tScroll, 1) Then
Sleep(1000) ; 1000ms (= 1 sek.) nichts tun
$iTextIdx += 1 ; zum naechsten Text im Array wechseln
If $iTextIdx = 2 Then $iTextIdx = 0
Switch $iTextIdx
Case 0
; Parameter: Scrollstruct, Text, Fontname, Fontstyle, TextColor, BkColor
; Fontstyle: 0 = normal, 1 = bold, 2 = italic, 4 = underline, 8 = strikethrough
_GUICtrlScrolltext_SetData($g_tScroll, $aText[$iTextIdx], 'Verdana', 3, 0x000088, 0xFFFF88)
Case 1
; Parameter: Scrollstruct, Text, Fontname, Fontstyle, TextColor, BkColor
; Fontstyle: 0 = normal, 1 = bold, 2 = italic, 4 = underline, 8 = strikethrough
_GUICtrlScrolltext_SetData($g_tScroll, $aText[$iTextIdx], 'Times New Roman', 2, 0x000000, 0xFFFFFF)
EndSwitch
Else ; Laufschrift ist noch nicht durchgelaufen, also warten bis zum naechsten Frame
_ShortSleep(4)
EndIf
WEnd
#EndRegion *** MainLoop ***
Func _ShortSleep($mSec)
DllCall('Kernel32.dll', 'None', 'Sleep', 'DWORD', $mSec)
EndFunc
Func _AutoItExit()
_SetMinSleep(False)
_GUICtrlScrolltext_Delete($g_tScroll)
GUIDelete($g_hMainGui)
Exit
EndFunc ;==>_AutoItExit
; #FUNCTION# ====================================================================================================================
; Name...........: _SetMinSleep
; Description ...: Diese Funktion setzt die Auflösung des System Timers für den aufrufenden Prozess.
; Syntax.........: _SetMinSleep([$bSet])
; Parameters ....: $bSet = True - setzt die Auflösung auf den minimalen Wert (in der Regel 0,5 Millisekunden)
; False - setzt die AUflösung auf den ursprnglichen Wert zurück.
; Return values .: Kein Rückgabewert
; Author ........: www.autoit.de
; ===============================================================================================================================
Func _SetMinSleep($bSet = True)
; http://undocumented.ntinternals.net/index.html?page=UserMode/Undocumented Functions/Time/NtSetTimerResolution.html
Static $iMax = 0, $iMin = 0, $iCurrent = 0
Local $tMax, $tMin
Local $tCur = DllStructCreate('UInt Val')
If $iMin = 0 Then
$tMax = DllStructCreate('UInt Val')
$tMin = DllStructCreate('UInt Val')
DllCall('Ntdll.dll', 'None', 'NtQueryTimerResolution', 'Struct*', $tMax, 'Struct*', $tMin, 'Struct*', $tCur)
$iMax = $tMax.Val
$iMin = $tMin.Val
$iCur = $tCur.Val
EndIf
If $bSet Then
DllCall('Ntdll.dll', 'None', 'NtSetTimerResolution', 'UInt', $iMin, 'UInt', 1, 'Struct*', $tCur)
Else
DllCall('Ntdll.dll', 'None', 'NtSetTimerResolution', 'UInt', $iCur, 'UInt', 1, 'Struct*', $tCur)
EndIf
EndFunc ;==>_SetMinSleep
Alles anzeigen
Screenshot:
