Что нового

Вывод текста в элемент RichEdit с поддержкой тегов

aleratorio

Осваивающий
Сообщения
85
Репутация
43
AutoIt: 3.3.6.1 (Наверное будет работать и на более ранних версиях)
Версия: 1.0

Категория: Элементы GUI

Описание: На днях понадобилось сделать так, что бы приложение выводило в окно лог работы с возможностью задания цвета в логе.
Было решено использовать RichEdit. Основным условием было - задавать цвет, размер и другие параметры текста как можно более простым способом, с использованием одной функции.
За основу была взята функция _Write_GUI_Log, из примера CreatoRа (http://autoit-script.ru/index.php/topic,339.0.html), позже измененная чуть менее, чем полностью.
В итоге получилась функция _GUICtrlRichEdit_TagWrite, которая выводит строку текста в элемент RichEdit с поддержкой тегов.

Конечно RichEdit поддерживает синтаксис RTF, но он довольно неудобен(это еще мягко сказано) для описания вручную.

Решил выложить тут, может еще кому пригодиться.
Синтаксис и поддерживаемые теги описаны в коммнетах(на русском) к функции _GUICtrlRichEdit_TagWrite.
P.S. Написание комментариев по моему было сложнее написания самой функции :smile:

Код/Пример:
Код:
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <GUIRichEdit.au3>

#include <RightEditTagWrite.au3>

$hGUI = GUICreate('_GUICtrlRichEdit_TagWrite Demo', 640, 480, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_CLIPSIBLINGS))

$hRichText = _GUICtrlRichEdit_Create($hGUI, "", 0, 0, 640, 480, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
_GUICtrlRichEdit_SetReadOnly($hRichText, True)

GUISetState(@SW_SHOW, $hGUI)

_main()
Exit



Func _main()
	_GUICtrlRichEdit_PauseRedraw($hRichText)

	;Можно использовать одиночные теги:
	$s = '[size=10]обычный текст, [b]жирный, [i]жирный и курсивный, [/b] курсивный, [/i][s][c=red]красный перечеркнутый,[/s][/c][n]новая строка, [c=0xFF0000][u]синий подчеркнутый,[/u]' _
	     & ' [c=green][sz=15][f=Comic Sans MS]большой, зеленый и веселый[/sz][/f][c=GRAY] серый и т.п.     [n]следующий текст через две строки...[n=3]'
	_GUICtrlRichEdit_TagWrite($hRichText, $s)

	;Или группировать их вместе через запятую
	$s = '[size=10]обычный текст, [b]жирный, [i]жирный и курсивный, [/b] курсивный, [/i,s,c=red]красный перечеркнутый,[/s,/c,n]новая строка, [c=0xFF0000,u]синий подчеркнутый,' _
	     & ' [/u,c=green,sz=15,f=Comic Sans MS]большой, зеленый и веселый[/sz,/f,c=GRAY] серый и т.п.     [n]следующий текст через две строки...[n=3]'
	_GUICtrlRichEdit_TagWrite($hRichText, $s)

	;Так же можно изменить символы закрывающей и открывающей скобки и символ определяющий закрывающий тег
	$s = '{size=10}обычный текст, {b}жирный, {i}жирный и курсивный, {-b} курсивный, {-i,s,c=red}красный перечеркнутый,{-s,-c,n}новая строка, {c=0xFF0000,u}синий подчеркнутый,' _
	     & ' {-u,c=green,sz=15,f=Comic Sans MS}большой, зеленый и веселый{-sz,-f,c=GRAY} серый и т.п.     {n}следующий текст через две строки...{n=3}'

	_GUICtrlRichEdit_TagWriteSetTagChars('{', '}', '-')
	_GUICtrlRichEdit_TagWrite($hRichText, $s)

	$s = '[size=15]Предопределенные цвета:[/n,/size,b,c=aqua]AQUA [c=black]BLACK [c=BLUE]BLUE [c=CREAM,bc=BLACK]CREAM [/bc,c=FUCHSIA]FUCHSIA [c=GRAY]GRAY [c=GREEN]GREEN  ' _
		 & '[c=LIME]LIME [c=MAROON]MAROON [c=MEDBLUE]MEDBLUE [c=MEDGRAY]MEDGRAY[n,c=MONEYGREEN]MONEYGREEN [c=NAVY]NAVY [c=OLIVE]OLIVE [c=PURPLE]PURPLE [c=RED]RED [c=SILVER]SILVER ' _
		 & '[c=SKYBLUE]SKYBLUE [c=TEAL]TEAL [c=YELLOW,bc=BLACK]YELLOW [c=WHITE]WHITE'

	_GUICtrlRichEdit_TagWriteSetTagChars('[', ']', '/')
	_GUICtrlRichEdit_TagWrite($hRichText, $s)

	_GUICtrlRichEdit_ResumeRedraw($hRichText)

	while 1
		$nMsg = GUIGetMsg(1)
		Switch $nMsg[0]
			Case $GUI_EVENT_CLOSE
				GUIDelete()
				Exit
		EndSwitch
	WEnd
EndFunc

Результат работы примера (скриншот):

Автор: aleratorio
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Re: [Элементы GUI] Вывод текста в элемент RichEdit с поддержкой тегов

Не хватает какой-то ColorConstants.au3 :whistle:
 
Автор
A

aleratorio

Осваивающий
Сообщения
85
Репутация
43
Re: [Элементы GUI] Вывод текста в элемент RichEdit с поддержкой тегов

ColorConstants.au3 входит в стандартный набор AutoIt UDF
 

ZlojBoter

Новичок
Сообщения
55
Репутация
0
AutoIt: 3.3.6.1 (Наверное будет работать и на более ранних версиях)
Версия: 1.0

Категория: Элементы GUI

Описание: На днях понадобилось сделать так, что бы приложение выводило в окно лог работы с возможностью задания цвета в логе.
Было решено использовать RichEdit. Основным условием было - задавать цвет, размер и другие параметры текста как можно более простым способом, с использованием одной функции.
За основу была взята функция _Write_GUI_Log, из примера CreatoRа (http://autoit-script.ru/index.php/topic,339.0.html), позже измененная чуть менее, чем полностью.
В итоге получилась функция _GUICtrlRichEdit_TagWrite, которая выводит строку текста в элемент RichEdit с поддержкой тегов.

Конечно RichEdit поддерживает синтаксис RTF, но он довольно неудобен(это еще мягко сказано) для описания вручную.

Решил выложить тут, может еще кому пригодиться.
Синтаксис и поддерживаемые теги описаны в коммнетах(на русском) к функции _GUICtrlRichEdit_TagWrite.
P.S. Написание комментариев по моему было сложнее написания самой функции :smile:

Код/Пример:
Код:
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <GUIRichEdit.au3>

#include <RightEditTagWrite.au3>

$hGUI = GUICreate('_GUICtrlRichEdit_TagWrite Demo', 640, 480, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_CLIPSIBLINGS))

$hRichText = _GUICtrlRichEdit_Create($hGUI, "", 0, 0, 640, 480, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
_GUICtrlRichEdit_SetReadOnly($hRichText, True)

GUISetState(@SW_SHOW, $hGUI)

_main()
Exit



Func _main()
    _GUICtrlRichEdit_PauseRedraw($hRichText)

    ;Можно использовать одиночные теги:
    $s = '[size=10]обычный текст, [b]жирный, [i]жирный и курсивный, [/b] курсивный, [/i][s][c=red]красный перечеркнутый,[/s][/c][n]новая строка, [c=0xFF0000][u]синий подчеркнутый,[/u]' _
         & ' [c=green][sz=15][f=Comic Sans MS]большой, зеленый и веселый[/sz][/f][c=GRAY] серый и т.п.     [n]следующий текст через две строки...[n=3]'
    _GUICtrlRichEdit_TagWrite($hRichText, $s)

    ;Или группировать их вместе через запятую
    $s = '[size=10]обычный текст, [b]жирный, [i]жирный и курсивный, [/b] курсивный, [/i,s,c=red]красный перечеркнутый,[/s,/c,n]новая строка, [c=0xFF0000,u]синий подчеркнутый,' _
         & ' [/u,c=green,sz=15,f=Comic Sans MS]большой, зеленый и веселый[/sz,/f,c=GRAY] серый и т.п.     [n]следующий текст через две строки...[n=3]'
    _GUICtrlRichEdit_TagWrite($hRichText, $s)

    ;Так же можно изменить символы закрывающей и открывающей скобки и символ определяющий закрывающий тег
    $s = '{size=10}обычный текст, {b}жирный, {i}жирный и курсивный, {-b} курсивный, {-i,s,c=red}красный перечеркнутый,{-s,-c,n}новая строка, {c=0xFF0000,u}синий подчеркнутый,' _
         & ' {-u,c=green,sz=15,f=Comic Sans MS}большой, зеленый и веселый{-sz,-f,c=GRAY} серый и т.п.     {n}следующий текст через две строки...{n=3}'

    _GUICtrlRichEdit_TagWriteSetTagChars('{', '}', '-')
    _GUICtrlRichEdit_TagWrite($hRichText, $s)

    $s = '[size=15]Предопределенные цвета:[/n,/size,b,c=aqua]AQUA [c=black]BLACK [c=BLUE]BLUE [c=CREAM,bc=BLACK]CREAM [/bc,c=FUCHSIA]FUCHSIA [c=GRAY]GRAY [c=GREEN]GREEN  ' _
         & '[c=LIME]LIME [c=MAROON]MAROON [c=MEDBLUE]MEDBLUE [c=MEDGRAY]MEDGRAY[n,c=MONEYGREEN]MONEYGREEN [c=NAVY]NAVY [c=OLIVE]OLIVE [c=PURPLE]PURPLE [c=RED]RED [c=SILVER]SILVER ' _
         & '[c=SKYBLUE]SKYBLUE [c=TEAL]TEAL [c=YELLOW,bc=BLACK]YELLOW [c=WHITE]WHITE'

    _GUICtrlRichEdit_TagWriteSetTagChars('[', ']', '/')
    _GUICtrlRichEdit_TagWrite($hRichText, $s)

    _GUICtrlRichEdit_ResumeRedraw($hRichText)

    while 1
        $nMsg = GUIGetMsg(1)
        Switch $nMsg[0]
            Case $GUI_EVENT_CLOSE
                GUIDelete()
                Exit
        EndSwitch
    WEnd
EndFunc

Результат работы примера (скриншот):

Автор: aleratorio

А что такое RightEditTagWrite.au3? Гугл молчит. Находит только эту страницу, остальное не релевантно...Тоже хотел раскрашивать текст тегами в Edit, но готовых решений нет.
 
Верх