Seite 1 von 1
Position Mausklick
Verfasst: Sa, 21. Mär 2020 15:29
von Jan
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
Re: Position Mausklick
Verfasst: Sa, 21. Mär 2020 15:45
von Tom
Indem Du das ins Verhältnis zu CurrentPos() des Parents setzt?
Re: Position Mausklick
Verfasst: Sa, 21. Mär 2020 16:31
von Jan
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
Re: Position Mausklick
Verfasst: Sa, 21. Mär 2020 17:24
von Tom
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.
Re: Position Mausklick
Verfasst: Sa, 21. Mär 2020 20:40
von Marcus Herz
Da sind wir beim Thema:
xbpBrowse erkennt im handleevnt keine M_Motion Events.
Weiß jemand, wie man die abfangen kann ?
Re: Position Mausklick
Verfasst: Sa, 21. Mär 2020 23:00
von AUGE_OHR
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
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 } )
Re: Position Mausklick
Verfasst: Sa, 21. Mär 2020 23:14
von AUGE_OHR
hi,
Marcus 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 ?
das geht mit einem Trick
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
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
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]}