Страница: 1 |
Страница: 1 |
Вопрос: Подсветка кода, текста или тегов
Добавлено: 02.07.05 00:34
Автор вопроса: dimoon | Web-сайт:
Привет всем!
Кто нибудь знает способ сделать в программе подсветку кода для текста - выделение цветом определенных слов, тегов, ну в общем вы меня поняли :)
Я целый день бьюсь над этим сам - пришел к выводу, что на чистом VB такое сотворить нельзя. Т.е. сотворить то можно, и работает достаточно стабильно, но... медленно :( При длине текста от 10-20 кб начинает дико тормозить...
Так что приходится искать что то готовое... Решение интерисует абсолютно любое - RichTextBox, DHTML, ActiveX, source, class, etc etc... Лишь бы работало хорошо :)
Ответы
Всего ответов: 10
Номер ответа: 1
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #1
Добавлено: 02.07.05 01:13
RichTextBox служит исключительно для подсветки документа в формате RTF. Применять его для каких либо других целей бессмысленно.
Номер ответа: 2
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #2
Добавлено: 02.07.05 03:37
Ускорить можно используя API RichTextBox, подсветку делать самому по БД операторов. Насколько будет тормознуто незнаю, хотя по идеи особо быть не должно
Номер ответа: 3
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #3
Добавлено: 02.07.05 12:20
Если делать подсветку самому, то можно делать подсвечивание не каждый раз всего текста, а только изменённой части. А если текст сходу большой - то только видимую часть.
Номер ответа: 4
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #4
Добавлено: 02.07.05 13:36
самое лучшее это вообще подсвечивать отображаемый кусок текста и не более
Номер ответа: 5
Автор ответа:
dimoon
Вопросов: 32
Ответов: 19
Web-сайт:
Профиль | | #5
Добавлено: 02.07.05 14:00
Возможно я туплю, но...
как можно узнать, какой кусок текста в RTF в данный момент видим, а какой нет? Если делать расчет относительно scrollbar's, то ведь это гемор какой! еще надо учитывать размеры шрифта, размер самого контрола, и ... ужас
ну и даже если это как то можно сделать, то ведь если пользователь захочет подвигать скроллбары или понажимать pgup, то все равно придется перерисовывать весь текст...
так что имхо, выход тут один - посторонний контрол на Си. Вот только какой...целый день ищу, и пока безрезультатно... codemax не нравится.
Номер ответа: 6
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #6
Добавлено: 02.07.05 14:53
Нет, ты не тупишь, ибо подсветка - это достаточно сложно...
Статья на wasm.ru
Номер ответа: 7
Автор ответа:
⊗WaX⊗
Вопросов: 26
Ответов: 325
Web-сайт:
Профиль | | #7
Добавлено: 03.07.05 14:41
3 года назад делал курсовую - эмулятор станка с ЧПУ нужно было писать программу на ISO 7bit и рисовать что получилось в результате.
Как и наш президент большую часть времени пил пиво
Поэтому подсветку реализовал готовым activeXом по моему он назывался codesense или codemax ищи лучше через yahoo там есть (была) группа разработчиков.
Насколько он корректно себя ведет с большими текстами не знаю программки для ЧПУ сравнительно небольшие
cya
WaX
Номер ответа: 8
Автор ответа:
⊗WaX⊗
Вопросов: 26
Ответов: 325
Web-сайт:
Профиль | | #8
Добавлено: 03.07.05 14:42
offtop 2 sne
Однако ты болтун 4110 постов
Номер ответа: 9
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #9
Добавлено: 05.07.05 11:37
Так можно узнать номер первой видимой строки и сколько видно строк
Option Explicit
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type TEXTMETRIC
tmHeight As Long
tmAscent As Long
tmDescent As Long
tmInternalLeading As Long
tmExternalLeading As Long
tmAveCharWidth As Long
tmMaxCharWidth As Long
tmWeight As Long
tmOverhang As Long
tmDigitizedAspectX As Long
tmDigitizedAspectY As Long
tmFirstChar As Byte
tmLastChar As Byte
tmDefaultChar As Byte
tmBreakChar As Byte
tmItalic As Byte
tmUnderlined As Byte
tmStruckOut As Byte
tmPitchAndFamily As Byte
tmCharSet As Byte
End Type
Private Const EM_GETRECT As Long = &HB2
Private Const WM_GETFONT As Long = &H31
Private Const EM_GETFIRSTVISIBLELINE As Long = &HCE
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Private Declare Function GetDC Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function GetTextMetrics Lib "gdi32.dll" Alias "GetTextMetricsA" (ByVal hdc As Long, ByRef lpMetrics As TEXTMETRIC) As Long
Private Declare Function SelectObject Lib "gdi32.dll" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Sub Command1_Click()
 im rc As RECT
 im hdc As Long
 im lfont As Long
 im oldfont As Long
 im di As Long
 im tm As TEXTMETRIC
 im lc As Long
lc = SendMessage(Text1.hwnd, EM_GETRECT, 0, rc)
lfont = SendMessage(Text1.hwnd, WM_GETFONT, 0, 0&
hdc = GetDC(Text1.hwnd)
If lfont <> 0 Then oldfont = SelectObject(hdc, lfont)
di = GetTextMetrics(hdc, tm)
If lfont <> 0 Then lfont = SelectObject(hdc, oldfont)
MsgBox "Первая строка - " & SendMessage(Text1.hwnd, EM_GETFIRSTVISIBLELINE, 0, 0& + 1 & Chr(10) & "Всего видно - " & (rc.Bottom - rc.Top) / tm.tmHeight
End Sub
Номер ответа: 10
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #10
Добавлено: 05.07.05 12:39
Кстати, в RTB нужно каждое подсвечиваемое слово выделять отдельно. Мерцание лечится временным запретом перерисовки окна RTB. Но всё же советую поискать готовый контрол для этого дела. Да хоть сам в PictureBox'e создай.