| |
|
|
- Seite 1 - |
|
Timotheus | Hallo,
Ich habe ein Problem. Ich möchte an einer bestimmten Stelle im Programm Fenster eine EditBox erstellen. Die y-Koordinate wird durch den Mausklick ausgewählt, und die x-K. ist 0. In dieser Edit-Box kann aber schon ein Text stehen. Deshalb muss ich den Mausklick noch einmal wiederholen, sobald das Edit erzeugt wurde. Dadurch setzt sich der Cursor im Edit genau auf die richtige Stelle, wie in einem Multiedit. Wie mache ich das ?
Timo |
|
|
| |
|
|
|
| |
|
- Seite 1 - |
|
Michael Dell | Sorry, kleiner Irrtum!
Versuchs mal hiermit, es setzt den Cursor an den Anfang: KompilierenMarkierenSeparierenDef SetCurPosNull(1) sendmessage(@&(1),$00B1,0,0) Setzt den Cursor an den Anfang
declare ed01&
cls
ed01& = createedit(%HWnd,Hallolo, na wie gethts?,10,10,400,20)
WhileNot Equ(%MenuItem,-2)
WaitInput
Case GetFocus(ed01&): SetCurPosNull(ed01&)
EndWhile
End
Gruß
Michael |
|
|
| Salu Michael...
Hab zwar krumme Fieß awer dofir e' ecklich Gsicht! | 11.09.2004 ▲ |
|
|
|
|
Timotheus | Nicht ganz, wenn zum Beispiel die Maus etwas weiter weg vom linken Fensterrand gedrückt wird, dann muss der Schreibbalken an z.B. der zweiten Stelle stehen. Kurz und einfach: Wie kann ich einen Mausklick an einer bestimmten Stelle simulieren?
Timo |
|
|
| |
|
|
|
Michael Dell | Ok, dann mal so: KompilierenMarkierenSeparierenDef GSC(1) !User32.dll,GetSysColor
Def ButtonUp(1) Equ(If(Equ(%Lastmessage,514),1,If(Equ(%Lastmessage,512),SetFocus(&(1)),0)),1)
Def SetCurPosNull(1) SendKey(@&(1),36) Setzt den Cursor an erste Stelle
Def SetCurPosEnd(1) SendKey(@&(1),35) Setzt den Cursor an letzte Stelle
Proc SetCurPos Setzt den Cursor an beliebige Stelle
Parameters hndl&,anz&
Case Lt(anz&,1)
SendKey(hndl&,36)
WhileLoop 1,@&(2),1
SendKey(hndl&,39)
EndWhile
EndProc
declare bt01&,ed01&,edak%
Clear bt01&,ed01&,edak%
Proc MakeED
Parameters HWHndl&,Text$,x%,y%,b%,h%
If Equ(edak%,0) wenn Edit-Control nicht existent dann...
ed01& = create(Edit,HWHndl&,Text$,x%,y%,b%,h%) Erzweuge Edit-Control mit Text inhalt
SetFocus(ed01&) Setze Focus auf Edit-Control
SetCurPos(ed01&,8) Setzt den Cursor an Stelle 8
Sleep 1000
SetCurPos(ed01&,6) Setzt den Cursor an Stelle 6
Sleep 1000
SetCurPos(ed01&,4) Setzt den Cursor an Stelle 4
Sleep 1000
SetCurPos(ed01&,2) Setzt den Cursor an Stelle 2
Sleep 1000
SetCurPosNull(ed01&) Setzt den Cursor an erste Stelle
Sleep 1000
SetCurPosEnd(ed01&) Setzt den Cursor an letzte Stelle
Sleep 1000
SetCurPosNull(ed01&) Setzt den Cursor an erste Stelle
Sleep 1000
EndIf
Return 1
EndProc
SetTrueColor 1
WindowStyle 26
Window Add(%maxX,10),0-500,66
Cls GSC(15)
bt01& = create(Button,%HWnd,Erstelle Edit,360,10,120,22)
Window 0,0-500,66
WhileNot Or(Equ(%MenuItem,-2),Equ(%MenuItem,-4000))
GetMessage
If GetFocus(bt01&)
If ButtonUp(%HWnd)
edak% = MakeED(%HWnd,Hallolo, na wie gethts?,10,10,340,22)
Case edak%: SetFocus(ed01&)
EndIf
EndIf
EndWhile
End
Michael...
P.S.: hab ich alles in der Profan- Hilfe nachgeschlagen! |
|
|
| Salu Michael...
Hab zwar krumme Fieß awer dofir e' ecklich Gsicht! | 12.09.2004 ▲ |
|
|
|
|
Timotheus | Nein das auch nicht!
Hier mal ein Demo: KompilierenMarkierenSeparieren Hier fehlt nur die Def oder Proc SimuliereMausklick. In diesem Beispiel ist der Schreibbalken durch das wiederholte klicken an der richtigen Stelle. Das ist wie wenn man in ein vorhandenes Edit klickt, dann setzt sich der Balken ja auch automatisch an die Stelle die im Edit angeklickt wurde.
Timo |
|
|
| |
|
|
|
| So? KompilierenMarkierenSeparierencls
declare x%,a&,b&
while 1
waitinput
if %Mousekey = 1
x% = %Mousex
a& = Create(Edit,%Hwnd,Hallo,0,%Mousey - 12,600,25)
@SENDMESSAGE(a&,$00B1,0,256)
@SETFOCUS(A&)
Sleep 1000
destroyWindow(a&)
endif
wend
Oder so?? KompilierenMarkierenSeparierenDEF @mouse_event(5)!User32,mouse_event
CLS
declare x%,a&,b&
while 1
Waitinput
if %Mousekey = 1
x% = %Mousex
a& = Create(Edit,%Hwnd,Hallo,0,%Mousey - 12,600,25)
@mouse_event(2,x%,%MOUSEY,0,0)
@mouse_event(4,x%,%MOUSEY,0,0)
@mouse_event(2,x%,%MOUSEY,0,0)
@mouse_event(4,x%,%MOUSEY,0,0)
Sleep 1000
destroyWindow(a&)
endif
wend
|
|
|
| |
|
|
|
Dietmar Horn | Noch als Ergänzung (zur Antwort von Andreas)
DEF @mouse_event(5)!User32,mouse_event
mouse_event(N,dx%,dy%,0,0)
=> löst eine künstliche Mausbewegung und einen Mausklick aus. => hat keinen Rückgabewert
N: gibt an, welche Maustaste gedrückt (simuliert) werden soll
N = $1 - Doppelklick simulieren N = $2 - linke Maustaste runterdrücken N = $4 - linke Maustaste loslassen N = $8 - rechte Maustaste runterdrücken N = $10 - rechte Maustaste loslassen N = $20 - mittlere Maustaste runterdrücken (falls vorhanden) N = $40 - mittlere Maustaste loslassen (falls vorhanden)
dx% = x-Koordinate der Mausposition (oder deren Änderung, wo sie von der derzeitigen Position aus gesehen, hingesetzt werden soll) dy% = y-Koordinate der Mausposition (oder deren ...)
Der 4. und 5. Parameter haben keine Bedeutung, deswegen also jeweils auf 0 setzen.
Eventuell mußt Du noch ein bißchen mit den Mauskoordinaten experimentieren, weiß nicht, ob diese relativ oder absolut sind, ob bezogen auf den Desktop, das Hauptfenster, oder das Dialogfenster. Versuche dabei auch mal $8000 bei den Werten für N zu addieren, also N = $8000 + $2, oder N = $2 setzen. $8000 = MOUSEEVENTF_ABSOLUTE
Gruß Dietmar |
|
|
| Multimedia für Jugendliche und junge Erwachsene - MMJ Hoyerswerda e.V. [...] Windows 95 bis Windows 7 Profan² 6.6 bis XProfan X2 mit XPSE Das große XProfan-Lehrbuch: [...] | 12.09.2004 ▲ |
|
|
|
|
Timotheus | Danke
Timo |
|
|
| |
|
|
|
Uwe ''Pascal'' Niemeier | Hallo Leute!
Gibts denn die API mouse_event unter XP/NT überhaupt noch? Zitat von MSDN:
The mouse_event function synthesizes mouse motion and button clicks. Windows NT: This function has been superseded. Use SendInput instead.
SeeYou Pascal |
|
|
| |
|
|
|
Michael Dell | Microsoft wollte mouse_event schon früher ersetzen, das steht jedenfalls so in der WinHlp no Win32s. Ich denk aus Supportgründen funktioniert es im Moment noch, man sollte wohl in Zukunft darauf verzichten. In Longhorn wirds wohl nicht mehr gehen.
Michael... |
|
|
| Salu Michael...
Hab zwar krumme Fieß awer dofir e' ecklich Gsicht! | 13.09.2004 ▲ |
|
|
|
| |
|
- Seite 2 - |
|
|
Michael Dell | Hier das ganze ohne mouse_event: KompilierenMarkierenSeparierenDeclare a&,x&,y&,Fontx&,EDminX&
FontX& = 8 Font- Breite
EDminX& = 10 Edit- Control Startpunkt (X min)
Def SetCurMark(2) sendmessage(@&(1),$00B1,@&(2),0) Setzt Markierung
Proc SetCurPos Setzt den Cursor an beliebige Stelle
Parameters hndl&,anz&
SetFocus(hndl&)
SendKey(hndl&,36)
Case Lt(anz&,1): Return
WhileLoop 1,@&(2),1
SendKey(hndl&,39)
EndWhile
EndProc
Proc CalkCurPos
Parameters EDhndl&
Declare p1&,p2&
If Gt(x&,Add(EDminX&,Mul(Len(GetText$(EDhndl&)),FontX&))) Mauszeiger hinter Textende
p1& = Len(GetText$(EDhndl&))
ElseIf Gt(x&,EDminX&) Mauszeiger im Text
p1& = Int(Div(Sub(x&,EDminX&),FontX&))
Else Mauszeiger vor Text
p1& = 0
EndIf
SetCurPos(EDhndl&,p1&) Setzt den Cursor auf Mausposition
SetCurMark(EDhndl&,p1&) Setzt Markierung 0 bis Mausposition
EndProc
CLS
UseFont Arial,16,FontX&,1,0,0
SetDialogFont 1
while 1
Waitinput
if %Mousekey = 1
x& = %Mousex
y& = %Mousey
a& = Create(Edit,%Hwnd,Hallolo, na wie geht`s den so?,EDminX&,y& - 12,600,25)
CalkCurPos(a&)
Sleep 2000
destroyWindow(a&)
endif
wend
SetDialogFont 0
End
Nur um zu sehn das es auch in reinem Profan geht.
Michael... |
|
|
| Salu Michael...
Hab zwar krumme Fieß awer dofir e' ecklich Gsicht! | 14.09.2004 ▲ |
|
|
|
|
| Hallo Michael...
Vollkommen richtig!! Die Message steht schon in meinem ersten Quelltext ein bischen weiter oben als Alternative zu MOUSE_EVENT. Aber er wollte so unbedingt einen Doppelklick. Ich sags ja - ziemlich unideal und unübersichtlich, wenn man den Quelltext nicht sofort sieht... |
|
|
| |
|
|
|
| Jaja OK AH, ich habs ja verstanden.
Ich überleg mir ja schon was....
iF |
|
|
| |
|
|