Что нового

[Данные, строки] Выполнение функции по нажатию гиперссылки

freed21

Новичок
Сообщения
39
Репутация
1
Здравствуйте, уважаемые форумчане. Вопрос следующий: есть структурированный текст в элементе RichEdit, надо чтобы отдельные его слова были выделены как ссылки и по нажатии на них выполнялась функция. Помогите советом, как это реализовать..
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
freed21 [?]
есть структурированный текст в элементе RichEdit, надо чтобы отдельные его слова были выделены как ссылки и по нажатии на них выполнялась функция.
Дайте пример текста. И что должна делать эта функция?
Можно, например, так сделать.
Код:
#include <GuiRichEdit.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $hRichEdit

Main()

Func Main()
	Local $hGui, $sText = 'AutoIt v3 - бесплатный скриптовый язык, созданный для автоматизации графического интерфейса пользователя Windows (GUI) и ' & _
			'создания скриптов общего назначения. Он использует сочетание имитации нажатий клавиш, движений мыши и работу с окнами/управляющими элементами, ' & _
			'чтобы автоматизировать задачи в случаях, когда использование других языков невозможно или ненадежно. AutoIt имеет малый размер и не требует ' & _
			'наличия каких-либо сторонних библиотек в системе.'
	$sText = StringRegExpReplace($sText, '(?is)([a-z]+)', 'news:$1')
	$hGui = GUICreate(StringTrimRight(@ScriptName, 4), 420, 350)
	$hRichEdit = _GUICtrlRichEdit_Create($hGui, '', 10, 10, 400, 220, _
			BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
	GUISetState()

	GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
	_GUICtrlRichEdit_SetEventMask($hRichEdit, $ENM_LINK)
	_GUICtrlRichEdit_AutoDetectURL($hRichEdit, True)
	_GUICtrlRichEdit_AppendText($hRichEdit, $sText)

	While 1
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				_GUICtrlRichEdit_Destroy($hRichEdit)
				GUIDelete()
				Exit
		EndSwitch
	WEnd
EndFunc   ;==>Main

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')
						_MyFunc(_GUICtrlRichEdit_GetTextInRange($hRichEdit, $cpMin, $cpMax))
					EndIf
			EndSelect
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func _MyFunc($s_Message)
	$s_Message = StringReplace($s_Message, 'news:', '')
	MsgBox(64, 'Info', 'Message: ' & '>' & $s_Message & '<')
EndFunc   ;==>_MyFunc

Или так можно попробовать сделать.
Код:
#include <GuiRichEdit.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $hRichEdit, $nDummy, $iColor = 0xFFFFFF

Main()

Func Main()
	Local $hGui, $sText = 'AutoIt v3 - бесплатный скриптовый язык, созданный для автоматизации графического интерфейса пользователя Windows (GUI) и ' & _
			'создания скриптов общего назначения. Он использует сочетание имитации нажатий клавиш, движений мыши и работу с окнами/управляющими элементами, ' & _
			'чтобы автоматизировать задачи в случаях, когда использование других языков невозможно или ненадежно. AutoIt имеет малый размер и не требует ' & _
			'наличия каких-либо сторонних библиотек в системе.'
	Local $iStart, $iEnd, $aPos

	$hGui = GUICreate('Test', 420, 350)
	$hRichEdit = _GUICtrlRichEdit_Create($hGui, '', 10, 10, 400, 220, _
			BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
	$nDummy = GUICtrlCreateDummy()
	GUISetState()
	GUIRegisterMsg($WM_SETCURSOR, "_WM_SETCURSOR")
	_GUICtrlRichEdit_AppendText($hRichEdit, $sText)
	For $i = 0 To StringLen($sText) - 1 Step 50
		_RichEdit_Set_Like_Link($hRichEdit, $i, $iColor)
	Next
	_GUICtrlRichEdit_Deselect($hRichEdit)
	While 1
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				_GUICtrlRichEdit_Destroy($hRichEdit)
				GUIDelete()
				Exit
			Case $nDummy
				Switch _GUICtrlRichEdit_GetCharColor($hRichEdit)
					Case $iColor
						$aPos = _GUICtrlRichEdit_GetSel($hRichEdit)
						If $aPos[0] <> $aPos[1] Then ContinueLoop;???
						$iStart = _GUICtrlRichEdit_GetCharPosOfPreviousWord($hRichEdit, $aPos[0])
						$iEnd = _GUICtrlRichEdit_GetCharPosOfNextWord($hRichEdit, $aPos[0])
						MsgBox(64, 'Info', StringStripWS(_GUICtrlRichEdit_GetTextInRange($hRichEdit, $iStart, $iEnd), 3), 0, $hGui)
				EndSwitch
		EndSwitch
	WEnd
EndFunc   ;==>Main

Func _WM_SETCURSOR($hWnd, $Msg, $wParam, $lParam)
	Switch $wParam
		Case $hRichEdit
			Switch BitShift($lParam, 16)
				Case $WM_LBUTTONDOWN
					GUICtrlSendToDummy($nDummy)
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_SETCURSOR

Func _RichEdit_Set_Like_Link($h_RichEdit, $i_Pos, $i_Color)
	Local $i_Start, $i_End

	$i_Start = _GUICtrlRichEdit_GetCharPosOfPreviousWord($h_RichEdit, $i_Pos)
	$i_End = _GUICtrlRichEdit_GetCharPosOfNextWord($h_RichEdit, $i_Pos)
	_GUICtrlRichEdit_SetSel($h_RichEdit, $i_Start, $i_End)
	_GUICtrlRichEdit_SetCharColor($h_RichEdit, $i_Color)
	_GUICtrlRichEdit_SetCharAttributes($h_RichEdit, '+li')
EndFunc   ;==>_RichEdit_Set_Like_Link
 
Верх