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. [-X
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]}