Moin,
guter Fund. Ich habe mich früher mal mit RichEdits beschäftigt und hätte das auch gern gehabt, habe es aber nicht geschafft. Vielleicht lag es aber auch an Win XP.
Ich habe mit Deiner Lösung gespielt. Offensichtlich ist die GuiRichEdit.au3 schon länger nicht mehr aktualisiert worden. Bereits mit WIn 8 sind viele Optionen hinzugekommen, von denen sich in der UDF nichts findet.
Für die automatische Link-Erkennung gibt es z.B. die Option AURL_ENABLEDRIVELETTERS = 16, die auch normale Dateipfade findet. Die kann man mit _GUICtrlRichEdit_AutoDetectURL() leider nicht nutzen, weil die Funktion für den Parameter intern eine IsBool() Prüfung macht. Außerdem gibt es für die Links die Option SES_HYPERLINKTOOLTIPS = 8, die das Ziel als Tooltipps anzeigt. Das ist zwar eher eine Spielerei, man kann sie aber mit der UDF auch nicht nutzen, weil sowohl die Definition als auch eine Funktion für die Nachricht EM_SETEDITSTYLE fehlen. Auch für die Nachricht EM_SETOPTIONS gibt es keine Funktion. Damit kann man z.B. die Option ECO_SELECTIONBAR = 0x01000000 aktivieren, die an der linken Seite des RichEdit einen Auswahlbereich für Zeilen einrichtet.
Ich habe noch einen weiteren Vorschlag. Für die Einfügeposition kannst DU meiner Meinung nach direkt den Wert cp aus $tagENDROPFILES mutzen. Dann kannst Du auf die Abfrage zu Zeichen- und Mauspositionen verzichten.
Ich habe meine Ideen in das folgende Skript einfliessen lassen. Vielleicht ist da auch etwas für Dich dabei. Wenn Alles funktionieren soll, braucht es aber mindestens Win 8.
#include <GUIConstantsEx.au3>
#include "GuiRichEdit.au3"
#include <MsgBoxConstants.au3>
#include <WinAPISysWin.au3>
#include <WindowsConstants.au3>
; Fehlende Konstanten
Global Const $AURL_ENABLEURL = 1 ; füe $EM_AUTOURLDETECT
Global Const $AURL_ENABLEDRIVELETTERS = 16 ; für $EM_AUTOURLDETECT
Global Const $ECOOP_OR = 2 ; für $EM_SETOPTIONS
Global Const $ECO_SELECTIONBAR = 0x01000000 ; für $EM_SETOPTIONS
Global Const $ES_NOOLEDRAGDROP = 0x08 ; RichEdit Controlstyle
Global Const $SES_HYPERLINKTOOLTIPS = 8 ; für $EM_SETEDITSTYLE
Global Const $tagENDROPFILES = $tagNMHDR & ";handle hDrop;long cp;bool fProtected" ; für $EN_DROPFILES
Global Const $sFile = @ScriptDir & "\Test.rtf"
Global $hGui, $hRichEdit, $idBtnOpen, $idBtnSave
Example()
Func Example()
$hGui = GUICreate("RichEdit", 420, 265, -1, -1, -1, $WS_EX_TOPMOST)
$hRichEdit = _GUICtrlRichEdit_Create($hGui, "", 10, 10, 400, 180, BitOR($ES_NOOLEDRAGDROP, $ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
$idBtnOpen = GUICtrlCreateButton("Read RTF", 10, 200, 400, 25)
$idBtnSave = GUICtrlCreateButton("Save RTF", 10, 230, 400, 25)
GUISetState(@SW_SHOW)
_WinAPI_DragAcceptFiles($hRichEdit)
_GUICtrlRichEdit_SetEventMask($hRichEdit, $ENM_LINK + $ENM_DROPFILES)
; Fügt auf der linken Seite einen Randbereich für die Auswahl von Zeilen ein.
; Der Stil $ES_SELECTIONBAR (0x01000000) funktioniert hier nicht.
_SendMessage($hRichEdit, $EM_SETOPTIONS, $ECOOP_OR, $ECO_SELECTIONBAR)
; Ermöglicht die Erkennung von normalen Dateipfaden als Link.
; Mit _GUICtrlRichEdit_AutoDetectURL() geht das nicht, weil die Funktion nur boolesche Werte zulässt.
; _GUICtrlRichEdit_AutoDetectURL($hRichEdit, $AURL_ENABLEURL + $AURL_ENABLEDRIVELETTERS)
_SendMessage($hRichEdit, $EM_AUTOURLDETECT, $AURL_ENABLEURL + $AURL_ENABLEDRIVELETTERS)
; Spielerei: Zeigt ToolTips an, wenn die Maus über einem Link steht.
_SendMessage($hRichEdit, $EM_SETEDITSTYLE, $SES_HYPERLINKTOOLTIPS, $SES_HYPERLINKTOOLTIPS)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
While True
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
_GUICtrlRichEdit_Destroy($hRichEdit)
ExitLoop
Case $idBtnOpen
_GUICtrlRichEdit_StreamFromFile($hRichEdit, $sFile)
If @error Then
MsgBox($MB_TOPMOST + 16, "Error", "Couldn't read the RTF file: " & @error)
EndIf
Case $idBtnSave
_GUICtrlRichEdit_StreamToFile($hRichEdit, $sFile, True)
If @error Then
MsgBox($MB_TOPMOST + 16, "Error", "Couldn't save the RTF file: " & @error)
EndIf
EndSwitch
WEnd
EndFunc ;==>Example
GUIDelete($hGui)
Exit
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
Local $aDropped, $hWndFrom, $sDropped, $sUrl, $tENDROPFILES, $tENLINK, $tNMHDR
$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
$hWndFrom = $tNMHDR.hWndFrom
If $hWndFrom = $hRichEdit Then
Switch $tNMHDR.Code
Case $EN_LINK
$tENLINK = DllStructCreate($tagENLINK, $lParam)
If $tENLINK.msg = $WM_LBUTTONDBLCLK Then
$sUrl = _GUICtrlRichEdit_GetTextInRange($hRichEdit, $tENLINK.cpMin, $tENLINK.cpMax)
ConsoleWrite("EN_LINK -> Doppelklick: " & $sUrl & @CRLF)
EndIf
Case $EN_DROPFILES
$tENDROPFILES = DllStructCreate($tagENDROPFILES, $lParam)
$aDropped = _WinAPI_DragQueryFileEx($tENDROPFILES.hDrop, 1)
If @error Then
MsgBox($MB_TOPMOST + 16, "Error!", "_WinAPI_DragQueryFileEx: " & @error)
Else
$sDropped = @CRLF
For $I = 1 To $aDropped[0]
$sDropped &= " " & $aDropped[$I] & @CRLF & @CRLF
Next
_GUICtrlRichEdit_SetSel($hWndFrom, $tENDROPFILES.cp, $tENDROPFILES.cp)
_GUICtrlRichEdit_InsertText($hWndFrom, $sDropped)
Return 1
EndIf
EndSwitch
EndIf
Return $GUI_RUNDEFMSG
EndFunc
Alles anzeigen
Viel Spaß noch!