Position Mausklick
Moderator: Moderatoren
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Position Mausklick
Moin,
:lbClick gibt mir aPos zurück. Was aber leider die Position des Parents ist, in dem der Mausklick stattfand. Wie bekomme ich aber die Position des Klicks auf SetAppWindow() heraus?
Jan
:lbClick gibt mir aPos zurück. Was aber leider die Position des Parents ist, in dem der Mausklick stattfand. Wie bekomme ich aber die Position des Klicks auf SetAppWindow() heraus?
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Position Mausklick
Tom,
an sowas hatte ich auch schon gedacht. Müsste ich aber rekursiv machen, denn der Parent des geklickten Parts kann ja wieder einen Parent haben, der auch einen hat, der ebenfalls einen hat.
Hatte einfach gehofft, da gäbe es auch einen schnelleren Weg.
Jan
an sowas hatte ich auch schon gedacht. Müsste ich aber rekursiv machen, denn der Parent des geklickten Parts kann ja wieder einen Parent haben, der auch einen hat, der ebenfalls einen hat.
Hatte einfach gehofft, da gäbe es auch einen schnelleren Weg.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: Position Mausklick
Positionen sind immer relativ zum Parent, anders hat das keinen Sinn, Jan. Wenn Du - aus welchen Gründen auch immer - die Position relativ zum AppDesktop() haben willst, musst Du Dich eben nach oben durchhangeln. Das ist eine kleine, rekursive Funktion.
Herzlich,
Tom
Tom
- Marcus Herz
- 1000 working lines a day
- Beiträge: 862
- Registriert: Mo, 16. Jan 2006 8:13
- Wohnort: Allgäu
- Hat sich bedankt: 40 Mal
- Danksagung erhalten: 197 Mal
- Kontaktdaten:
Re: Position Mausklick
Da sind wir beim Thema:
xbpBrowse erkennt im handleevnt keine M_Motion Events.
Weiß jemand, wie man die abfangen kann ?
xbpBrowse erkennt im handleevnt keine M_Motion Events.
Weiß jemand, wie man die abfangen kann ?
Gruß Marcus
Den Kopf in den Sand zu stecken verbessert die Welt auch nicht.
Den Kopf in den Sand zu stecken verbessert die Welt auch nicht.
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Position Mausklick
hi,
gesucht wird doch die "Windows-Position" und da spielt es keine Rolle wie tief ein Child verschachtelt ist.
man benötigt nur die Position des "Top-Window" auf den sich der Maus-klick bezieht.
dieser Code gibt mir für o:rbclick die Position für ein Pop-Up Menu
gesucht wird doch die "Windows-Position" und da spielt es keine Rolle wie tief ein Child verschachtelt ist.
man benötigt nur die Position des "Top-Window" auf den sich der Maus-klick bezieht.
dieser Code gibt mir für o:rbclick die Position für ein Pop-Up Menu
Code: Alles auswählen
o:rbClick := { | aPos, mp2, obj | oRbMenu:PopUp( obj, PopAbsPos( oMain ), 2, ;
XBPMENU_PU_DEFAULT + XBPMENU_PU_MOUSE_RBDOWN ) }
Code: Alles auswählen
FUNCTION PopAbsPos( oMainDlg )
LOCAL aPos := { 0, 0 }
LOCAL aDlg := oMainDlg:currentpos()
LOCAL aAbs := GetCursorPos()
aPos[ 1 ] := aAbs[ 1 ] - aDlg[ 1 ]
aPos[ 2 ] := aAbs[ 2 ] - aDlg[ 2 ]
RETURN aPos
Code: Alles auswählen
FUNCTION GetCursorPos()
LOCAL sPoint := REPLICATE( CHR( 0 ), 8 )
LOCAL nX := 0
LOCAL nY := 0
STATIC GetCursorPos
IF GetCursorPos = NIL
GetCursorPos := DllPrepareCall( "user32.dll", DLL_STDCALL, "GetCursorPos" )
ENDIF
DllExecuteCall( GetCursorPos, @sPoint )
nX := BIN2L( SUBSTR( sPoint, 1, 4 ) )
nY := BIN2L( SUBSTR( sPoint, 5, 4 ) )
// Xbase++ XBP_ORIGIN_BOTTOMLEFT
nY := ( - 1 * nY ) + APPDESKTOP() :CURRENTSIZE() [2] - 1
RETURN ( { nX, nY } )
gruss by OHR
Jimmy
Jimmy
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Position Mausklick
hi,
ich mach eine "Anzeige" für DragDrop und bewege die "Anzeige".
dabei fange ich mit :captureMouse( .T. ) die Maus Bewegungen ab so das die nur in dieser Schleife wirken.
wenn ich nun die Position erreicht habe hole ich mir "die" Position und muss die dann "umrechnen" auf das XbPart
das geht mit einem TrickMarcus Herz hat geschrieben: ↑Sa, 21. Mär 2020 20:40 Da sind wir beim Thema:
xbpBrowse erkennt im handleevnt keine M_Motion Events.
Weiß jemand, wie man die abfangen kann ?
Code: Alles auswählen
//
// make Bitmap from text
//
IF !EMPTY( ::cDragText )
oBMP := ::Text2BMP( ::cDragText, aRect )
ENDIF
//
// and show it on a Dialog
//
oDragArea := XBPDIALOG() :new( APPDESKTOP(), SETAPPWINDOW(), ;
{ aPos[ 1 ], aPosDrag[ 2 ] }, ;
{ aRect[ 3 ] - aRect[ 1 ], aRect[ 4 ] - aRect[ 2 ] },, .F. )
oDragArea:alwaysOnTop := .T.
oDragArea:border := XBPDLG_NO_BORDER
oDragArea:titleBar := .F.
oDragArea:drawingArea:bitmap := oBMP
//
// all mouse Event to this Dialog
//
oDragArea:create() :captureMouse( .T. )
aDragArea := ::getcursorPos()
aDragArea[ 1 ] -= nX
aDragArea[ 2 ] -= nY
oDragArea:setPos( aDragArea )
oDragArea:show()
PostappEvent( xbeM_Motion, { aPos[ 1 ] + 1, aPos[ 2 ] + 1 },, oDragArea:drawingArea )
nEvent := xbeM_Motion
DO WHILE ::lDragDrop = .T.
nEvent := APPEVENT( @mp1, @mp2, @oXbp )
DO CASE
CASE nEvent == xbeP_Keyboard .AND. mp1 == xbeK_ESC
::setpointer(, XBPSTATIC_SYSICON_ARROW, XBPWINDOW_POINTERTYPE_SYSPOINTER )
EXIT
CASE nEvent == xbeM_Motion
// show motion here
CASE nEvent == xbeM_LbUp
// Target reached
lAction := .T.
EXIT
OTHERWISE
oXbp:handleEvent( nEvent, mp1, mp2 )
ENDCASE
ENDDO
oDragArea:setPointer(, XBPSTATIC_SYSICON_ARROW, XBPWINDOW_POINTERTYPE_SYSPOINTER )
oDragArea:captureMouse( .F. )
oDragArea:destroy()
IF lAction = .T.
::EndDragDrop( ::getRelativePos() )
ENDIF
RETURN aDragArea <> nil
dabei fange ich mit :captureMouse( .T. ) die Maus Bewegungen ab so das die nur in dieser Schleife wirken.
wenn ich nun die Position erreicht habe hole ich mir "die" Position und muss die dann "umrechnen" auf das XbPart
Code: Alles auswählen
METHOD DDCal:getRelativePos()
LOCAL aPartPos := SP_OlcalSelf():currentpos() // Main
LOCAL aRelative := SP_OlcalSelf():CalRelative() // XbPart
LOCAL aCursor := ::getCursorPos()
RETURN {aCursor[1]-aPartPos[1]-aRelative[1],aCursor[2]-aPartPos[2]-aRelative[2]}
gruss by OHR
Jimmy
Jimmy