Hallo,
wie kann ich einen RichEdit erstellen, dessen Text man nur scrollen, aber nicht anklicken bzw. makieren kann?
Danke schonmal für eure Hilfe!
Hallo,
wie kann ich einen RichEdit erstellen, dessen Text man nur scrollen, aber nicht anklicken bzw. makieren kann?
Danke schonmal für eure Hilfe!
Du stellst aber viele Fragen..
Hook it, Hook it, Hook it !
Wir wollen mal nicht mit Kanonen auf Spatzen schießen. ![]()
Hierfür braucht es wahrlich keinen Hook. Leg einfach ein Child-GUI (POPUP) exakt über das Edit und laß nur die Scrollbar frei. Transparenz auf 0 und fertig. ![]()
ZitatHierfür braucht es wahrlich keinen Hook. Leg einfach ein Child-GUI (POPUP) exakt über das Edit und laß nur die Scrollbar frei. Transparenz auf 0 und fertig.
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 ![]()
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).
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.
Und spätestens ab Systemmetrics wärs mir zuviel und ich würd hooken ![]()
So ich hab das jetzt fertig. Das einzigste Problem ist jetzt: Wie kann ich verhindern, das durch ein klick auf das Transparente Fenster die MainGUI deaktiviert wird? Also nicht im Focus ist. ![]()
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.
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
$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)
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)
GUISetState(@SW_SHOW, $Child)
GUISetState(@SW_SHOW, $GUI)
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),
Then
GUISetState(@SW_RESTORE, $GUI)
EndIf
WEnd
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