Показать полную графическую версию : Как реализовать подсветку кода?
_GUICtrlRichEdit_StreamToVar, _GUICtrlRichEdit_StreamFromVar »
Это не отвечает на вопрос как менять Stream, т.е как обращаться к его содержимому?
Немного ошибся с описанием функции.
Но всё равно работать с файлом легче, не добавляются лишние теги.
Вот так получилось:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIRichEdit.au3>
Global $sStream_File = @TempDir & '\au3_rtf.tmp'
$hGUI = GUICreate('_GUICtrlRichEdit_SetFormat Demo', 300, 200)
$hRichEdit = _GUICtrlRichEdit_Create($hGUI, 'Some data with image tags, bold, and color.', 20, 20, 260, 160, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
_GUICtrlRichEdit_StreamToFile($hRichEdit, $sStream_File)
GUISetState(@SW_SHOW, $hGUI)
While 1
_GUICtrlRichEdit_SetFormat()
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
_GUICtrlRichEdit_Destroy($hRichEdit)
FileDelete($sStream_File)
Exit
EndSwitch
WEnd
Func _GUICtrlRichEdit_SetFormat()
If Not _GUICtrlRichEdit_IsModified($hRichEdit) Then
Return
EndIf
Local $aPos, $sRead, $sColorTbl
_GUICtrlRichEdit_StreamToFile($hRichEdit, $sStream_File)
$aPos = _GUICtrlRichEdit_GetSel($hRichEdit)
$sRead = FileRead($sStream_File)
$sColorTbl = '\red255\green0\blue0;\red0\green150\blue0;\red0\green0\blue255' ;red(cf1;green(cf2);blue(cf3)
Dim $aTags[3][3] = [['b', '\b', '\cf0'], ['img', '', '\cf2'], ['color', '', '\cf1']]
For $i = 0 To UBound($aTags) - 1
$sRead = StringRegExpReplace($sRead, '(\[' & $aTags[$i][0] & '\].*?\[/' & $aTags[$i][0] & '\])', '{\' & $aTags[$i][1] & '\' & $aTags[$i][2] & ' \1}')
Next
$sRead = '{\rtf1 {\colortbl ;' & $sColorTbl & ';}' & StringReplace(StringStripCR($sRead), @LF, @LF & '\par ') & '}'
$hFile = FileOpen($sStream_File, 2)
FileWrite($hFile, $sRead)
FileClose($hFile)
_GUICtrlRichEdit_StreamFromFile($hRichEdit, $sStream_File)
_GUICtrlRichEdit_SetSel($hRichEdit, $aPos[0], $aPos[1])
_GUICtrlRichEdit_SetModified($hRichEdit, False)
EndFunc
ещё вопросик: а как изменить фон определённых слов?
как изменить фон определённых слов? »
По идее нужно использовать \cbN как параметр рядом с cfN, но оно почему то не работает...
Creat0R, вот-вот. я сделал документ в ворде с фоном, сохранил в формате ртф, работает, даже в вордпэде правильно показывает. открываю я исходный код, а там....... короче я не разобрался. но фон ооочень нужен. без него нормальную подсветку не сделаешь.
Ура!!! Нашёл!!!
{\rtf1
{\colortbl ;\red255\green255\blue0;}
some
{\highlight1 yellow }
text
}
Ещё вопрос (не обязательно, но всё же): нужно сделать так, чтобы подсвечивались url и при нажатии на них (например, ctrl + нажатие или, например, двойной клик по ссылке) открывалась страница с этим url. _GUICtrlRichEdit_AutoDetectURL ($hRichEdit, True) только подсвечивает.
_GUICtrlRichEdit_AutoDetectURL ($hRichEdit, True) только подсвечивает. »
Нужно ещё отлавливать событие:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIRichEdit.au3>
Global $sStream_File = @TempDir & '\au3_rtf.tmp'
$hGUI = GUICreate('_GUICtrlRichEdit_SetFormat Demo', 300, 200)
$hRichEdit = _GUICtrlRichEdit_Create($hGUI, 'Some data with image tags, bold, and color.' & @LF & @LF & 'http://autoitscript.com', _
20, 20, 260, 160, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
_GUICtrlRichEdit_AutoDetectURL($hRichEdit, True)
_GUICtrlRichEdit_SetEventMask($hRichEdit, $ENM_LINK)
_GUICtrlRichEdit_StreamToFile($hRichEdit, $sStream_File)
GUISetState(@SW_SHOW, $hGUI)
While 1
_GUICtrlRichEdit_SetFormat()
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
_GUICtrlRichEdit_Destroy($hRichEdit)
FileDelete($sStream_File)
Exit
EndSwitch
WEnd
Func _GUICtrlRichEdit_SetFormat()
If Not _GUICtrlRichEdit_IsModified($hRichEdit) Then
Return
EndIf
Local $aPos, $sRead, $sColorTbl
_GUICtrlRichEdit_StreamToFile($hRichEdit, $sStream_File)
$aPos = _GUICtrlRichEdit_GetSel($hRichEdit)
$sRead = FileRead($sStream_File)
$sColorTbl = '\red255\green0\blue0;\red0\green150\blue0;\red0\green0\blue255;\red255\green255\blue0' ;red(cf1;green(cf2);blue(cf3);yellow(cf4)
Dim $aTags[3][3] = [['b', '\b', '\cf0'], ['img', '', '\cf2 \highlight4'], ['color', '', '\cf1']]
For $i = 0 To UBound($aTags) - 1
$sRead = StringRegExpReplace($sRead, '(\[' & $aTags[$i][0] & '\].*?\[/' & $aTags[$i][0] & '\])', '{' & StringReplace($aTags[$i][1] & $aTags[$i][2], '\', '\\') & ' \1}')
;$sRead = StringRegExpReplace($sRead, '\[url=(.*?)\](.*?)\[/url\]', '{\\field{\\*\\fldinst{HYPERLINK "\1"}}{\\fldrslt{\\cf3 \\ul \2}}}')
Next
$sRead = '{\rtf1 {\colortbl ;' & $sColorTbl & ';}' & StringReplace(StringStripCR($sRead), @LF, @LF & '\par ') & '}'
$hFile = FileOpen($sStream_File, 2)
FileWrite($hFile, $sRead)
FileClose($hFile)
_GUICtrlRichEdit_StreamFromFile($hRichEdit, $sStream_File)
_GUICtrlRichEdit_SetSel($hRichEdit, $aPos[0], $aPos[1])
_GUICtrlRichEdit_SetModified($hRichEdit, False)
EndFunc
Func WM_NOTIFY($hWnd, $iMsg, $iWparam, $iLparam)
#forceref $hWnd, $iMsg, $iWparam
Local $hWndFrom, $iCode, $tNMHDR, $tEnLink, $cpMin, $cpMax, $tMsgFilter
$tNMHDR = DllStructCreate($tagNMHDR, $iLparam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hRichEdit
Select
Case $iCode = $EN_LINK
$tMsgFilter = DllStructCreate($tagMSGFILTER, $iLparam)
If DllStructGetData($tMsgFilter, "msg") = $WM_LBUTTONUP Then
$tEnLink = DllStructCreate($tagENLINK, $iLparam)
$cpMin = DllStructGetData($tEnLink, "cpMin")
$cpMax = DllStructGetData($tEnLink, "cpMax")
ShellExecute(_GUICtrlRichEdit_GetTextInRange($hRichEdit, $cpMin, $cpMax))
EndIf
EndSelect
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
Creat0R, если ссылка находится в каком-либо теге, то она не подсвечивается, а ведь должна.
если ссылка находится в каком-либо теге, то она не подсвечивается »
Пример текста можно?
Some data with http://google.ru/asd.png tags, bold, and color.
http://autoitscript.com
http://google.ru/asd.png не подсвечивается
http://google.ru/asd.png не подсвечивается »
Потому что ссылка определяется по началу слова (с http://), если поставить пробел до и после ссылки, то будет подсвечивать.
Я думал что подсветку ссылки можно будет делать через тег HYPERLINK (см. комментированную строчку в цикле перебора тегов), но у меня это не получилось.
Есть два варианта.
Либо определять текст только между тегами, либо вне тегов (как и сделано выше).
Конечно можно попытаться извернуться и построить рег. выражение чтобы определял в обеих случаях, но у меня это пока не получилось.
Вот тот же пример но со вторым вариантом:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIRichEdit.au3>
Global $sStream_File = @TempDir & '\au3_rtf.tmp'
$hGUI = GUICreate('_GUICtrlRichEdit_SetFormat Demo', 300, 200)
$hRichEdit = _GUICtrlRichEdit_Create($hGUI, 'Some data with http://google.ru/asd.png tags, bold, and color.', _
20, 20, 260, 160, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
;_GUICtrlRichEdit_AutoDetectURL($hRichEdit, True)
_GUICtrlRichEdit_SetEventMask($hRichEdit, $ENM_LINK)
_GUICtrlRichEdit_StreamToFile($hRichEdit, $sStream_File)
GUISetState(@SW_SHOW, $hGUI)
While 1
_GUICtrlRichEdit_SetFormat()
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
_GUICtrlRichEdit_Destroy($hRichEdit)
FileDelete($sStream_File)
Exit
EndSwitch
WEnd
Func _GUICtrlRichEdit_SetFormat()
If Not _GUICtrlRichEdit_IsModified($hRichEdit) Then
Return
EndIf
Local $aPos, $sRead, $sColorTbl
_GUICtrlRichEdit_StreamToFile($hRichEdit, $sStream_File)
$aPos = _GUICtrlRichEdit_GetSel($hRichEdit)
$sRead = FileRead($sStream_File)
$sColorTbl = '\red255\green0\blue0;\red0\green150\blue0;\red0\green0\blue255;\red255\green255\blue0' ;red(cf1;green(cf2);blue(cf3);yellow(cf4)
Dim $aTags[3][3] = [['b', '\b', '\cf0'], ['img', '', '\cf2 \highlight4'], ['color', '', '\cf1']]
For $i = 0 To UBound($aTags) - 1
$sRead = StringRegExpReplace($sRead, '\[(.+?)\](http://.*?)\[/\1\]', '[\1]{\\field{\\*\\fldinst{HYPERLINK "\2"}}{\\fldrslt{\\cf3 \\ul \2}}}[/\1]')
;Попытка добавить определение ссылок вне тега (вызывает проблемы при добавлении символа пробела или " после или до ссылки)
;$sRead = StringRegExpReplace($sRead, '([^" ])(http://.*)([^"}]*)', '\1{\\field{\\*\\fldinst{HYPERLINK "\2"}}{\\fldrslt{\\cf3 \\ul \2}}}\3')
$sRead = StringRegExpReplace($sRead, '(\[' & $aTags[$i][0] & '\].*?\[/' & $aTags[$i][0] & '\])', '{' & StringReplace($aTags[$i][1] & $aTags[$i][2], '\', '\\') & ' \1}')
Next
$sRead = '{\rtf1 {\colortbl ;' & $sColorTbl & ';}' & StringReplace(StringStripCR($sRead), @LF, @LF & '\par ') & '}'
$hFile = FileOpen($sStream_File, 2)
FileWrite($hFile, $sRead)
FileClose($hFile)
_GUICtrlRichEdit_StreamFromFile($hRichEdit, $sStream_File)
_GUICtrlRichEdit_SetSel($hRichEdit, $aPos[0], $aPos[1])
_GUICtrlRichEdit_SetModified($hRichEdit, False)
EndFunc
Func WM_NOTIFY($hWnd, $iMsg, $iWparam, $iLparam)
#forceref $hWnd, $iMsg, $iWparam
Local $hWndFrom, $iCode, $tNMHDR, $tEnLink, $cpMin, $cpMax, $tMsgFilter
$tNMHDR = DllStructCreate($tagNMHDR, $iLparam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hRichEdit
Select
Case $iCode = $EN_LINK
$tMsgFilter = DllStructCreate($tagMSGFILTER, $iLparam)
If DllStructGetData($tMsgFilter, "msg") = $WM_LBUTTONUP Then
$tEnLink = DllStructCreate($tagENLINK, $iLparam)
$cpMin = DllStructGetData($tEnLink, "cpMin")
$cpMax = DllStructGetData($tEnLink, "cpMax")
ShellExecute(_GUICtrlRichEdit_GetTextInRange($hRichEdit, $cpMin, $cpMax))
EndIf
EndSelect
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
Creat0R, тогда хотя бы сделайте так, чтобы подсвечивались ссылки только в двух тегах: в http://link и http://link, а также some text (http://link)
$sRead = StringRegExpReplace($sRead, '(\[img\]|\[url=|\[url\])(http://.*?)(\[/img\]|\].*?\[/url\]|\[/url\])', '\1{\\field{\\*\\fldinst{HYPERLINK "\2"}}{\\fldrslt{\\cf3 \\ul \2}}}\3')
Creat0R, можно ещё вопрос (на этот раз серьёзный): у меня пропадают некоторые русские буквы в вашем коде (только что заметил, что во всех кодах они пропадают). это из-за функции _GUICtrlRichEdit_StreamToFile($hRichEdit, $sStream_File) . я поменял эту строчку на $sRead = _GUICtrlRichEdit_GetText ($hRichEdit) и закомметировал $sRead = FileRead($sStream_File), всё стало норм, правда знаки переноса строки пропадают. Как сделать так, чтобы ничего не пропадало?
пропадают некоторые русские буквы в вашем коде (только что заметил, что во всех кодах они пропадают). это из-за функции _GUICtrlRichEdit_StreamToFile($hRichEdit, $sStream_File) »
Да, нужно её поправить, в ней файл пишется в обычной кодировке:
...
__GUICtrlRichEdit_StreamToFile($hRichEdit, $sStream_File)
...
Func __GUICtrlRichEdit_StreamToFile($hWnd, $sFilespec, $fIncludeCOM = True, $iOpts = 0, $iCodePage = 0)
If Not _WinAPI_IsClassName($hWnd, $_GRE_sRTFClassName) Then Return SetError(101, 0, False)
Local $iWparam
If StringRight($sFilespec, 4) = ".rtf" Then
$iWparam = _Iif($fIncludeCOM, $SF_RTF, $SF_RTFNOOBJS)
Else
$iWparam = _Iif($fIncludeCOM, $SF_TEXTIZED, $SF_TEXT)
If BitAND($iOpts, $SFF_PLAINRTF) Then Return SetError(1041, 0, False)
EndIf
; only opts are $SFF_PLAINRTF and $SF_UNICODE
If BitAND($iOpts, BitNOT(BitOR($SFF_PLAINRTF, $SF_UNICODE))) Then Return SetError(1042, 0, False)
If BitAND($iOpts, $SF_UNICODE) Then
If Not BitAND($iWparam, $SF_TEXT) Then Return SetError(1043, 0, False)
EndIf
If _GUICtrlRichEdit_IsTextSelected($hWnd) Then $iWparam = BitOR($iWparam, $SFF_SELECTION)
$iWparam = BitOR($iWparam, $iOpts)
If $iCodePage <> 0 Then
$iWparam = BitOR($iWparam, $SF_USECODEPAGE, BitShift($iCodePage, -16))
EndIf
Local $tEditStream = DllStructCreate($tagEDITSTREAM)
DllStructSetData($tEditStream, "pfnCallback", DllCallbackGetPtr($_GRC_StreamToFileCallback))
Local $hFile = FileOpen($sFilespec, 2+128) ; overwrite
If $hFile - 1 Then Return SetError(102, 0, False)
DllStructSetData($tEditStream, "dwCookie", $hFile) ; -> Send handle to CallbackFunc
_SendMessage($hWnd, $EM_STREAMOUT, $iWparam, $tEditStream, 0, "wparam", "struct*")
FileClose($hFile)
Local $iError = DllStructGetData($tEditStream, "dwError")
If $iError <> 0 Then SetError(700, $iError, False)
Return True
EndFunc
всё стало норм, правда знаки переноса строки пропадают. Как сделать так, чтобы ничего не пропадало? »
Добавить параметр $fCrToCrLf:
$sRead = _GUICtrlRichEdit_GetText($hRichEdit, True)
Creat0R, вопрос: а какая из данных функций работает быстрее?
какая из данных функций работает быстрее? »
Вопрос не что быстрее, а что надёжнее, думаю первое (через Stream).
Pavluha, посмотри это http://www.autoit.de/index.php?page=Thread&threadID=25947
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.