Что нового

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Версия 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)
Источник
Ссылка на источник

Вложения

  • GUIRichLabel_1.1.zip
    11 КБ · Просмотры: 15
  • GUIRichLabel_1.2.zip
    11.4 КБ · Просмотры: 9
  • GUIRichLabel_1.3.zip
    11.5 КБ · Просмотры: 18
Последнее редактирование:

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,671
Репутация
2,481
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,671
Репутация
2,481
Bloodrinker [?]
этот параметр делает текст жирным вплоть до конца текста. Почему - пока не знаю
Я в комментариях к массиву написал причину.
В следующей версии поправлю.
 

Bloodrinker

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

CreatoR

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

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

Vic58

Знающий
Сообщения
24
Репутация
10
Замечательная библиотека. Обнаружилась мелкая ошибка:

Код:
$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,671
Репутация
2,481
мигание, возникающее при отрисовке каждого цветового тега в RichLabel
Можно пример того как это происходит?

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

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

CreatoR

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

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

CreatoR

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

Vic58

Знающий
Сообщения
24
Репутация
10
Немедленно протестирую.

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

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

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

Код:
Return 'GUI_RUNDEFMSG'

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

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

InnI

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

Vic58

Знающий
Сообщения
24
Репутация
10
Понял, спасибо!
Сообщение автоматически объединено:

Перезалил архив, версия осталась прежней.
Не могу понять, наверное я что-то делаю не так. 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,671
Репутация
2,481
Там не только в этом дело, есть ещё проблема с прозрачностью...
Перезалил, версия прежняя.
 

Vic58

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

CreatoR

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

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

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

Vic58

Знающий
Сообщения
24
Репутация
10
Подробнее можно, что значит цвет подкладки?
Под "подкладкой" я понимаю (по старинке) фон (цвет или картинку) по размерам элемента, заявленным при 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,671
Репутация
2,481
С 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

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

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

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