Что нового

Элементы GUI GUIRichLabel - Создание форматированного элемента Label (на основе RichEdit)

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 397
Репутация
2 383
Версия AutoIt
3.3.14.5
Версия
1.3
Описание: Позволяет создавать форматированные строчки используя псевдоэлемент RichLabel (RichEdit на самом деле). Форматирование задаётся модификатором похожим на тег <font> в Html.
Примечание: Данная библиотека является трансформацией-продолжением “родственной” библиотеки GUITFLabel.

Код/Пример:
Код:
#include <GUIConstantsEx.au3>

#include "GUIRichLabel.au3"

$hGUI = GUICreate("Example #1", 300, 200)

$sData1 = _
    'some simple data and... <font color="red" size="8.5" attrib="italic+bold">My</font> ' & _
    '<font color="blue" size="9" attrib="bold">Colored</font> ' & _
    '<font color="darkgreen" attrib="u" size="8.5" name="Tahoma">Label</font> data.'

$sData2 = _
    'and ' & _
    '<font color="brown" size="9" attrib="bold">Few</font> ' & _
    '<font color="darkorange" size="9" attrib="bold">&more</font> ' & _
    '<font color="navy" size="12" attrib="bold" name="Georgia">strings</font> data.'

$hRichLabe1 = _GUICtrlRichLabel_Create($hGUI, $sData1, 20, 20, 260, 25)
$hRichLabe2 = _GUICtrlRichLabel_Create($hGUI, $sData2, 20, 50, 260, 45)
$hRichLabe3 = _GUICtrlRichLabel_Create($hGUI, '', 20, 80, 260, 60)

GUISetState(@SW_SHOW, $hGUI)

_GUICtrlRichLabel_SetData($hRichLabe3, '<font attrib="bold" align="center">Hello New Data</font>' & @LF & '<font color="purple" size="9" attrib="bold">New Line</font>')
Sleep(1500)
_GUICtrlRichLabel_SetPos($hRichLabe3, 20, 120, 260, 40)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Снимок:
Example 1.pngExample 2.pngFormatted Labels Editor.pngStringCompare Example.png

История версий:
v1.3
+ Добавлены параметры $iStyle и $iExStyle в функцию _GUICtrlRichLabel_Create для большей гибкости.

v1.2
+ Добавлена функция _GUICtrlRichLabel_SetDefFont для указания данных шрифта RichLabel по умолчанию.
* Исправлена проблема с падением скрипта при некоторых условиях.
* Исправлена проблема с именем шрифта (когда имеются пробелы в нём).

v1.1
+ Добавлена функция _GUICtrlRichLabel_GetData.
+ Добавлен пример "Running Letter Example.au3".
* Исправлена проблема с пустыми тегами.
* Смешанные теги теперь удаляются с текста.

v1.0
Первая версия.
 
Автор
G.Sandler (CreatoR)
Источник
Ссылка на источник

Вложения

Последнее редактирование:

Bloodrinker

<Блуждающий...>
Сообщения
228
Репутация
19
А можно как нибудь от мерцания при обновлении текста избавиться? :scratch:
Код:
#include 'GUIRichLabel.au3'
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Global $sLabel_Data1='Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'
$hGUI = GUICreate("Form1", 505, 100, 192, 124)
$Label2 = _GUICtrlRichLabel_Create($hGUI, '', 16, 16, 450, 121)
GUICtrlSetFont($Label2, 16, 800, 0)
GUISetState(@SW_SHOW)

$sLen=StringLen($sLabel_Data1)
$i=2
Global $TagTextLeft[2] = ['<font>', '</font>']
Global $TagTextActive[2] = ['<font color="White" weight="800">', '</font>']
Global $TagTextRight[2] = ['<font>', '</font>']
Func ColorText()
$i+=1
	 $TextLeft = $TagTextLeft[0] & StringLeft($sLabel_Data1, $i-1) & $TagTextLeft[1]
     $TextActive = $TagTextActive[0] & StringMid($sLabel_Data1,$i,1) & $TagTextActive[1]
	 $TextRight = $TagTextRight[0] & StringRight($sLabel_Data1, $sLen -$i) & $TagTextRight[1]
	 $MainStr = $TextLeft & $TextActive & $TextRight
	_GUICtrlRichLabel_SetData($Label2,$MainStr)
EndFunc

While 1
	ColorText()
	Sleep(100)
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 397
Репутация
2 383
Bloodrinker [?]
можно как нибудь от мерцания при обновлении текста избавиться?
Можно, нужно использовать @SW_LOCK.

И кстати, параметра weight уже нет, вместо него используется «attrib="b"».

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

#include "GUIRichLabel.au3"

Global $sLabel_Data = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'
Global $iData_Len = StringLen($sLabel_Data)
Global $iCount = 2
Global $aTagTextLeft[2] = ['<font>', '</font>'] ;Пустые теги лучше не использовать
Global $aTagTextActive[2] = ['<font color="red" attrib="b">', '</font>']
Global $aTagTextRight[2] = ['<font>', '</font>']

$hGUI = GUICreate("Form1", 500, 100)

$hRichLabel = _GUICtrlRichLabel_Create($hGUI, '', 15, 15, 450, 120)
GUICtrlSetFont($hRichLabel, 16, 800, 0)

GUISetState(@SW_SHOW)
AdlibRegister('_ColorText', 100)

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

Func _ColorText()
	$iCount += 1
	
	If $iCount > $iData_Len Then
		$iCount = 2
	EndIf
	
	$sTextLeft = $aTagTextLeft[0] & StringLeft($sLabel_Data, $iCount - 1) & $aTagTextLeft[1]
	$sTextActive = $aTagTextActive[0] & StringMid($sLabel_Data, $iCount, 1) & $aTagTextActive[1]
	$sTextRight = $aTagTextRight[0] & StringRight($sLabel_Data, $iData_Len - $iCount) & $aTagTextRight[1]
	$sData = $sTextLeft & $sTextActive & $sTextRight
	
	GUISetState(@SW_LOCK)
	_GUICtrlRichLabel_SetData($hRichLabel, $sData)
	GUISetState(@SW_UNLOCK)
EndFunc
 

Bloodrinker

<Блуждающий...>
Сообщения
228
Репутация
19
attrib="b" работает. Вот только этот параметр делает текст жирным вплоть до конца текста. Почему - пока не знаю
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 397
Репутация
2 383
Bloodrinker [?]
этот параметр делает текст жирным вплоть до конца текста. Почему - пока не знаю
Я в комментариях к массиву написал причину.
В следующей версии поправлю.
 

Bloodrinker

<Блуждающий...>
Сообщения
228
Репутация
19
CreatoR [?]
Я а комментариях к массиву написал причину.
Угу. это понятно. по я кое-что подменил и теги теперь не пустые. А без пустых тегов работает, да.
Ждем новой версии. :IL_AutoIt_1:
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 397
Репутация
2 383
Обновление...

v1.1
+ Добавлена функция _GUICtrlRichLabel_GetData.
+ Добавлен пример "Running Letter Example.au3".
* Исправлена проблема с пустыми тегами.
* Смешанные теги теперь удаляются с текста.
 

Vic58

Новичок
Сообщения
12
Репутация
0
Замечательная библиотека. Обнаружилась мелкая ошибка:

Код:
$aFontData = __GUIRichLabel_GUIGetFont()
 If @error Then
Dim $aFontData[6] = [5, 8.3, 400, 0, "Arial", 0]
EndIf


при клике по окну не в фокусе (например после закрытия Tray, того же скрипта) вызывает ошибку, т.к. __GUIRichLabel_GUIGetFont() возвращает 0 и @error=0.
Лечится просто:
Код:
If @error or Not IsArray($aFontData) Then
Dim $aFontData[6] = [5, 8.3, 400, 0, "Arial", 0]
EndIf


Вопрос к CreatoR

Можно ли как-то победить мигание, возникающее при отрисовке каждого цветового тега в RichLabel.
конструкция
Код:
[URL='https://autoit-script.ru/docs/functions/guisetstate.htm']GUISetState[/URL]([URL='https://autoit-script.ru/docs/macros.htm']@SW_LOCK[/URL])    
_GUICtrlRichLabel_SetData($hRichLabel, $sData)    
[URL='https://autoit-script.ru/docs/functions/guisetstate.htm']GUISetState[/URL]([URL='https://autoit-script.ru/docs/macros.htm']@SW_UNLOCK[/URL])

не помогает, т.к. происходит перерисовка всего окна (содержит также ListBox и кнопки).
Элемент RichLabel (как подсказка к выбранному пункту ListBox) создается так:
Код:
If $RichLabMod = -1 Then $RichLabMod = BitOR($ES_MULTILINE, $ES_AUTOVSCROLL, $ES_READONLY)
If $RichLabExMod = -1 Then $RichLabExMod = $WS_EX_TRANSPARENT
$_GRE_sRTFClassName = '' ;Fix for AutoIt 3.3.8.1 to create more than one RichEdit control
$hRichLabel = _GUICtrlRichEdit_Create($hWnd, "", $iLeft, $iTop, $iWidth, $iHeight, $RichLabMod, $RichLabExMod)
 _GUICtrlRichEdit_SetEventMask($hRichLabel, BitOR($ENM_LINK, $ENM_MOUSEEVENTS))
;~ _GUICtrlRichEdit_AutoDetectURL($hRichLabel, $fAutoDetectURL)
_GUICtrlRichEdit_AutoDetectURL($hRichLabel, True)

Сообщение автоматически объединено:

Возился несколько дней, а решение нашлось неожиданно, (как раньше не увидел?):
Код:
_GUICtrlRichEdit_PauseRedraw($RichLabel)
_GUICtrlRichLabel_SetData($RichLabel, ......)
GUICtrlSetState ($hListMBox, $GUI_FOCUS) ; фокус на требуемом элементе
_GUICtrlRichEdit_ResumeRedraw($RichLabel)


Теперь другая проблема, никак не могу найти где задать цвет символов и фона по умолчанию в RichLabel?
 
Последнее редактирование:
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 397
Репутация
2 383
мигание, возникающее при отрисовке каждого цветового тега в RichLabel
Можно пример того как это происходит?

решение нашлось
Можно ещё попробовать задать главному окну стиль $WS_CLIPCHILDREN, или самому RichEdit задать расширенный стиль $WS_EX_COMPOSITED.

где задать цвет символов и фона по умолчанию в RichLabel?
<font color= и <font bkcolor=.
 
Последнее редактирование:
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 397
Репутация
2 383
Обновил немного:

v1.2
+ Добавлена функция _GUICtrlRichLabel_SetDefFont для указания данных шрифта RichLabel по умолчанию.
* Исправлена проблема с падением скрипта при некоторых условиях.
* Исправлена проблема с именем шрифта (когда имеются пробелы в нём).
 
Последнее редактирование:
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 397
Репутация
2 383
Перезалил архив, версия осталась прежней.
 

Vic58

Новичок
Сообщения
12
Репутация
0
Немедленно протестирую.

Мигание возникало (по одному на цветной тег при отрисовке) если статус элемента RichLabel изменить из Disable в ReadOnly
(мне необходима возможность выделять и копировать текст из элемента, а также возможность прокрутки в элементе).
Но, слава богу, решилось.

(Исходник я бы лично Вам мог бы сбросить, - это когда-то успешный проэкт, заброшенный из-за приоритетов в двухтысячных.
Писал на pas - последняя версия Delfi, за год перегнал на 90-95%, пока сыроват. В AutoIt получился намного компактнее и интереснее.)
Сообщение автоматически объединено:

Пока работает.
А как правильно завершить в "_GUIRichLabel_WM_NOTIFY" :

Код:
Return 'GUI_RUNDEFMSG'

или
Код:
Return Eval("GUI_RUNDEFMSG")

Я использую последнее, вроде работает, но правильно ли это?
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4 371
Репутация
1 178
Константа $GUI_RUNDEFMSG определена в GUIConstantsEx.au3
Код:
Global Const $GUI_RUNDEFMSG = 'GUI_RUNDEFMSG'
Но в GUIRichLabel.au3 данная константа не определена, поэтому возвращается строка в явном виде. Функция Eval вернёт пустую строку, если переменная не определена, что для windows-сообщений может быть критично.
 

Vic58

Новичок
Сообщения
12
Репутация
0
Понял, спасибо!
Сообщение автоматически объединено:

Перезалил архив, версия осталась прежней.
Не могу понять, наверное я что-то делаю не так. Win10(64), AutoIt(32)
При запуске примеров (из TotalComfnder) цвет фона и цвет символов в примерах один - черный.
Старые примеры в библиотеке V1.1 по прежнему цветные.
Возможно в Win10(64) установлена темная цветовая схема (обычно тема в 64 разрядной винде не влияет на 32 разрядные приложения и наоборот)
У меня полу-консольное 32 приложение (и конечно желательно унаследовать раскраску от корня - 64 разр.)
Поковыряюсь еще. Вопрос - конструкция
Код:
$a3DfaceColor = DllCall("User32.dll", "int", "GetSysColor", "int", 15) ;$COLOR_3DFACE
$n3DfaceColor = BitAND(BitShift(String(Binary($a3DfaceColor[0])), 8), 0xFFFFFF) ;RGB2BGR

аналог WinAPI GetSysColor ?
Сообщение автоматически объединено:

Перезалил архив, версия осталась прежней.
кажется разобрался, как всегда мелочь. В строке 313 фунция
Код:
Func __GUIRichLabel_FontTagGetParamValue($sTag_Data, $sParamName, $sDefault)

в библиотеке не использует возвращаемого значения, для функционольности необходимо аргумент $sDefault использовать по ссылке:
Код:
Func __GUIRichLabel_FontTagGetParamValue($sTag_Data, $sParamName, ByRef $sDefault)

Так, вроде, снова все правильно.
 
Последнее редактирование:
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 397
Репутация
2 383
Там не только в этом дело, есть ещё проблема с прозрачностью...
Перезалил, версия прежняя.
 

Vic58

Новичок
Сообщения
12
Репутация
0
Там не только в этом дело, есть ещё проблема с прозрачностью...
Перезалил, версия прежняя.
Да, решено.
Но есть еще две проблемы (по крайней мере для меня):
- одна мелкая, - цвет "подкладки" прямоугольника элемента, как в _GUICtrlRichEdit_SetBkColor() у меня не проходит. Можно мириться.
- вторая - Элемент RichLabel не привязывается по стандартам AutoIt к окну GUI с артибутом $WS_SIZEBOX, т.е. утановки GUICtrlSetResizing() игнорируются и элемент "накатывается" на другие компоненты при изменении границ окна GUI. Это существенно ограничивает диапазон использования, хотя, на мой взгляд, RichLabel - очень полезная вещь. Я уже взял на вооружение. Наверняка как-то можно это исправить, если есть возможность - подскажите.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 397
Репутация
2 383
цвет "подкладки" прямоугольника элемента, как в _GUICtrlRichEdit_SetBkColor() у меня не проходит
Подробнее можно, что значит цвет подкладки?

Элемент RichLabel не привязывается по стандартам AutoIt к окну GUI с артибутом $WS_SIZEBOX
По скольку элемент RichLabel по сути является RichEdit, то стандартными средствами тут не обойтись, нужно подключать мою библиотеку GUICtrlSetResizingEx.
Код:
_GUICtrlSetResizingEx($hRichLabel, BitOR($GUI_DOCKLEFT, $GUI_DOCKRIGHT, $GUI_DOCKTOP))

И её же в принципе можно использовать как замену стандартной GUICtrlSetResizing для других элементов.
 

Vic58

Новичок
Сообщения
12
Репутация
0
Подробнее можно, что значит цвет подкладки?
Под "подкладкой" я понимаю (по старинке) фон (цвет или картинку) по размерам элемента, заявленным при GuiCtrl*Create.
Для RichEdit работает, например:
Код:
$hGui = GUICreate("Example", 320, 350, -1, -1) 
$g_hRichEdit = _GUICtrlRichEdit_Create($hGui, "", 10, 10, 300, 220,  BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
_GUICtrlRichEdit_SetBkColor($g_hRichEdit, 0xB3B3C7)

- создаст закрашенный цветом 0xB3B3C7 прямоугольник элемента RichEdit 300х220, на котором можно располагать в дальнейшем любой текст.
С RichLabel у меня так не получается - базовый цвет фона, (обозначающий границы или интегрирующий в интерьер основного окна) по *RichEdit_SetBkColor игнорируется. Фоновый цвет получается всегда белый.

_GUICtrlSetResizingEx() работает. Правда, на первый взгляд, некоторая несовместимость при совместном использовании со стандартной GUICtrlSetResizing в одном окне GUI, но точно не могу утверждать, пока мало проверок сделал, возможно сам допускаю некорректные параметры, позже отпишусь. Но то что РАБОТАЕТ - это точно и это очень радует :smile: !
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 397
Репутация
2 383
С RichLabel у меня так не получается - базовый цвет фона, (обозначающий границы или интегрирующий в интерьер основного окна) по *RichEdit_SetBkColor игнорируется. Фоновый цвет получается всегда белый.
Ну он не белый а прозрачный. В этом и вся идея RichLabel...
Можно конечно делать так (внутри библиотеки):

Код:
$hRichLabel = _GUICtrlRichEdit_Create($hWnd, "", $iLeft, $iTop, $iWidth, $iHeight, BitOR($ES_MULTILINE, $ES_AUTOVSCROLL));, $WS_EX_TRANSPARENT)
    ;WinSetState($hRichLabel, '', @SW_DISABLE)


некоторая несовместимость при совместном использовании со стандартной GUICtrlSetResizing
Так я же писал, она не нужна.
 

Vic58

Новичок
Сообщения
12
Репутация
0
Так я же писал, она не нужна. (стандартная GUICtrlSetResizing() - это от меня)
У стандартной функции был один плюс - не надо было указывать CtrlId элемента, достаточно: GUICtrlSetResizing(-1, ...) - (последний созданный)
Придется переделывать все элементы, созданные без указания [Local CtrlId=] GUICtrl*Create(). Похоже, Вы правы - смешивать стандартную и библиотечную функции не стоит. Перепахать видимо придется - не хочу отказываться от RichLabel.

И опять, - у меня не получается закрасить цвет фона всего элемента RichLabel, - результат всегда один - фон белый. Что надо сделать, не могу понять, закопался.
Сообщение автоматически объединено:

То, что фон прозрачный, - это огромный плюс. Это необходимо сохранить. Но как задать фон - только изменением фона основного окна - или еще есть варианты?
 
Последнее редактирование:
Верх