# Objekte mit Maus bewegen



## wewa (9. September 2008)

Hallo!

Ich würde in meinem VB 6 Programm gerne Objekte wie Rechtecke usw. mit der Maus bewegen.
Zunächst habe ich da mal ein Programm, bei dem einfach ein Rechteck (in meinem Fall ein Label mit schwarzem Rahmen) am Mauszeiger hängt.


```
Option Explicit

Private Type POINTAPI
  X As Long
  Y As Long
End Type

Private Declare Function GetCursorPos Lib "user32" _
 (lpPoint As POINTAPI) As Long

Public Function GetMouseX() As Long
'Left
  Dim nPoint As POINTAPI
  
  GetCursorPos nPoint
  GetMouseX = nPoint.X - ScaleX(Me.Left, vbTwips, vbPixels)
End Function

Public Function GetMouseY() As Long
'Top
  Dim nPoint As POINTAPI
  
  GetCursorPos nPoint
  GetMouseY = nPoint.Y - ScaleY(Me.Top, vbTwips, vbPixels)
End Function


Private Sub Timer1_Timer()
    Text1.Text = CStr(GetMouseY())
    Text2.Text = CStr(GetMouseX())
    
    lblRechteck(0).Top = GetMouseY()
    lblRechteck(0).Left = GetMouseX()
End Sub
```
Mein Problem ist nun, dass die Grafik nicht an der Spitze des Mauszeigers hängt, sondern um einige Pixel verschoben.
Darum bräuchte ich eine Methode um die Breite der Ränder (Oben und Links) zu ermitteln, damit ich das bei der Berechnung der Position des Rechtecks berücksichtigen kann. Hat vielleicht jemand eine Möglichkeit parat?
Oder gibt es eine einfachere Möglichkeit, Objekte mit der Maus zu bewegen?


----------



## Zvoni (9. September 2008)

Mal unabhängig von deinem Problem: Dir ist bewusst, dass in dem Code-Ausschnitt oben nirgends die Sub "GetMousePos" aufgerufen wird?


----------



## wewa (9. September 2008)

Diese Funktion wird momentan auch nicht benötigt (darum aus gepostetem Code entfernt).

Aber darin liegt ja auch gar nicht das Problem.


----------



## wewa (9. September 2008)

oder gibt es vielleicht die Möglichkeit, die Mausposition innerhalb des aktuellen Fensters zu ermitteln?


----------



## Zvoni (9. September 2008)

Ich glaube eher, das Problem liegt darin, dass die Spitze des Mauszeigers eben nicht der Punkt ist, auf welchen sich die Maus-Koordinaten beziehen, sondern eben um ein paar Pixel versetzt ist. Mag mich aber auch irren.


----------



## wewa (10. September 2008)

nein die Koordinaten geben sicher die Spitze des Mauszeigers an (das merkt man schon daran, dass das Rechteck ziemlich weit verschoben ist).

Das liegt daran, dass sich die Top und Left Koordinaten eines Forms an den äßeren Rand des Forms beziehen. Und die Koordinaten von Elementen im Form beziehen sich auf den inneren Rand des Forms. Darum müsste ich irgendwie die Breite der Ränder ermitteln.


----------



## Zvoni (10. September 2008)

uff, ich erinner mich dunkel daran, dass es ne Möglichkeit per API gibt, den Client-Bereich eines Fensters zu ermitteln (Jedes Fenster hat ein Rectangle für sich, als auch ein Rectangle für den Clientbereich)

Ich glaube das war die API "ClientToScreen".


----------

