Что нового

Возможно сделать нумерацию строк?

GUIMish

Знающий
Сообщения
122
Репутация
12
Здравствуйте, я вот тут сидел, печатал программку, и вдруг, у меня появился очень интересный вопрос, ответ на который я надеялся найти на сайте, немного полазив я так и не нашел ответ, так вот в чем мой вопрос, "возможно ли в Autoit создать нумерацию строк, вот примерно как у редактора SciTE":


Каким способом можно создать такой результат?
Что-бы там была нумерация строк, подсветка синтаксиса, т.п.
 

Ksaan

Знающий
Сообщения
207
Репутация
15
OffTopic:
Странный однако вопрос
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,483
GUIMish [?]
возможно ли в Autoit создать нумерацию строк, вот примерно как у редактора SciTE
Где нумерация, и главное - чего?
 

gloss

Ленивое кодило
Сообщения
155
Репутация
5
GUIMish
OffTopic:
В каком месте вы ее собрались создавать? :laugh:
 
Автор
G

GUIMish

Знающий
Сообщения
122
Репутация
12
CreatoR
Я имел в виду, как его сделать?
Это делается в Edit, или как-то другим способом?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,483
Какая цель?
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
GUIMish
Можно создать List. Заполнять/обновлять по сообщениям в Edit.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
GUIMish,
ИМХО, если Вы хотите получить ответ, то Вам надо вопрос конкретнее (ли подробнее?) сформулировать.


Добавлено:
Сообщение автоматически объединено:

GUIMish,
Подсветка реализована CreatoR`ом в Au3ToPost - Инструмент для расскраски AutoIt-кода (Выполнить --> Предпросмотр, предварительно в Настройках задать режим Html теги). Добавить туда нумерацию строк, ИМХО, не трудно.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Код:
#Include <GuiEdit.au3>
#Include <GuiListBox.au3>
#Include <WindowsConstants.au3>
#Include <GuiConstantsEx.au3>
#Include <WinAPI.au3>

Global $hWnd, $hList, $hEdit, _
	$_aEdit_Info[3] = [ 0, 0, 0 ], _ ;Line, Lines, DefProc
	$_cbEditProc = DllCallbackRegister( '_EditProc', 'lresult', 'hwnd;uint;wparam;lparam' )
; ---
$hWnd = GUICreate( '', 450, 500 )
$hList = _GUICtrlListBox_Create( $hWnd, '', 5, 5, 80, 490, $LBS_NOINTEGRALHEIGHT )
	_WinAPI_EnableWindow( $hList, 0 )

$hEdit = _GUICtrlEdit_Create( $hWnd, '', 85, 5, 360, 490, BitOr($ES_MULTILINE, $ES_WANTRETURN, $WS_VSCROLL, $ES_AUTOVSCROLL) )
	$_aEdit_Info[2] = _WinAPI_SetWindowLong( $hEdit, $GWL_WNDPROC, DllCallbackGetPtr( $_cbEditProc ) )

GUISetState()

Do
Until GUIGetMsg() = -3

_WinAPI_SetWindowLong( $hEdit, $GWL_WNDPROC, $_aEdit_Info[2] )
_WinAPI_DestroyWindow( $hEdit )
_WinAPI_DestroyWindow( $hList )
DllCallbackFree( $_cbEditProc )
; ===================================

Func _EditProc($hWnd, $iMsg, $wParam, $lParam)
	Local $iRet = _WinAPI_CallWindowProc( $_aEdit_Info[2], $hWnd, $iMsg, $wParam, $lParam )
	; ---
	Switch $iMsg
		Case $WM_VSCROLL, $WM_CHAR, $WM_MOUSEWHEEL
			__UpdateList()
	EndSwitch
	Return $iRet
EndFunc

Func __UpdateList()
	Local $iLine, $iLines, $fLess, $Idx
	; ---
	_GUICtrlListBox_BeginUpdate( $hList )
	$iLine = _GUICtrlEdit_GetFirstVisibleLine( $hEdit )
	$iLines = _GUICtrlEdit_GetLineCount( $hEdit )

	If $iLines <> $_aEdit_Info[1] Then
		$fLess = ( $_aEdit_Info[1] > $iLines )
		For $Idx = $_aEdit_Info[1] To $iLines - 1 Step $fLess ? -1 : 1
			If $fLess Then
				_GUICtrlListBox_DeleteString( $hList, $Idx + 1 )
			Else
				_GUICtrlListBox_AddString( $hList, __ToRight( $Idx + 1 ) )
			EndIf
		Next
	EndIf
	_GUICtrlListBox_EndUpdate( $hList )
	If $iLine <> $_aEdit_Info[0] Then _
		_GUICtrlListBox_SetTopIndex( $hList, $iLine )
	; -
	$_aEdit_Info[0] = $iLine
	$_aEdit_Info[1] = $iLines
EndFunc

Func __ToRight( $sText, $iAlign = 12, $sCenter = '  ' )
	Local $sRet, $aRes
	; ---
	$sRet = StringFormat( '%0' & $iAlign & 's', $sText )
	$aRes = StringRegExp( $sRet, '^(0+)', 1 )
	If Not @Error Then _
		$sRet = StringRegExpReplace( $sRet, '^' & $aRes[0], StringReplace( $aRes[0], '0', $sCenter ) )

	Return $sRet
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,483
Хороший пример, только есть одна бага - если изначально нажать на Enter и держать пока не появится прокрутка, то добавляется лишний номер строки, который виден частично.
Точнее дублируется номер, где то на 38.

И ещё, если после появления прокрутки выделять текст и вести курсор пока не начнётся прокрутка, то цифры не обновляются.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
CreatoR [?]
Хороший пример, только есть одна бага - если изначально нажать на Enter и держать пока не появится прокрутка, то добавляется лишний номер строки, который виден частично.
Это из-за высоты Edit / List. Если подбить высоту ( убрать LBS_NOINTEGRALHEIGHT ) - то будет все нормально.

И ещё, если после появления прокрутки выделять текст и вести курсор пока не начнётся прокрутка, то цифры не обновляются.
Можно добавить $WM_MOUSEMOVE, ибо без понятия как отловить подобное действие.
 

AZJIO

Меценат
Меценат
Сообщения
2,891
Репутация
1,195
GUIMish
Изучить элемент Scintilla, создать елемент Scintilla в своём GUI и выучив команды Scintilla работать с этим элементом. На официальном сайте есть примеры использования, ссылка1, ссылка2
 
Верх