Edit Control mit eigenem Kontextmenü

  • Hallo zusammen

    frage gibt es die Möglichkeit ein Kontextmenü zu erstellen für ein Edit-control?
    Laut guictrlcreatecontextmenu geht das bei edit und Input nicht, aber vielleicht gibt es ja eine andere Möglichkeit.

    Und wo wir gerade bei edit Controls sind, wo ist der unterschied zwischen einem GUICtrlCreateEdit, _GUICtrlEdit_Create und _GUICtrlRichEdit_Create?

    ich weiß die frage ist vielleicht dumm aber egal.

    Gruß
    Andre

  • Servus, erst einmal machen GUICtrlCreateEdit() sowie _GuiCtrlEdit_Create() prinzipiell das gleiche. Bei beidem wird ein Edit Control erstellt. Du bekommst bei der zweiten Funktion aber direkt ein Handle statt einer ID zurückgegeben. Im Grunde ist es wurscht welche Funktion du nimmst, alle _GuiCtrlEdit_... Funktionen kannst du auch auf die Edit Controls anwenden, die mit GUICtrlCreateEdit() erstellt wurden. Anders sieht es aber bei einer RichEdit Control aus. Dieses Control lässt Formatierungen zu und du kannst dort sogar Bilder abspeichern. Dein PC müsste irgendwo WordPad haben, wenn du das öffnest hast du quasi ein RichEdit Control vor Augen. Du kannst Texte formatieren und Bilder einfügen, das Format bleibt RTF.

    Nun zu deiner eigentlichen Fragestellung: Es ist möglich, nur aufwendiger. Du musst die einzelnen Events per Hand abfragen. Ich habe dir mal ein Beispiel dazu verfasst:

    Spoiler anzeigen
    [autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    #include <GUIConstantsEx.au3>
    #include <GuiEdit.au3>
    #include <GuiMenu.au3>
    #include <WinAPI.au3>
    #include <WinAPIConstants.au3>
    #include <WindowsConstants.au3>

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Global Enum $OPEN = 1000, $SAVE, $INFO

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

    Global $hEDIT_WndProc = DllCallbackRegister('EDIT_WndProc', 'lresult', 'hwnd;uint;wparam;lparam')
    Global $pEDIT_WndProc = DllCallbackGetPtr($hEDIT_WndProc)

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

    Global $hGUI = GUICreate('', 170, 170)
    Global $hEdit = _GUICtrlEdit_Create($hGUI, '', 10, 10)
    Global $pEDIT_PrevWndProc = _WinAPI_SetWindowLong($hEdit, $GWL_WNDPROC, $pEDIT_WndProc)
    GUISetState()

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    While GUIGetMsg() <> $GUI_EVENT_CLOSE
    WEnd

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

    DllCallbackFree($hEDIT_WndProc)

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func EDIT_WndProc($hWnd, $iMsg, $wParam, $lParam)
    Switch $iMsg
    Case $WM_CONTEXTMENU
    Return EDIT_WM_CONTEXTMENU($hWnd, $iMsg, $wParam, $lParam)
    Case $WM_COMMAND
    EDIT_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    EndSwitch

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

    Return _WinAPI_CallWindowProc($pEDIT_PrevWndProc, $hWnd, $iMsg, $wParam, $lParam)
    EndFunc

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

    Func EDIT_WM_CONTEXTMENU($hWnd, $iMsg, $wParam, $lParam)
    Local $hMenu = _GUICtrlMenu_CreatePopup()
    _GUICtrlMenu_InsertMenuItem($hMenu, 0, 'Open', $OPEN)
    _GUICtrlMenu_InsertMenuItem($hMenu, 1, 'Save', $SAVE)
    _GUICtrlMenu_InsertMenuItem($hMenu, 3, '', 0)
    _GUICtrlMenu_InsertMenuItem($hMenu, 3, 'Info', $INFO)
    _GUICtrlMenu_TrackPopupMenu($hMenu, $wParam)
    _GUICtrlMenu_DestroyMenu($hMenu)

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

    Return $GUI_RUNDEFMSG
    EndFunc

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

    Func EDIT_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    Switch $wParam
    Case $OPEN
    _WinAPI_ShowMsg('Open')
    Case $SAVE
    _WinAPI_ShowMsg('Save')
    Case $INFO
    _WinAPI_ShowMsg('Info')
    EndSwitch

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

    Return $GUI_RUNDEFMSG
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit]

    2 Mal editiert, zuletzt von Yjuq (22. März 2015 um 14:06)

  • so habe es mal ausprobiert und geht geht nicht mit GuiCtrlCreateEdit, nur mit _GUICtrlEdit_Create
    nur habe ich bei _GUICtrlEdit_Create das sicht dort wenn ich das fenster kleiner mache sich die größe nicht mit ändert

    hier mal ein teil meines script

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <EditConstants.au3>
    #include <StaticConstants.au3>
    #include <ComboConstants.au3>
    #include <File.au3>
    #include <WinAPI.au3>
    #include <GuiEdit.au3>
    #include <ColorConstantS.au3>
    #include <GuiMenu.au3>
    #include <WinAPIConstants.au3>

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

    Global Enum $OPEN = 1000, $SAVE, $INFO

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

    Global $hEDIT_WndProc = DllCallbackRegister('EDIT_WndProc', 'lresult', 'hwnd;uint;wparam;lparam')
    Global $pEDIT_WndProc = DllCallbackGetPtr($hEDIT_WndProc)

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

    ;###################################
    ;Bottons okay
    ;###################################
    #Region
    $SchriftGr = IniRead(@ScriptDir&"\Data\config.ini","SETTING","schriftgroesse", "10")
    $ButtonH = IniRead(@ScriptDir&"\Data\config.ini","BUTTON","buttonhohe", "50")
    $ButtonB = IniRead(@ScriptDir&"\Data\Config.ini","BUTTON","buttonbreite", "150")
    #EndRegion

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

    ;###################################
    ;TASKLEISTE okay
    ;###################################
    #Region
    $taskbarkorekt = IniRead(@ScriptDir&"\Data\config.ini","TASKBAR","taskbatkorektur","43")
    $TaskbarHohe = _Taskbar("Hoch")
    $TaskbarBreite = _Taskbar("Breit")
    Func _Taskbar($Art)
    Local $value = Opt("WinTitleMatchMode", 4)
    Local $Pos = WinGetPos("classname=Shell_TrayWnd")
    Opt("WinTitleMatchMode", $value)
    If $Art = "Hoch" Then
    Return $Pos[3]
    ElseIf $Art = "Breit" Then
    Return $Pos[2]
    EndIf
    EndFunc
    #EndRegion

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

    ;###################################
    ;Editor Fenster Größen okay
    ;###################################
    #Region
    $editfensterhohe = @DesktopHeight - $TaskbarHohe - $taskbarkorekt - 25
    $editfensterbreite = @DesktopWidth - $ButtonB - 7
    #EndRegion

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

    ;###################################
    ;FESNTER AUFBAU okay
    ;###################################
    #Region ### START Koda GUI section ### Form=
    $cnc_editor = GUICreate( "Editor" ,640,480,0,0 , BitOR($WS_MAXIMIZE,$WS_MAXIMIZEBOX,$WS_MINIMIZEBOX,$WS_SYSMENU,$WS_SIZEBOX,$ES_UPPERCASE,$WS_TABSTOP))
    GUISetBkColor(0xE0E0E0)

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

    ;#########################################################
    ;EDITOR FENSTER
    ;#########################################################
    $editor = _GUICtrlEdit_Create($cnc_editor,"",0,0,$editfensterbreite,$editfensterhohe,$ES_AUTOHSCROLL + $ES_AUTOVSCROLL + $ES_UPPERCASE + $ES_WANTRETURN + $ES_MULTILINE + $WS_HSCROLL + $WS_VSCROLL)
    GUICtrlSetFont(-1, $SchriftGr)
    GUICtrlSetResizing($editor,$GUI_DOCKAUTO)
    ;~ $editor = GUICtrlCreateEdit("",0,0,$editfensterbreite,$editfensterhohe,$ES_AUTOHSCROLL + $ES_AUTOVSCROLL + $ES_UPPERCASE + $ES_WANTRETURN + $ES_MULTILINE + $WS_HSCROLL + $WS_VSCROLL)
    Global $pEDIT_PrevWndProc = _WinAPI_SetWindowLong($editor, $GWL_WNDPROC, $pEDIT_WndProc)

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

    $statusbar = GUICtrlCreateLabel("Fertig",0,$editfensterhohe,150,25,$SS_CENTERIMAGE)
    GUICtrlSetFont(-1, 10)
    GUICtrlSetResizing($statusbar,$GUI_DOCKAUTO + $GUI_DOCKBOTTOM )
    $menu_1= GUICtrlCreateMenu ("Datei")
    $menu_item1= GUICtrlCreateMenuItem ("Neu STRG + N", $menu_1,0)
    $menu_item2= GUICtrlCreateMenuItem ("Öffnen STRG + O", $menu_1,1)
    GUICtrlCreateMenuitem("", $menu_1, 2)
    $menu_item3= GUICtrlCreateMenuItem ("Speichern STRG + S", $menu_1,3)
    $menu_item4= GUICtrlCreateMenuItem ("Speichern unter... STRG + S", $menu_1,4)
    GUICtrlCreateMenuitem("", $menu_1, 5)
    $menu_item5= GUICtrlCreateMenuItem ("Beenden ALT + F4", $menu_1,6)
    $menu_2= GUICtrlCreateMenu ("Bearbeiten")
    $menu_item15= GUICtrlCreateMenuItem ("Rückgängig STRG + Z", $menu_2,1)
    GUICtrlCreateMenuitem("", $menu_2, 2)
    $menu_item6= GUICtrlCreateMenuItem ("Ausschneiden STRG + X", $menu_2,3)
    $menu_item7= GUICtrlCreateMenuItem ("Kopieren STRG + C", $menu_2,4)
    $menu_item8= GUICtrlCreateMenuItem ("Einfügen STRG + V", $menu_2,5)
    $menu_item9= GUICtrlCreateMenuItem ("Löschen ENTF", $menu_2,6)
    ;#########################################################
    ;BUTTONS
    ;#########################################################
    $B_Neu_Nummerieren = GUICtrlCreateButton("Neu" & @crlf & "Nummerieren",$editfensterbreite + 5,0,$ButtonB,$ButtonH,$BS_MULTILINE)
    GUICtrlSetFont(-1, 10)
    GUICtrlSetResizing($B_Neu_Nummerieren,$GUI_DOCKAUTO + $GUI_DOCKHEIGHT + $GUI_DOCKTOP )
    $B_Rueckuebersetzen = GUICtrlCreateButton("Rückübersetzen",$editfensterbreite + 5,$ButtonH,$ButtonB,$ButtonH,$BS_MULTILINE)
    GUICtrlSetFont(-1, 10)
    GUICtrlSetResizing($B_Rueckuebersetzen,$GUI_DOCKAUTO + $GUI_DOCKHEIGHT + $GUI_DOCKTOP )
    $B_Bohren = GUICtrlCreateButton("Bohren Reiben Gewinde",$editfensterbreite + 5,$ButtonH+$ButtonH,$ButtonB,$ButtonH,$BS_MULTILINE)
    GUICtrlSetFont(-1, 10)
    GUICtrlSetResizing($B_Bohren,$GUI_DOCKAUTO + $GUI_DOCKHEIGHT + $GUI_DOCKTOP )
    $B_CYCLE800 = GUICtrlCreateButton("Schwenken" & @crlf & "Ebene",$editfensterbreite + 5,$ButtonH+$ButtonH+$ButtonH,$ButtonB,$ButtonH,$BS_MULTILINE)
    GUICtrlSetFont(-1, 10)
    GUICtrlSetResizing($B_CYCLE800,$GUI_DOCKAUTO + $GUI_DOCKHEIGHT + $GUI_DOCKTOP )
    $B_Messen = GUICtrlCreateButton("Messen",$editfensterbreite + 5,$ButtonH+$ButtonH+$ButtonH+$ButtonH,$ButtonB,$ButtonH,$BS_MULTILINE)
    GUICtrlSetFont(-1, 10)
    GUICtrlSetResizing($B_Messen,$GUI_DOCKAUTO + $GUI_DOCKHEIGHT + $GUI_DOCKTOP )
    $B_Kontur = GUICtrlCreateButton("Kontur",$editfensterbreite + 5,$ButtonH+$ButtonH+$ButtonH+$ButtonH+$ButtonH,$ButtonB,$ButtonH,$BS_MULTILINE)
    GUICtrlSetFont(-1, 10)
    GUICtrlSetResizing($B_Kontur,$GUI_DOCKAUTO + $GUI_DOCKHEIGHT + $GUI_DOCKTOP )

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

    GUISetState(@SW_SHOW,$cnc_editor)
    #EndRegion ### END Koda GUI section ###
    AdlibRegister("prufen",0)

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

    Func EDIT_WndProc($hWnd, $iMsg, $wParam, $lParam)
    Switch $iMsg
    Case $WM_CONTEXTMENU
    Return EDIT_WM_CONTEXTMENU($hWnd, $iMsg, $wParam, $lParam)
    Case $WM_COMMAND
    EDIT_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    EndSwitch

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

    Return _WinAPI_CallWindowProc($pEDIT_PrevWndProc, $hWnd, $iMsg, $wParam, $lParam)
    EndFunc

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

    Func EDIT_WM_CONTEXTMENU($hWnd, $iMsg, $wParam, $lParam)
    Local $hMenu = _GUICtrlMenu_CreatePopup()
    _GUICtrlMenu_InsertMenuItem($hMenu, 0, 'Open', $OPEN)
    _GUICtrlMenu_InsertMenuItem($hMenu, 1, 'Save', $SAVE)
    _GUICtrlMenu_InsertMenuItem($hMenu, 3, '', 0)
    _GUICtrlMenu_InsertMenuItem($hMenu, 3, 'Info', $INFO)
    _GUICtrlMenu_TrackPopupMenu($hMenu, $wParam)
    _GUICtrlMenu_DestroyMenu($hMenu)

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

    Return $GUI_RUNDEFMSG
    EndFunc

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

    Func EDIT_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    Switch $wParam
    Case $OPEN
    _WinAPI_ShowMsg('Open')
    Case $SAVE
    _WinAPI_ShowMsg('Save')
    Case $INFO
    _WinAPI_ShowMsg('Info')
    EndSwitch

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

    Return $GUI_RUNDEFMSG
    EndFunc

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

    ;#########################################################
    ;Menu Auswahl okay
    ;#########################################################
    #Region
    while 1
    $get=GUIGetMsg ()
    Select
    Case $get= -3
    $saveor= MsgBox (3, "Speichern?", "Möchten Sie die Änderungen Speichern?")
    If $saveor= 6 then
    Save ()
    exit
    EndIf
    If $saveor= 2 then

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

    EndIf
    If $saveor= 7 Then

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

    exit
    EndIf
    Case $get= $menu_item1
    Neu ()
    Case $get= $menu_item2
    Open ()
    Case $get= $menu_item3
    Save ()
    Case $get= $menu_item4
    Saveas()
    Case $get= $menu_item5
    $saveor= MsgBox (3, "Speichern?", "Möchten Sie die Änderungen Speichern?")
    Exit
    case $get= $menu_item6
    Ausschneiden()
    case $get= $menu_item7
    Kopieren()
    case $get= $menu_item8
    Einfuegen()
    case $get= $menu_item9
    Loeschen()
    case $get= $menu_item15
    Undo()
    EndSelect

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

    WEnd
    #EndRegion

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

    DllCallbackFree($hEDIT_WndProc)

    [/autoit]

    Vielleicht kann mir ja einer beim Gestallten vom Fenster helfen wie das am besten geht das es sich anpasst wenn man es kleiner macht

  • Zitat

    so habe es mal ausprobiert und geht geht nicht mit GuiCtrlCreateEdit, nur mit _GUICtrlEdit_Create

    Falsch, es funktioniert wunderbar...

    Zitat

    nur habe ich bei _GUICtrlEdit_Create das sicht dort wenn ich das fenster kleiner mache sich die größe nicht mit ändert

    Wundert mich nicht. Die GUI Funktionen kannst du natürlich nicht auf das Edit Control anwenden, welches mit _GUICtrlEdit_Create() erstellt wurde. Das hat andere Gründe auf die du keinen Einfluss nehmen kannst. Normalerweise fängt man das WM_SIZE des Fensters ab, schickt diese Message an die Prozedur für das Edit Control weiter und ändert dort dementsprechend seine Größe. Musst du aber nicht machen wenn du dir meinen Beitrag mal durchgelesen hättest. Ich gebe dir aber nochmal ein Tipp:

    Bei GUICtrlCreateEdit() bekommst du eine ID zurück, bei _GUICtrlEdit_Create() jedoch ein Handle. Nun schau dir doch einfach mal den ersten Parameter von _WinAPI_SetWindowLong() an...

    Weißt du jetzt wo dein Fehler lag und wo du die Funktion GUICtrlGetHandle() gebrauchen kannst? Ja? Super! :)

  • Ja klar um das kontextmenu zu benutzen brauche ich ein handle und keine id.
    also wenn ich jetzt mit guictrlgethandle ein handle bestimme von guictrlcreateedit sollte es funktionieren.


    Und das mit wm_size werde ich mir mal anschauen vielleicht gefällt mir das besser.

    Danke

    • Offizieller Beitrag
    Zitat

    Ja klar um das kontextmenu zu benutzen brauche ich ein handle und keine id.also wenn ich jetzt mit guictrlgethandle ein handle bestimme von guictrlcreateedit sollte es funktionieren.


    Du hast es erfasst.

    Zitat

    Und das mit wm_size werde ich mir mal anschauen vielleicht gefällt mir das besser.


    Wenn du ein Standard Edit benutzt, brauchst du das auch nicht. Dafür gibt es GUICtrlSetResizing.