purebasic.info

PureBasic forum
Текущее время: Вс окт 20, 2019 9:11 am

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




Начать новую тему Ответить на тему  [ Сообщений: 34 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Как подсветить строку в EditorGadget ?
СообщениеДобавлено: Сб июн 01, 2019 7:58 am 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Ср июл 18, 2018 12:50 am
Сообщений: 41
Откуда: Россия, Красноярск
Благодарил (а): 10 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Приветствую всех, уважаемые !!! Подскажите, пожалуйста, а то искал 4 дня, но так и не смог найти ответа вообще нигде на такую задачу: каким образом можно подсветить активную строку в EditorGadget, на которой находится указатель, наподобие как в редакторе PureBasic - эта строка чуть отличается по цвету. Я набросал небольшой код, но решить вопрос с подсветкой одной строки так и не удалось :roll: Вот код:
Код:
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
OpenWindow(0, 0, 0, 500, 400, "TestEdit",#PB_Window_SystemMenu| #PB_Window_SizeGadget | #PB_Window_MinimizeGadget| #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered)
LoadFont(0,"Arial",11)
EditorGadget(0,50,40,43,350,#PB_Text_Right|#PB_String_ReadOnly)                           ; гаджет для подсчета строк
EditorGadget(1,90,40,400,350,#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection) ; гаджет для вписывания текста будущего кода
SetGadgetColor(0,#PB_Gadget_BackColor,RGB(90,120,175))
SetGadgetColor(0,#PB_Gadget_FrontColor,RGB(255,255,0))
SetGadgetFont(0, FontID(0))
SetGadgetFont(1, FontID(0))
 
SmartWindowRefresh(0, 1)
 
Repeat
 
  If Event=#PB_Event_SizeWindow
    ResizeGadget(0,#PB_Ignore,#PB_Ignore,#PB_Ignore,WindowHeight(0)-50)         ; Изменение размера гаджета редактора под размеры окна
    ResizeGadget(1,#PB_Ignore,#PB_Ignore,WindowWidth(0)-100,WindowHeight(0)-50) ; Изменение размера гаджета редактора под размеры окна
  EndIf
 
  Event = WaitWindowEvent()
 
  Select EventGadget()
    Case 1
      Select EventType()
        Case #PB_EventType_Change
          If CountGadgetItems(1)=0
            a=CountGadgetItems(1)+1
          Else
            a=CountGadgetItems(1)
          EndIf
          AddGadgetItem(0,a,Str(a))
          If CountGadgetItems(0)<>CountGadgetItems(1)
            ClearGadgetItems(0)
            For i=1 To CountGadgetItems(1)
              AddGadgetItem(0,i,Str(i))
            Next
          EndIf
      EndSelect
  EndSelect
Until Event = #PB_Event_CloseWindow


И ещё один момент, на который тоже нигде не могу найти ответа - когда строк становится много, появляется два скроллбара. Можно ли их как-то объединить, чтоб было как в редакторе РВ ? Буду премного благодарен, если кто откликнется и поможет... !!!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб июн 01, 2019 8:51 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 895
Благодарил (а): 95 раз.
Поблагодарили: 26 раз.
Пункты репутации: 5
в примерах есть подсветка слов в редакторе, может поможет, но код сильно тормознутый, прогу делал на нём

в api есть функции для скролбара
а почему не стринг или текст гаджет, я на стрингах делал, на них удобней всего оказалось в том случае


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб июн 01, 2019 11:31 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11536
Благодарил (а): 4 раз.
Поблагодарили: 473 раз.
Раздел EditorGadget. http://www.purearea.net/pb/CodeArchiv_v393/English.html
И макросы для него. http://www.purearea.net/pb/CodeArchiv/I ... _Macro.pbi

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб июн 01, 2019 1:20 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Ср июл 18, 2018 12:50 am
Сообщений: 41
Откуда: Россия, Красноярск
Благодарил (а): 10 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
newJS писал(а):
в примерах есть подсветка слов в редакторе, может поможет, но код сильно тормознутый, прогу делал на нём

в api есть функции для скролбара
а почему не стринг или текст гаджет, я на стрингах делал, на них удобней всего оказалось в том случае

Я уже все примеры перелопатил, но именно подсветки строки нет вообще нигде, и все форумы облазил русские и нерусские, но нигде так и не нашел решения.
Что касается скролбара, тоже искал где только можно, но, видимо, мне ещё знаний не хватает, чтобы разобраться в таком огромном количестве этих апи функций, хотя, пытался прикручивать некоторые безрезультатно...
Со стринг или текстгаджетами предвижу неудобства и сложности в плане выделения, вырезания, вставки, и, возможно, ещё некоторых непредвиденных сложностей работы с отдельными крупными частями будущего редактора, поэтому не стал выбирать такой вариант. В эдиторгаджете с этим всё намного проще.
Может быть, у меня версия РВ устаревшая ? Стоит 5.24


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб июн 01, 2019 1:33 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Ср июл 18, 2018 12:50 am
Сообщений: 41
Откуда: Россия, Красноярск
Благодарил (а): 10 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Благодарю, Пётр ! Попытаюсь разобраться в том что там есть. Уже начал просматривать... если, конечно, там найдутся функции, разрешающие хотя бы проблему подсветки строки в EditorGadget. Может быть, подскажете или дадите намек что использовать для этого, а я уже буду пробовать прикручивать это в компилятор


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб июн 01, 2019 2:04 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11536
Благодарил (а): 4 раз.
Поблагодарили: 473 раз.
Чтобы подсветить строку нужно узнать на какой их них сейчас курсор.
Для этого узнаем позицию курсора и на основании этого узнаем номер строки и подсвечиваем ее. Для этого выделяем всю строку макросом и изменяем цвет. На форуме много раз обсуждалось и должен быть код.
Код:
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
Procedure EditorGadgetLocate(Gadget,x,y,length) 
  ; Set cursor position
  REG = GadgetID(Gadget)
  CharIdx = SendMessage_(REG,#EM_LINEINDEX,y-1,0)
  LLength = SendMessage_(REG,#EM_LINELENGTH,CharIdx,0)
  If LLength >= x-1
    CharIdx + x-1
  EndIf
  Range.CHARRANGE
  Range\cpMin = CharIdx
  Range\cpMax = CharIdx+length
  SendMessage_(REG,#EM_EXSETSEL,0,Range)
EndProcedure
 
Procedure EditorGadgetColor(Gadget, Color.l)
  format.CHARFORMAT
  format\cbSize = SizeOf(CHARFORMAT)
  format\dwMask = #CFM_COLOR
  format\crTextColor = Color
  SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, format)
EndProcedure
 
; #CFM_BOLD
; #CFM_ITALIC
; #CFM_UNDERLINE
; #CFM_STRIKEOUT
Procedure EditorGadgetFormat(Gadget, Flags)
  format.CHARFORMAT
  format\cbSize = SizeOf(CHARFORMAT)
  format\dwMask = #CFM_ITALIC|#CFM_BOLD|#CFM_STRIKEOUT|#CFM_UNDERLINE
  format\dwEffects = Flags
  SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, format)
EndProcedure
 
Procedure HighlightingLine(Gadget, Color, FontSize, FontName.s, FontFlags)
  CPos.CHARRANGE
  SendMessage_(GadgetID(Gadget), #EM_EXGETSEL,0,CPos)
  i = SendMessage_(GadgetID(Gadget), #EM_EXLINEFROMCHAR, 0, CPos\cpMin)
 
  SendMessage_(GadgetID(Gadget), #EM_HIDESELECTION, 1, 0)
 
  EditorGadgetLocate(Gadget,1,i+1,Len(GetGadgetItemText(Gadget, i, 0)))
  EditorGadgetColor(Gadget,Color)
 
  EditorGadgetFormat(Gadget, FontFlags)
 
 
  SendMessage_(GadgetID(Gadget), #EM_EXSETSEL,0,CPos)
  SendMessage_(GadgetID(Gadget), #EM_HIDESELECTION, 0, 0)
EndProcedure


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб июн 01, 2019 2:25 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Ср июл 18, 2018 12:50 am
Сообщений: 41
Откуда: Россия, Красноярск
Благодарил (а): 10 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Огромнейше благодарю, Пётр !!! Сейчас буду разбираться и постараюсь выложить результат по окончании !


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб июн 01, 2019 6:46 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 909
Благодарил (а): 2 раз.
Поблагодарили: 45 раз.
Пункты репутации: 9
Всё же что пётр предлагает это скорее выделение строки а не её подсветка.
Что бы сделать подсветку наверное нужно сначала получить контекст для рисования,опредилить позицию курсора на какой строке,после нарисовать подсветку и эту строку. :roll:
Если не предусмотренна автонумерация то нужен лист канваса и на нём рисовать её получая позицию скрола(полосы прокрутки)
Ps:Для чего редактор то хоть?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс июн 02, 2019 2:03 am 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Ср июл 18, 2018 12:50 am
Сообщений: 41
Откуда: Россия, Красноярск
Благодарил (а): 10 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Ну, да, там, скорее, и нужно выделение редактируемой строки как это обычно делается в редакторах кодов. А это и будет редактор кода.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс июн 02, 2019 3:48 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 909
Благодарил (а): 2 раз.
Поблагодарили: 45 раз.
Пункты репутации: 9
Трофимов Андрей2 писал(а):
Ну, да, там, скорее, и нужно выделение редактируемой строки как это обычно делается в редакторах кодов. А это и будет редактор кода.

выделение строки и подсветка это не одно и тоже. 8)
выделить непроблема
Код:
1
2
3
 
SendMessage_(hwnd,#EM_SETSEL,2,220);выделить текст начальная-конечная позиция
 



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс июн 02, 2019 4:53 am 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Ср июл 18, 2018 12:50 am
Сообщений: 41
Откуда: Россия, Красноярск
Благодарил (а): 10 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Сергейчик писал(а):
выделение строки и подсветка это не одно и тоже. 8)
выделить непроблема

Извиняюсь, может быть, я неправильно выразил свою мысль. Суть такая же как в редакторе кода РВ - нужно, чтобы бэкколор (НЕ фронтколор) редактируемой строки - то есть, именно той строки, в которой производится редактирование текста в данный момент, немного отличался от бэкколора всего эдиторгаджета. В редакторе кода РВ это хорошо наблюдается. При этом сам курсор мыши может находиться где угодно - реакция на местоположение курсора мыши не нужна.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс июн 02, 2019 6:14 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6552
Благодарил (а): 29 раз.
Поблагодарили: 221 раз.
Пункты репутации: 59
Трофимов Андрей2 писал(а):
Суть такая же как в редакторе кода РВ


Может проще воспользоваться тогда более подходящим для этого гаджетом - ScintillaGadget

Изображение
Код:
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
Procedure MakeUTF8Text(text.s)
   Static buffer.s
   buffer=Space(StringByteLength(text, #PB_UTF8))
   PokeS(@buffer, text, -1, #PB_UTF8)
   ProcedureReturn @buffer
 EndProcedure
 
  If OpenWindow(0, 0, 0, 800, 600, "ScintillaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   
    If InitScintilla()
      ScintillaGadget(0, 10, 10, 800, 600, 0)
      ; Настройка текстового редактора Scintilla
   ScintillaSendMessage(Scintilla, #SCI_STYLESETBACK, #STYLE_DEFAULT,  RGB(250, 250, 250)) ; Цвет фона
                                                                                        ; Шрифт
   ScintillaSendMessage(Scintilla, #SCI_SETCODEPAGE, #SC_CP_UTF8)
   ScintillaSendMessage(Scintilla, #SCI_STYLESETFONT,#STYLE_DEFAULT,MakeUTF8Text("Courier")) ; Имя шрифта
   ScintillaSendMessage(Scintilla, #SCI_STYLESETSIZE,#STYLE_DEFAULT,10 ) ; Размер шрифта
   ScintillaSendMessage(Scintilla, #SCI_STYLECLEARALL)  ; Устанавливаем стиль по умолчанию
   
   ;ScintillaSendMessage(Scintilla, #SCI_SETVIEWWS,1) ; Отображение точек на месте пробелов
   ;ScintillaSendMessage(Scintilla, #SCI_SETWHITESPACEFORE,1,0 ) ; Цвет этих точек
 
   ; Цвет выделения
   ScintillaSendMessage(Scintilla, #SCI_SETSELFORE,1,RGB(255, 255, 255) ) ; Шрифт
   ScintillaSendMessage(Scintilla, #SCI_SETSELBACK,1,RGB(9, 9, 185)) ; Выделенная область
   
   ; Активная строка
   ScintillaSendMessage(Scintilla, #SCI_SETCARETLINEBACK,RGB(218, 255, 231) ) ; Цвет активной строки
   ScintillaSendMessage(Scintilla, #SCI_SETCARETLINEVISIBLE,#True) ; Разрешаем отмечать активную строку
 
   ScintillaSendMessage(Scintilla, #SCI_SETMARGINWIDTHN, 1, 0) ; Запрещаем отображать 1-вое поле маркеров
   ScintillaSendMessage(Scintilla, #SCI_SETMARGINSENSITIVEN, 1, 0)
   ScintillaSendMessage(Scintilla, #SCI_SETMARGINWIDTHN, 2, 0) ; Запрещаем отображать 2-вое поле маркеров
   ScintillaSendMessage(Scintilla, #SCI_SETMARGINSENSITIVEN, 2, 0)
   
   ; Автонумирация
   ScintillaSendMessage(Scintilla, #SCI_SETMARGINTYPEN, 0, #SC_MARGIN_NUMBER) ; Добавляем 0-вое поле для автонумерации строк
   ScintillaSendMessage(Scintilla, #SCI_SETMARGINWIDTHN, 0, 40) ; Ширина поля автонумерации
   ScintillaSendMessage(Scintilla, #SCI_STYLESETFORE,#STYLE_LINENUMBER,0) ; Цвет цифр автонумерации
   ScintillaSendMessage(Scintilla, #SCI_STYLESETBACK,#STYLE_LINENUMBER,RGB(218, 218, 218)) ; Цвет фона области автонумерации
 
 
  ; Курсор
  ScintillaSendMessage(Scintilla, #SCI_SETCARETFORE,RGB(2, 4, 231) ) ; Цвет курсора
  ScintillaSendMessage(Scintilla, #SCI_SETCARETPERIOD,500) ; Частота мерцания курсора
  ScintillaSendMessage(Scintilla, #SCI_SETCARETWIDTH,1) ; Ширина курсора в пикселях. Возможные значения 0-3
     
  ; Set the initial text to the ScintillaGadget
  text$ + "Извиняюсь, может быть, я неправильно выразил свою мысль." + #CRLF$
  text$ + "Суть такая же как в редакторе кода РВ - нужно, чтобы бэкколор (НЕ фронтколор) редактируемой строки - то есть," + #CRLF$
  text$ + "именно той строки, в которой производится редактирование текста в данный момент, немного отличался от бэкколора " + #CRLF$
  text$ + "всего эдиторгаджета. В редакторе кода РВ это хорошо наблюдается. При этом сам курсор мыши может находиться где" + #CRLF$
  text$ + "угодно - реакция на местоположение курсора мыши не нужна."
  ScintillaSendMessage(0, #SCI_SETTEXT, 0, MakeUTF8Text(text$))
             
    EndIf
   
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс июн 02, 2019 6:44 am 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Ср июл 18, 2018 12:50 am
Сообщений: 41
Откуда: Россия, Красноярск
Благодарил (а): 10 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
kvitaliy писал(а):
Может проще воспользоваться тогда более подходящим для этого гаджетом - ScintillaGadget

Вау !!! Он самый :D !!! Моя дурная голова даже и не подозревала о существовании такого гаджета ! В справке в списке гаджетов его нет, вот, и искал способ его реализации иными способами. Чайник ещё совсем... Спасибо огромное, kvitaliy !!! Мне аж стыдно... :oops:


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс июн 02, 2019 11:25 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11536
Благодарил (а): 4 раз.
Поблагодарили: 473 раз.
Сергейчик писал(а):
выделение строки
Выделение строки цветом чтобы обозначить строку где сейчас курсор. То что предлагаешь не подойдет.

Трофимов Андрей2 писал(а):
это и будет редактор кода.
EditorGadget не самый подходящий для этого. Давно делал на нем редактор кодов. viewtopic.php?f=11&t=360
Сначала делал на EditorGadget, но из-за множества ограничений (не предназначен он для редактора кода), перешел на Scintilla. В итоге получилась программа. http://pure-basic.narod.ru/project/PicAsmEditor.html

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс июн 02, 2019 12:43 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Ср июл 18, 2018 12:50 am
Сообщений: 41
Откуда: Россия, Красноярск
Благодарил (а): 10 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
В итоге получилась программа. http://pure-basic.narod.ru/project/PicAsmEditor.html

Замечательная программа у Вас получилась, Пётр !!! Вот, и я, не зная про ScintillaGadget, пытался использовать EditorGadget, предчувствуя сколько с ним предстоит возни и заморочек. Благо, Ваш коллега-модератор kvitaliy, подсказал про ScintillaGadget, которого нет в справке в разделе гаджетов. Хотя, информация в той же справке по нему есть, но как-то отдельно от общего списка.
Блин, завидую Вам белой завистью - столько практики, опыта, знаний и полезной информации... !!!! По мере своих сил буду тоже стараться писать, рыть, копать, ковыряться, пробовать... И спасибо Вам огромное за помощь и подсказки !!!


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

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


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

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


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

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