RichEdit, dessen Text man nicht makieren kann.

  • BugFix : Habe ich mir auch schon gedacht, aber ich denke mal die Breite von Scrollbars variiert je nach Style, und sobald ein Buchstabe auswählbar ist kann man auch gleich den ganzen Text markieren(durch "nach unten ziehen" des Cursors).
    Mir fällt keine Lösung ein, bei der man den Text nicht auslesen kann(z.B. mit Autoit v3 Window Info).

    • Offizieller Beitrag

    Ja ok. Aber ist das nicht etwas unprofessionell? Was ist, wenn man die MainGUI veschiebt? Dann bleibt doch das Transparente Fenster an der selben stelle

    Das kannst du mit WM_MOVE abfangen und dann dein Child mitverschieben.
    Und wieso unprofessionell? Wenn etwas ohne viel Aufwand funktioniert ist doch OK - oder?

    aber ich denke mal die Breite von Scrollbars variiert je nach Style

    Das kannst man mit _WinAPI_GetSystemMetrics ermitteln.

    Es kommt sicher auf den Verwendungszweck an. Vollständigerweise muß man hinzufügen, dass bei dieser Methode der User die Möglichkeit hat, sich per Tastatur in das Editfeld zu bewegen und dann zu manipulieren. Aber da kann man auch die Cursorposition abfangen und entsprechend reagieren.

    • Offizieller Beitrag

    Hier mal eine Bsp.-Lösung. Übrigens braucht man WM_MOVE ja gar nicht. Das Child ist durch die Definition bereits an das Parent gekettet und verarbeitet somit auch die MOVE Message des Parents.

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>

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

    $GUI = GUICreate('TEST', -1, -1, -1, -1, Default, $GUI_WS_EX_PARENTDRAG)
    $Edit = GUICtrlCreateEdit('Dieser' & @CRLF & 'Text' & @CRLF & 'darf' & @CRLF & 'nicht' _
    & @CRLF & '- gelöscht' & @CRLF & '- geändert' & @CRLF & 'oder' & @CRLF & 'sonstwie' _
    & @CRLF & 'manipuliert' & @CRLF & 'werden', 10, 10, 180, 120, BitOR($WS_VSCROLL, $WS_HSCROLL))
    $Button = GUICtrlCreateButton('Ende', 10, 140, 50, 20)
    ControlFocus($GUI, '', $Button)

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

    Global Const $SM_CAPTION = _WinAPI_GetSystemMetrics(4)
    Global Const $SM_HOR_SB = _WinAPI_GetSystemMetrics(10) -1 ; Breite der Scrollbox auf horizontalaer Scrollbar (-1 zum Überlappen)
    Global Const $SM_VER_SB = _WinAPI_GetSystemMetrics(9) -1 ; Breite der Scrollbox auf vertikaler Scrollbar
    $E_Pos = ControlGetPos($GUI, '', $Edit)
    $Child = GUICreate('', $E_Pos[2]-$SM_VER_SB, $E_Pos[3]-$SM_HOR_SB, $E_Pos[0], $E_Pos[1]+$SM_CAPTION, $WS_POPUP, $WS_EX_MDICHILD, $GUI)
    GUISetBkColor(0xff0000, $Child)
    WinSetTrans($Child, '', 40)

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

    GUISetState(@SW_SHOW, $Child)
    GUISetState(@SW_SHOW, $GUI)

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

    GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $Button, -3
    Exit
    EndSwitch
    If BitAND(WinGetState($Child), 8) Then
    GUISetState(@SW_RESTORE, $GUI)
    EndIf
    WEnd

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

    Func MY_WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    If $lParam = GUICtrlGetHandle($Edit) Then
    ControlFocus($GUI, '', $Button) ; wenn Focus auf Edit ==> Focus auf anderes Ctrl setzen
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]