Что нового

Как из текста ( текстового файла ) получит бегущую строку - Субтитр.

StarEdik

Новичок
Сообщения
365
Репутация
4
Привет всем !!!
Прошу помощи при написание скрипта. За ранее благодарю . :-[
По идее должна получиться так:
-После загрузки файла и запуска на исполнения
все слова из текста должны последовательно и плавно , как субтитры на телеке , отображаться до остановки исполнения . :scratch:
Приблизительная форма
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <SliderConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Читалка", 618, 116, 192, 114)
$Label1 = GUICtrlCreateLabel("", 8, 16, 597, 36, -1, $WS_EX_CLIENTEDGE)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
$Button1 = GUICtrlCreateButton("Start", 408, 80, 97, 25)
$Button2 = GUICtrlCreateButton("Stop", 512, 80, 97, 25)
$Button3 = GUICtrlCreateButton("Open File", 325, 80, 76, 25)
$Slider1 = GUICtrlCreateSlider(8, 80, 289, 25)
$Label2 = GUICtrlCreateLabel("Speed", 32, 56, 35, 17)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd
Файл для теста прикреплен
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
StarEdik
Ну, поиском можно воспользоваться :whistle:

Пример на основе
http://www.autoitscript.com/forum/topic/87200-some-graphical-examples-using-gdi/page__st__140#entry830445

Код:
#include <GUIConstants.au3>
#include <GDIplus.au3>
#include <file.au3>
#include <Array.au3>

Dim $aRecords
Global $graphics, $bitmap, $backbuffer, $hGUI, $hBrush, $Gray1 = 0xFF000000, $Gray2 = 0xFF000000
Global $iX = 0, $iY = 0, $Width = 500, $Height = 300, $Col, $iWidth = 100, $iHeight = 100, $end = 0
Global $hBrush, $hFormat, $hFamily, $hFont, $text_color, $text_scroller, $tLayout, $pen, $brush
Global $hShadowBrush, $hShadowFormat, $hShadowFamily, $hShadowFont, $Shadow_color, $tShadow, $Shadowtext, $ShadowtLayout
Global $letter_distance, $x, $y, $Length, $scroller_length
Global $ShadowColor = 0xF0FFFFFF
Global $font_size = 64 ;Размер шрифта
Global $Fontoffset = 5, $Ex, $Ey, $ioffset, $i2, $Tog = 0

_FileReadToArray('1.txt', $aRecords) ; путь до файла

_ArrayDelete($aRecords, 0)

$text = _ArrayToString($aRecords, ' ')

Opt('GUIOnEventMode', 1)
$hwnd = GUICreate('GDI+', $Width, $Height)

GUISetOnEvent($GUI_EVENT_CLOSE, 'close')
GUISetState()

_GDIPlus_Startup()

$text_color =0xFF0000 ; цвет текста
$fon_color=0x000000 ; цвет фона

$fon_color='0xFF'&Hex($fon_color,6)
$text_color = '0xFF'&Hex($text_color,6)

$htextBrush = _GDIPlus_BrushCreateSolid($text_color)
$hFormat = _GDIPlus_StringFormatCreate()
$hFamily = _GDIPlus_FontFamilyCreate('Arial') ; шрифт
$hFont = _GDIPlus_FontCreate($hFamily, $font_size, 2)
$pen = _GDIPlus_PenCreate(0)
$brush = _GDIPlus_BrushCreateSolid(0)
$tLayout = _GDIPlus_RectFCreate(0, 0)

$Fontoffset = 0

$hShadowBrush = _GDIPlus_BrushCreateSolid($ShadowColor)
$hShadowFormat = _GDIPlus_StringFormatCreate()
$hShadowFamily = _GDIPlus_FontFamilyCreate('Arial') ; шрифт
$hShadowFont = _GDIPlus_FontCreate($hShadowFamily, $font_size, 2)
$tShadowtLayout = _GDIPlus_RectFCreate(0, 0)

_GDIPlus_GraphicsSetSmoothingMode($backbuffer, 2)
$graphics = _GDIPlus_GraphicsCreateFromHWND($hwnd)
$bitmap = _GDIPlus_BitmapCreateFromGraphics($Width, $Height, $graphics)
$backbuffer = _GDIPlus_ImageGetGraphicsContext($bitmap)
$hBrush = _GDIPlus_BrushCreateSolid($fon_color)

$letter_distance = $font_size
$Length = $font_size * 1.666 * 0.36
$Z = 100
$k = $Width
$scroller_length = StringLen($text) * $Length
$FontY = $Height - $font_size * 1.5

Do
    ScrollText()

Until GUIGetMsg() = $GUI_EVENT_CLOSE


Func ScrollText()
    
    For $ioffset = -200 to 0 step 5
        _GDIPlus_GraphicsClear($Backbuffer, 0x00)  ;Clear BackBuffer
        $Col = $fon_color
        $iY = $iY + $ioffset
        For $n = 0 to 48
            _GDIPlus_BrushSetSolidColor($hBrush, $Col)
            _GDIPlus_GraphicsFillRect($backbuffer, $iX, $Height - $Z, $iWidth, $iHeight, $hBrush)
            
            $iX += 100
            If $iX = 600 then
                
                $iX = 0
                $iY += 100
            EndIf
        Next
        $iY = 0
        $iX = 0

        $FontX = $k + $letter_distance
        DllStructSetData($tLayout, 'x', $FontX)
        DllStructSetData($tLayout, 'y', $FontY)

        DllStructSetData($tShadowtLayout, 'x', $FontX + $Fontoffset)
        DllStructSetData($tShadowtLayout, 'y', $FontY + $Fontoffset)

        ;_GDIPlus_GraphicsDrawStringEx($backbuffer, $text, $hShadowFont, $tShadowtLayout, $hShadowFormat, $hShadowBrush)
        _GDIPlus_GraphicsDrawStringEx($backbuffer, $text, $hFont, $tLayout, $hFormat, $htextBrush)
        $k -= 4 ; скорость строки
        If - $scroller_length >= $k + $Width Then $k = $Width
        Sleep(25)
        _GDIPlus_GraphicsDrawImageRect($graphics, $bitmap, 0, 0, $Width, $Height)
    Next
EndFunc   ;==>ScrollText


Func close()
    _GDIPlus_BrushDispose($htextBrush)
    _GDIPlus_FontDispose($hFont)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_StringFormatDispose($hFormat)

    _GDIPlus_BrushDispose($hShadowBrush)
    _GDIPlus_FontDispose($hShadowFont)
    _GDIPlus_FontFamilyDispose($hShadowFamily)
    _GDIPlus_StringFormatDispose($hShadowFormat)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_GraphicsDispose($graphics)
    _GDIPlus_Shutdown()
    Exit
EndFunc   ;==>close
Думаю, разобраться можно.

Бегущую строку можно сделать и другими способами, но в отношении плавности показа этот метод получше будет.
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
WSWR
Спасибо! Отличное решение. А как загрузит .doc файлы ?
Думаю, разобраться можно.
Да!
Бегущую строку можно сделать и другими способами, но в отношении плавности показа этот метод получше будет.
На VB лаконично это так. Но плавности не хватает и …
Код:
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick 
         Label1.Text = Mid(Label1.Text, 2) & Mid(Label1.Text, 1, 1) 
 End Sub
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
StarEdik
А как загрузит .doc файлы ?

Если установлен Офис, то можно заменить в скрипте выше
Код:
_FileReadToArray('1.txt', $aRecords) ; путь до файла
_ArrayDelete($aRecords, 0)
$text = _ArrayToString($aRecords, ' ')


на
Код:
$path = @ScriptDir & '\1.doc' ; путь до файла
$oDOC = ObjCreate('Word.Application')
$doc = $oDOC.Documents.Open($path)
$text = $doc.Content.Text
$oDOC.quit(0)
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
WSWR
Великолепно. :ok: Спасибо. В Word файлах возврат каретки отображается виде квадрата.
А при выполнение скрипта менять скорость прокрутки и размер шрифта можно ? :scratch:
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
StarEdik
Обновил пост с бегущей строкой, добавил комментарии.
Там еще много можно урезать, изначальный пример слишком сложный
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
WSWR
При увеличение скорости ухудшается плавность и читабельность. :(
Что можно сделать :scratch:

Может кто нить еще знает как ??? :-[
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
---Zak---
Спасибо. Но как в 1ом и 2ом примере загрузит текст с файла?
CreatoR
Как в вашем примере
http://autoit-script.ru/index.php/topic,10702.msg70634.html#msg70634
загрузит текст с файла?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
StarEdik
Прокрутка текста в AboutBox основана на ScrollText.au3
http://autoit-script.ru/index.php/topic,10989.0.html
Там хороший пример.
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
WSWR
У меня с загрузкой файла ничего не получается :stars: :-[
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
StarEdik

Код:
#include <GUIConstantsEx.au3>
#include <ScrollText.au3>
#include <file.au3>
#include <Array.au3>

Dim $aRecords
$hMain_GUI = GUICreate('ScrollText UDF Example', 600, 500)

_FileReadToArray('1.txt', $aRecords) ; путь до файла
_ArrayDelete($aRecords, 0)


For $i= 0 To UBound($aRecords)-2
$aRecords[$i]=$aRecords[$i] & '(Arial Black,10,0xFF0000,4)\n'
Next

$sScrollData= _ArrayToString($aRecords,'')

GUISetState(@SW_SHOW, $hMain_GUI)
_ScrollText_Create($hMain_GUI, $sScrollData, -1, -1, 500, 400, True)

While 1
    $nMsg = GUIGetMsg()
    
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            _ScrollText_Destroy()
            Exit
    EndSwitch
WEnd
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
WSWR
Благодарю за помощь. :ok:Только вот :-[
1.Текст выходит за рамки не выполняется возврат каретки (перенос на новую строку)
2.При большом тексте выдается ощибка
C:\Documents and Settings\......\Speed_Read\ScrollText.au3 (167) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
$aSplitParams[$j] = StringStripWS($aSplitParams[$j], 3)
^ ERROR
 
Верх