Описание функции
SCI_STYLE
Для подсветки кода программирования или кода разметки
Примечания
Набор функций стиляСм. также
SCI_INDICATORПример
; AZJIO (My_Notepad_Sci)
; https://disk.yandex.ru/d/KshKLKk7nJ-RRg
EnableExplicit
#q$ = Chr(34)
#SciG = 0
Structure SciRegExp
re.s
id.i
len.i
*mem
EndStructure
Define *tmp
Global tmp
Global NewList regex.SciRegExp()
Declare SciNotification(Gadget, *scinotify.SCNotification)
Declare Color(List regex.SciRegExp(), posStart, posEnd)
If Not InitScintilla()
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
MessageRequester("", "Не инициализирован Scintilla.dll")
CompilerEndIf
End
EndIf
;- RegExp подсветка стандартного текста
AddElement(regex())
regex()\re = #q$ + "[^" + #q$ + "]+?" + #q$
AddElement(regex())
regex()\re = "[a-zA-Z]"
AddElement(regex())
regex()\re = "[\[\]]"
AddElement(regex())
regex()\re = "[()+?]"
AddElement(regex())
regex()\re = "\d+"
ForEach regex()
regex()\len = Len(regex()\re)
regex()\mem = UTF8(regex()\re)
tmp + 1
regex()\id = tmp
Next
If OpenWindow(0, 0, 0, 1024, 600, "ScintillaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ScintillaGadget(#SciG, 0, 0, 1024, 600, @SciNotification())
ScintillaSendMessage(#SciG, #SCI_SETWRAPMODE, #SC_WRAP_WORD) ; с переносами строк
ScintillaSendMessage(#SciG, #SCI_SETMARGINWIDTHN, 1, 0) ; Устанавливает ширину поля 1 (номеров строк)
ScintillaSendMessage(#SciG, #SCI_STYLESETSIZE, #STYLE_DEFAULT, 10) ; размер шрифта
; ScintillaSendMessage(#SciG, #SCI_STYLECLEARALL) ; общий стиль для всех
; ScintillaSendMessage(#SciG, #SCI_STYLESETBACK, #STYLE_DEFAULT, $3f3f3f) ; цвет фона
; ScintillaSendMessage(#SciG, #SCI_STYLESETFORE, #STYLE_DEFAULT, $aaaaaa) ; цвет текста
; ScintillaSendMessage(#SciG, #SCI_STYLESETFORE, 0, $008800) ; = #STYLE_DEFAULT
; #SCI_STYLESETBACK ?
ScintillaSendMessage(#SciG, #SCI_STYLESETFORE, 1, $aaaa00)
ScintillaSendMessage(#SciG, #SCI_STYLESETFORE, 2, $009900)
ScintillaSendMessage(#SciG, #SCI_STYLESETFORE, 3, $ff9900)
ScintillaSendMessage(#SciG, #SCI_STYLESETFORE, 4, $0000ff)
ScintillaSendMessage(#SciG, #SCI_STYLESETFORE, 5, $ff00ff)
*tmp = UTF8(~"Это простой ScintillaGadget с \"текстом\"..." + #LF$ + "Больше [текста]" + #LF$ + "Еще больше (текста), 333!")
ScintillaSendMessage(#SciG, #SCI_SETTEXT, 0, *tmp)
FreeMemory(*tmp)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
ForEach regex()
FreeMemory(regex()\mem)
Next
EndIf
; Подсвечивание через стиль
Procedure Color(List regex.SciRegExp(), posStart, posEnd)
Protected txtLen, StartPos, EndPos, firstMatchPos
ForEach regex()
EndPos = posStart
Repeat
ScintillaSendMessage(#SciG, #SCI_SETTARGETSTART, EndPos) ; от начала (задаём область поиска) используя позицию конца предыдущего поиска
ScintillaSendMessage(#SciG, #SCI_SETTARGETEND, posEnd) ; до конца по длине текста
firstMatchPos = ScintillaSendMessage(#SciG, #SCI_SEARCHINTARGET, regex()\len, regex()\mem) ; возвращает позицию первого найденного. В параметрах длина искомого и указатель
; Debug firstMatchPos
If firstMatchPos > -1 ; если больше -1, то есть найдено, то
StartPos = ScintillaSendMessage(#SciG, #SCI_GETTARGETSTART) ; получает позицию начала найденного
EndPos = ScintillaSendMessage(#SciG, #SCI_GETTARGETEND) ; получает позицию конца найденного
ScintillaSendMessage(#SciG, #SCI_STARTSTYLING, StartPos) ; позиция начала (с 50-го)
ScintillaSendMessage(#SciG, #SCI_SETSTYLING, EndPos - StartPos, regex()\id) ; ширина и номер стиля
; Debug Str(StartPos) + " " + Str(EndPos) + " " + Str(EndPos - StartPos) + " " + Str(regex()\id)
Else
Break
EndIf
ForEver
Next
EndProcedure
; Уведомления
Procedure SciNotification(Gadget, *scinotify.SCNotification)
Protected posEnd, posStart, line
With *scinotify
Select \nmhdr\code
Case #SCN_STYLENEEDED ; нужна стилизация, подсветка текста
; Устанавливает целевой диапазон поиска
posStart = ScintillaSendMessage(#SciG, #SCI_GETENDSTYLED)
posEnd = *scinotify.SCNotification\Position
line = ScintillaSendMessage(#SciG, #SCI_LINEFROMPOSITION, posStart) ; номер строки из позиции (в которой расположен курсор)
posStart = ScintillaSendMessage(#SciG, #SCI_POSITIONFROMLINE, line) ; позиция начала указанного номера строки
; Устанавливает режим поиска (REGEX + POSIX фигурные скобки)
ScintillaSendMessage(#SciG, #SCI_SETSEARCHFLAGS, #SCFIND_REGEXP | #SCFIND_POSIX)
; подсвечивает всё или строку в которой ввод
Color(regex(), posStart, posEnd)
; подкраска, чтобы прекратить досить подсветкой каждую секунду
ScintillaSendMessage(#SciG, #SCI_STARTSTYLING, 2147483646) ; позиция больше документа (2Gb)
ScintillaSendMessage(#SciG, #SCI_SETSTYLING, 0, 0) ; ширина и номер стиля
EndSelect
EndWith
EndProcedure