RichEdit - Link öffnen und in Tab einbauen

  • Hi Community,

    Conan10 und ich stehen vor 2 Problemen.

    1. Wir haben ein RichEdit in ein TabItem eingebaut, nur wenn man jetzt in den TabItems wechselt, bleibt immer nur das erste RichEdit sichtbar.

    [autoit]


    $Tab_Global = GUICtrlCreateTabItem("Global")
    $pEdit_Chat = _GUICtrlRichEdit_Create($hWindow_Chat, 14, 30, 537, 313, BitOR($ES_SUNKEN, $ES_MULTILINE, $ES_AUTOVSCROLL, $WS_VSCROLL))
    $TabSheet1 = GUICtrlCreateTabItem("Privat")
    $pEdit_ChatPrivat = _GUICtrlRichEdit_Create($hWindow_Chat, 14, 30, 537, 313, BitOR($ES_SUNKEN, $ES_MULTILINE, $ES_AUTOVSCROLL, $WS_VSCROLL))
    GUICtrlCreateTabItem("")

    [/autoit]

    2. Wie kann man einen Link, der in einem RichEdit steht, durch Anklicken in einem Browser öffnen?

    Vielen Dank.

    Einmal editiert, zuletzt von Jautois (21. November 2009 um 15:36)

    • Offizieller Beitrag

    2. genau wie im Bsp.:

    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>
    #include "GuiRichEdit.au3"
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <SendMessage.au3>
    #include <WindowsConstants.au3>
    Opt("MustDeclareVars", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $h_RichEdit
    _Main()

    [/autoit] [autoit][/autoit] [autoit]

    Func _Main()
    Local $msg, $hgui, $button
    Local $mnuOptions, $mnuBKColor, $mnuResetBKColor
    Local $bkcolor, $bkcolor_save = 16777215, $lResult

    [/autoit] [autoit][/autoit] [autoit]

    $hgui = GUICreate("Rich Edit Example", 500, 550, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $WS_SIZEBOX))
    $mnuOptions = GUICtrlCreateMenu("Options")
    $mnuBKColor = GUICtrlCreateMenuItem("Set Back Color of Control", $mnuOptions)
    $mnuResetBKColor = GUICtrlCreateMenuItem("Reset Back Color of Control", $mnuOptions)

    [/autoit] [autoit][/autoit] [autoit]

    $h_RichEdit = _GUICtrlRichEditCreate ($hgui, 10, 10, 480, 420, BitOR($ES_WANTRETURN, $WS_HSCROLL, $ES_SUNKEN, $ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
    GUICtrlSetResizing($h_RichEdit, $GUI_DOCKAUTO)
    $lResult = _SendMessage($h_RichEdit, $EM_SETEVENTMASK, 0, BitOR($ENM_REQUESTRESIZE, $ENM_LINK, $ENM_DROPFILES, $ENM_KEYEVENTS, $ENM_MOUSEEVENTS))
    _DebugPrint ("$h_RichEdit handle: " & $h_RichEdit)
    $lResult = _SendMessage($h_RichEdit, $EM_AUTOURLDETECT, True)
    _GUICtrlRichEditInsertText ($h_RichEdit, 'Testing' & @CRLF)
    $button = GUICtrlCreateButton("Exit", 100, 460, 100, 25)
    GUISetState(@SW_SHOW)
    Sleep(1000)
    _GUICtrlRichEditSetText ($h_RichEdit, "This is a test" & @CRLF)
    Sleep(1000)
    _GUICtrlRichEditAppendText ($h_RichEdit, 'http://www.autoitscript.com/forum' & @CRLF)
    Sleep(1000)
    _GUICtrlRichEditSetSel ($h_RichEdit, 0, 15)
    Sleep(1000)
    _GUICtrlRichEditInsertText ($h_RichEdit, "Welcome to AutoIt" & @CRLF)
    Sleep(1000)
    _GUICtrlRichEditAppendText ($h_RichEdit, 'mailto:yourmail@your.com' & @CRLF)
    _GUICtrlRichEditSetSel($h_RichEdit, 0, 17)
    Local $a_Result = _GUICtrlRichEditGetSel($h_RichEdit)
    ;Register WM_NOTIFY events
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY_Events")
    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE Or $msg = $button
    Exit
    Case $msg = $GUI_EVENT_RESIZED
    _SendMessage($h_RichEdit, $EM_REQUESTRESIZE)
    Case $msg = $mnuBKColor
    $bkcolor = _ChooseColor(0, 16777215)
    If Not @error Then
    $bkcolor_save = _SendMessage($h_RichEdit, $EM_SETBKGNDCOLOR, 0, $bkcolor)
    EndIf
    Case $msg = $mnuResetBKColor
    _SendMessage($h_RichEdit, $EM_SETBKGNDCOLOR, 1, $bkcolor_save)
    EndSelect
    WEnd
    EndFunc ;==>_Main

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_NOTIFY_Events($hWndGUI, $MsgID, $wParam, $lParam)
    #forceref $hWndGUI, $MsgID
    Local $identifier, $nmhdr, $hwndFrom, $idFrom, $code
    $nmhdr = DllStructCreate($NMHDR_fmt, $lParam)
    $hwndFrom = DllStructGetData($nmhdr, 1)
    $idFrom = DllStructGetData($nmhdr, 2)
    $code = DllStructGetData($nmhdr, 3)
    Switch $hwndFrom
    Case $h_RichEdit
    Switch $code
    Case $EN_LINK
    Local $EN_LINK_struct = DllStructCreate($ENLINK_fmt, $lParam)
    $hwndFrom = DllStructGetData($EN_LINK_struct, 1)
    $idFrom = DllStructGetData($EN_LINK_struct, 2)
    $code = DllStructGetData($EN_LINK_struct, 3)
    Local $en_link_msg = DllStructGetData($EN_LINK_struct, 4)
    Local $en_link_wParam = DllStructGetData($EN_LINK_struct, 5)
    Local $en_link_lParam = DllStructGetData($EN_LINK_struct, 6)
    Local $cpMin = DllStructGetData($EN_LINK_struct, 7)
    Local $cpMax = DllStructGetData($EN_LINK_struct, 8)
    If BitAND($en_link_msg, $WM_LBUTTONDOWN) = $WM_LBUTTONDOWN Then
    Local $link_clicked = _GUICtrlRichEditGetText ($hwndFrom, $cpMin, $cpMax) ; doesn't seem to work on zoomed text
    If $link_clicked <> "" Then Run(@ComSpec & ' /c START "" "' & $link_clicked & '"', @SystemDir, @SW_HIDE)
    EndIf
    Case $EN_MSGFILTER
    Local $EN_MSGFILTER_struct = DllStructCreate($msgfilter_fmt, $lParam)
    $hwndFrom = DllStructGetData($EN_MSGFILTER_struct, 1)
    $idFrom = DllStructGetData($EN_MSGFILTER_struct, 2)
    $code = DllStructGetData($EN_MSGFILTER_struct, 3)
    Local $en_msgfilter_msg = DllStructGetData($EN_MSGFILTER_struct, 4)
    Local $en_msgfilter_wParam = DllStructGetData($EN_MSGFILTER_struct, 5)
    Local $en_msgfilter_lParam = DllStructGetData($EN_MSGFILTER_struct, 6)
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY_Events

    [/autoit]

    Läßt sich noch weiter kürzen - aber $EN_LINK ist der Schlüssel.

    • Offizieller Beitrag

    Kann denn keiner zu Frage 1 antworten?


    Das Problem dabei:
    - StandardControls geben beim Erstellen eine ID zurück. Mit dieser ID kann man per GuiCtrlSetState($ID, $GUI_HIDE) das Control ausblenden.
    - Das RichEdit Control gibt ein Handle zurück. Mit dem Handle funktioniert dieses aber nicht.

    Mir fällt im Moment dazu keine Lösung ein.

  • Da braucht man keine extra Child_GUIs ;) Du kannst direkt die RichEdits bem TabWechsel verstecken bzw. anzeigen ;)

    [autoit]

    ControlShow($h_RichEdit, "", "")
    ControlHide($h_RichEdit, "", "")

    [/autoit]