purebasic.info

PureBasic forum
Текущее время: Пт дек 13, 2019 10:23 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Сделал подсветку кода в EditorGadget
СообщениеДобавлено: Чт мар 07, 2019 8:30 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 503
Благодарил (а): 34 раз.
Поблагодарили: 58 раз.
Пункты репутации: 0
Подсветка для PureBasic. Потому что нашёл пример в winapi_library. Скорость оставляет желать лучшего.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
EnableExplicit
Declare ColorFor()
Declare Parse_RegExp(pat$, color)
Declare SetColor(hEdit,s,e,color)
 
Global hEdit
 
Define EventID
 
Procedure SetColor(hEdit,s,e,color)
        Protected cf.charformat2\cbSize = SizeOf(charformat2)
        Protected sel.CHARRANGE
       
        SendMessage_(hEdit,#EM_EXGETSEL,0,sel)
        cf\dwMask       = #CFM_COLOR
        cf\crTextColor  = color            
        SendMessage_(hEdit,#EM_SETSEL,s,e)  
        SendMessage_(hEdit,#EM_SETCHARFORMAT,#SCF_SELECTION,@cf)
        SendMessage_(hEdit,#EM_SETSEL,sel\cpMin,sel\cpMax)
EndProcedure
 
If OpenWindow(0,0,0,800,600,"Пример",#PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
        EditorGadget(1,5,40,WindowWidth(0)-10,WindowHeight(0)-45,0)
        hEdit = GadgetID(1)
        ButtonGadget (2, 10, 5, 80, 30, "Раскрасить")
        ButtonGadget (3, 100, 5, 80, 30, "Cбросить")
        ;       SetGadgetText(1,"PureBasic PureBasic PureBasic PureBasic PureBasic PureBasic")
        SetGadgetColor(1 ,#PB_Gadget_BackColor, $3f3f3f)
        SetGadgetColor(1 ,#PB_Gadget_FrontColor, $AAAAAA)
        If LoadFont(0, "Arial", 11)
                SetGadgetFont(1, FontID(0))
        EndIf
       
        ;       SetColor(1,12,17,$0000FF)
        ;       SetColor(1,22,28,$009900)
        ;       SetColor(1,0,12,$FF8000)
       
       
        Repeat
                Select WaitWindowEvent()
                        Case #PB_Event_Gadget
                                Select EventGadget()
                                        Case 3
                                                SetGadgetColor(1 ,#PB_Gadget_FrontColor, $AAAAAA)
                                        Case 2
                                                SendMessage_(hEdit, #WM_SETREDRAW,0,0)
                                                ColorFor()
                                                SendMessage_(hEdit, #WM_SETREDRAW,1,0)
                                                InvalidateRect_(hEdit, 0, #True)
                                EndSelect
                        Case #PB_Event_SizeWindow
                                ResizeGadget(1, #PB_Ignore, #PB_Ignore, WindowWidth(0)-10,WindowHeight(0)-45)
                        Case #PB_Event_CloseWindow
                                CloseWindow(0)
                                End
                EndSelect
        ForEver
EndIf
 
Procedure ColorFor()
        SetGadgetColor(1 ,#PB_Gadget_FrontColor, $72ADC0) ; По умолчанию
        Parse_RegExp("\w+\$", $6C9AD2) ; переменные текстовые
        Parse_RegExp("\b\d+\b", $9CCBEB) ; числа
        Parse_RegExp("\$[\dA-Fa-f]+", $C0AD72) ; числа шестнадцатеричные
        Parse_RegExp("\w+\(", $DBA6AA) ; процедуры
        ;       Parse_RegExp("", $DBA6AA)
        Parse_RegExp("\w+_\(", $FF8080) ; функции WinAPI
        Parse_RegExp("[&()*/\\:|+<=>,.!%?^~{};\[\]-]+", $8080FF) ; операторы
        Parse_RegExp("\b(?:EndIf|EndDataSection|EndStructure|EndProcedure|CompilerEndIf|EndMacro|Until|ForEver|Wend|ForEver|EndSelect|EndEnumeration|EndImport|CompilerEndSelect|EndStructureUnion|CompilerEndIf|EndInterface|EndWith|Next|If|DataSection|Structure|ProcedureCDLL|ProcedureC|ProcedureDLL|Procedure|CompilerIf|Macro|Repeat|While|Select|Enumeration|Import|CompilerSelect|StructureUnion|CompilerIf|Interface|With|For|ForEach|declarecdll|declaredll|deftype|extends|fakereturn|step|Not|And|Or|True|False|Global|Protected|Shared|Static|Break|Continue|To|Gosub|Return|Case|Goto|End|Swap|Debug|Declare|Define|Dim|ReDim|NewList|NewMap|Prototype|Pseudotype|Threaded|IncludePath|IncludeFile|XIncludeFile|IncludeBinary|Data|Read|Restore|CallDebugger|DebugLevel|DisableDebugger|EnableDebugger|CompilerCase|CompilerDefault|CompilerElse|CompilerError|EnableExplicit|DisableExplicit|EnableASM|DisableASM|ElseIf|Else)\b", $FF9F00)
        Parse_RegExp("[*@]\w+", $70CFF3) ; указатели
        Parse_RegExp("#\w+", $DE98D9) ; константы
        Parse_RegExp("\.[sfdqbliwcapu](?!\w)", $80FFFF) ; типы
        Parse_RegExp("#\w+?\$", $FF66F6) ; константы строковые
        Parse_RegExp("(?<!\.\:)\\\w+", $04A7FF) ; структуры
        Parse_RegExp(Chr(34) + ".+?" + Chr(34), $AAAAAA) ; строки
        Parse_RegExp("(?m)\v?;.*?\r?$", $71AE71) ; комментарии
EndProcedure
 
Procedure Parse_RegExp(pat$, color)
        Protected String$, Pos
        String$ = GetGadgetText(1)
        String$ = ReplaceString(String$, #CRLF$, #LF$)
        If CreateRegularExpression(0, pat$)
                If ExamineRegularExpression(0, String$)
                        While NextRegularExpressionMatch(0)
                                ;                   Debug "найдено: " + RegularExpressionMatchString(0)
                                ;                   Debug "позиция: " + Str(RegularExpressionMatchPosition(0))
                                ;                   Debug "длина: " + Str(RegularExpressionMatchLength(0))
                                Pos = RegularExpressionMatchPosition(0) - 1
                                SetColor(hEdit,Pos,Pos + RegularExpressionMatchLength(0), color)
                        Wend
                EndIf
        Else
                Debug RegularExpressionError()
        EndIf
EndProcedure



Помнится в RichEdit с использованием AutoIt3 для улучшения скоростных характеристик читал контент в сыром режиме, расставлял метки/теги для которых в заголовочной части определил таблицу цветов и загружал в RichEdit. Потому что метод выделения излишнее телодвижение для большого объёма раскраски.

Посмотрел как получить код RTF, ключевое слово #EM_STREAMIN, вроде нашёл примеры для v4, пока не получается.
Код:
1
SendMessage_(hEdit, #EM_STREAMIN, #SF_RTF, @stream) 


Кто же знал что это RTF, и получается с ним работают те же функции что и в RTF

Примерно такая шапка прописывается в заголовке (AutoIt3)
Код:
1
2
3
4
5
6
7
$g_RESH_sColorTable = _
                        '\red255\green0\blue0;' & _ ; красный
                        '\red0\green0\blue255;' & _ ; синий
                        '\red99\green99\blue99;' ; серый
        $sCode = "{\rtf\ansi\ansicpg1251\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset204 Arial;}}" & _ ; шрифт Ариал
                        "{\colortbl;" & $g_RESH_sColorTable & "}{\*\generator Riched20 10.0.16299}\viewkind4\uc1\pard\f0\fs" & $Font & _ ; размер шрифта 18
                        StringStripWS($sCode, 2) & '}'



/cf1 открывающий тег (как и /cf2 /cf3 и т.д.), /cf0 - закрывающий тег и т.д. Но перед этим надо экранировать символы \{} и заменить TAB на \tab, CR на "\par"+#CRLF$ и заменить нечитаемые символы [\000-\007\010\016\017\020-\027\030-\037\177] вопросами Chr($25A1)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB