Position Mausklick

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Position Mausklick

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Position Mausklick

Beitrag von Tom »

Indem Du das ins Verhältnis zu CurrentPos() des Parents setzt?
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Position Mausklick

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Position Mausklick

Beitrag 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.
Herzlich,
Tom
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Position Mausklick

Beitrag von Marcus Herz »

Da sind wir beim Thema:
xbpBrowse erkennt im handleevnt keine M_Motion Events.
Weiß jemand, wie man die abfangen kann ?
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Position Mausklick

Beitrag 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 } )
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Position Mausklick

Beitrag 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]}
gruss by OHR
Jimmy
Antworten