Что нового

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

Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Придется переделывать все элементы
Что там переделывать, забейте в поиск и замену (с рег. выражением) GUICtrlSetResizing\(-1 с заменой на _GUICtrlSetResizingEx($hRichLabel.

не получается закрасить цвет фона всего элемента RichLabel
Для этого нужно убрать стиль $WS_EX_TRANSPARENT у RichEdit и убрать @SW_DISABLE окна, как я показал выше.

как задать фон - только изменением фона основного окна - или еще есть варианты?
Если менять фон окна, то должен меняться и фон под элементом...
 

Vic58

Знающий
Сообщения
24
Репутация
10
Что там переделывать, забейте в поиск и замену (с рег. выражением) GUICtrlSetResizing\(-1 с заменой на _GUICtrlSetResizingEx($hRichLabel.
Разобрался наконец с принципом работы, все отлично, несовместимости со стандартной GUICtrlSetResizing() в одном окне GUI нет, видимо сам допускал ошибки.
С режимом $WS_EX_TRANSPARENT иногда только под управляемым тегами текстом появляется черный фон, пока точно сказать не могу, отложил на потом, использую READONLY ( убрал стиль $WS_EX_TRANSPARENT у RichEdit и убрал @SW_DISABLE) - проблем нет.

Пришлось закомментировать часть текста в функции __GUIRichLabel_WM_NOTIFY в Вашей последней библиотеке :
Код:
Switch $iCode
; Case $EN_MSGFILTER
;  Return 1
;  Switch $iWM_Msg
;   Case $WM_LBUTTONDOWN, $WM_RBUTTONDOWN, $WM_LBUTTONDBLCLK, 0x0206 ;$WM_RBUTTONDBLCLK
;     Return 1
;  EndSwitch
Case $EN_LINK
 If $iWM_Msg = $WM_LBUTTONUP Then
    $tEnLink = DllStructCreate($tagENLINK, $iLparam)
    $cpMin = DllStructGetData($tEnLink, "cpMin")
    $cpMax = DllStructGetData($tEnLink, "cpMax")
    $sURL = _GUICtrlRichEdit_GetTextInRange($hWndFrom, $cpMin, $cpMax)
    ShellExecute($sURL)
  EndIf
 EndSwitch
    Return 'GUI_RUNDEFMSG'

В этом случае начинает работать прокрутка в RichLabel когда текст не умещается в размер элемента, становится возможным выделять и копировать текст из элемента, начинают работать ссылки.
В ходовых испытаниях обнаружилась странность: последовательные группы Radio (созданные по GUICtrlCreateRadio() и GUIStartGroup() ) объединяются в одну, если перед ними создать RichLabel. Если после - то все нормально, но в том-то и дело, что последовательность создания произвольная.
Где-то пересекаются обработки системных сообщений, наверное. Все перепробовал - не могу разобраться.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
В этом случае начинает работать прокрутка в RichLabel когда текст не умещается в размер элемента, становится возможным выделять и копировать текст из элемента, начинают работать ссылки.
Ну как бы это было специально убрано, не в этом замысел элемента.

обнаружилась странность
Нужен пример.
 

Vic58

Знающий
Сообщения
24
Репутация
10

Код:
#include <GuiConstantsEx.au3>
#include "GUIRichLabel.au3"
Global $test=1 ; если установить 0, то второй вариант
exsample()
func exsample()
Dim $radio[8]
$rx_menGUIIP=GUICreate("IP адрес", 220, 180)
if $test Then
$Rx_InfStatus0 = _GUICtrlRichLabel_Create($rx_menGUIIP, '<font color="red"> Выберите IP1 и IP2 адрес </font>', 10, 10, 200, 20)
EndIf
;GUIStartGroup($rx_menGUIIP) ;"странность" возникает если не указана эта строка
$radio[0] = GUICtrlCreateRadio("192.168.0.0", 20, 40)
$radio[1] = GUICtrlCreateRadio("192.168.0.1", 20, 60)
$radio[2] = GUICtrlCreateRadio("192.168.0.2", 20, 80)
$radio[3] = GUICtrlCreateRadio("192.168.0.3", 20,100)
GUIStartGroup($rx_menGUIIP)
$radio[4] = GUICtrlCreateRadio("192.168.8.0", 120, 40)
$radio[5] = GUICtrlCreateRadio("192.168.8.1", 120, 60)
$radio[6] = GUICtrlCreateRadio("192.168.8.2", 120, 80)
$radio[7] = GUICtrlCreateRadio("192.168.8.3", 120,100)
$but = GUICtrlCreateButton("OK", 80, 150, 60, 20)
if Not $test Then
$Rx_InfStatus0 = _GUICtrlRichLabel_Create($rx_menGUIIP, '<font color="red"> Выберите IP1 и IP2 адрес </font>', 10, 130, 200, 20)
EndIf
GUICtrlSetState($radio[1], $GUI_CHECKED)
GUICtrlSetState($radio[6], $GUI_CHECKED)
GUISetState()
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE , $but
Exit
EndSwitch
WEnd
EndFunc

В принципе, ничего изменять не надо. Пока делал пример - нашел выход. Уже переделываю свой скрипт, для динамического отслеживания в каждого первого элемента GUICtrlCreateRadio для вставки перед ним GUIStartGroup (раньше прокатывало так, но это моя неопытность).

Какой у Вас цвет фона в примере?
Сообщение автоматически объединено:

Ну как бы это было специально убрано, не в этом замысел элемента.
(Прошу прощения за последний вопрос - он крайне некорректный.)
То, что было убрано, - это большая часть возможностей Вашего RichLabel. Считаю, что RichLabel вполне успешный самостоятельный элемент кода, который можно включать в комплект установки AutoIt, конечно совместно с библиотекой GUICtrlSetResizingEx.au3. Это очень упрощает реализацию своих идей людям, которые не владеют синтаксисом разметки RTF (я думаю таких 99,9..9%). Единственный мелкий недостаток - надо полностью прописывать названия аргументов <font ..
Работает четко, но есть ньюанс. Если кто будет использовать скроллинг окна, чтобы не тратить время, сразу используйте библиотеку GUIScrollbars_Ex UDF от Melba23: https://www.autoitscript.com/forum/topic/113723-scrollbars-made-easy-new-version-13-may-18/ - корректно работает с RichLabel и не только, в отличии от GuiScrollBars.au3, входящей в комплект поставки (тестировалась по примерам - не видит, не определяет размеров и бессмысленно смещает RichLabel при изменении размеров окон).
И еще один вопрос-просьба-или помощь к CreatoR:
Часто возникает ситуация - окно создано для определенного разрешения экрана, или пользователь загнал в него слишком много элементов.
Желательно сохранить, например описание и кнопки управления на своем месте, а то, что не уместилось (при запуске на устройстве с меньшим разрешением), включая элементы RichLabel, определить частью окна со скроллингом, т.е. организовать скроллинг части окна.
Самое простое решение, которое напрашивается, - это встроенное дочернее окно с элементами управления и скроллингом - нет проблем. Но при изменении размеров (Resizing) основного окна, такое окно ведет себя абсолютно независимо с вылетом из основного окна. Сердцем чувствую и умом понимаю, что принцип в GUICtrlSetResizingEx.au3 позволяет решить задачу, но как грамотно это сделать - сочетание RichLabel и Resizing дочернего окна в окне в одной библиотеке, - тут прошу видение, решение или помощь автора.
 
Последнее редактирование:
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
организовать скроллинг
Код:
$hRichLabel = _GUICtrlRichEdit_Create($hWnd, "", $iLeft, $iTop, $iWidth, $iHeight, BitOR($ES_MULTILINE, $ES_AUTOVSCROLL, $WS_VSCROLL, $WS_HSCROLL), $WS_EX_TRANSPARENT)
;WinSetState($hRichLabel, '', @SW_DISABLE)


это в _GUICtrlRichLabel_Create нужно заменить.
Тогда при большом тексте появится скролл.
Но опять таки, это в первую очередь Label, т.е статический элемент.
 
Автор
CreatoR

CreatoR

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

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

Теперь не нужно лезть в UDF чтобы включить, к примеру, прокрутку.
Достаточно делать так:
Код:
_GUICtrlRichLabel_Create($hGUI, $sData, 20, 20, 260, 25, BitOr($WS_VSCROLL, $WS_HSCROLL))

Но при этом сбрасывается стиль $WS_DISABLED (деактивация окна), т.к является стилем по умолчанию.
 

Vic58

Знающий
Сообщения
24
Репутация
10
Теперь не нужно лезть в UDF
Это очень хорошо! :yes:
Когда я писал о скроллинге окна (выше), я не имел ввиду скролл в элементе RichLabel - с этим все в порядке. Речь шла о окне с изменяемыми размерами, созданном GuiCreate и содержащем различные элементы, включая RichLabel. Точнее о скроллинге части такого окна, например такой структуры:
============начало окна с изменяемым размером ($WS_SIZEBOX)
...RichLabel... Некое описание (статическая часть)
=======================начало части окна со скроллом
...RichLabel... Промпт (скроллируемая масштабируемая часть)
...Input..
...RichLabel... Промпт
...CheckBox..
...RichLabel... Промпт
...Combo..
...
=======================конец части окна со скроллом
...RichLabel... Подсказка по выбранному элементу выше (статическая часть)
..Button.. ..Button.. ..Button..
============конец окна с изменяемым размером

Задача просто решается при использовании встроенного дочернего окна и библиотеки от Melba23 (ссылка выше). НО, такое окно "отвязанное" от основного окна, живет само по себе при изменении размеров основного окна. :sad:
Не нашел каких либо решений и думаю, что лучшим способом будет делать так, как Вы поступаете с RichEdit в своих библиотеках RichLabel и ResizingEx.
Возможно ли включить дополнительную функцию, создающую и регистрирующую дочернее окно в библиотеку RichLabel, что бы не плодить дополнительные обработчики сообщений винды и "поставить на место" дочернее окно ?
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
такое окно "отвязанное" от основного окна
Его можно привязать если грамотно создать (стили, дочеринство и т.д.)
Но я вообще не понимаю как это связано с данной темой?
Я тебе советую создать новую тему и изложить всю суть задачи (с примерами) того, что ты пытаешься реализовать.
 

Vic58

Знающий
Сообщения
24
Репутация
10
Но я вообще не понимаю как это связано с данной темой?
Я вообще вижу единственное решение для правильного позиционирования "резинового" дочернего окна (по аналогии с RichEdit) внутри основного при изменении размеров основного только при использовании Ваших библиотек, о которых идет речь в данной теме. Могу ошибаться. Пока пробую варианты.
Дополнительно выкладываю в "копилку примеров библиотеки" иллюстацию возможностей прокрутки реально "нагруженного" тегами RichLabel - Example #5.

Example #4 - демонстрация клика по ссылкам - пока под вопросом.
 

Вложения

  • Example #5.au3
    5.3 КБ · Просмотры: 0
Верх