2017-07-18 8 views
-1

Comment puis-je obtenir les coordonnées de mon curseur et le milieu d'un cercle?Comment obtenir les coordonnées du curseur et l'élément WPF Coordonnées par rapport à l'écran?

J'ai essayé presque tout.

Le Cercle Code XAML:

<Canvas Name="ChooserTime" AllowDrop="True" MouseLeave="ChooserTime_MouseLeave" MouseMove="ChooserTime_MouseMove" MouseUp="ChooserTime_MouseUp" MouseDown="ChooserTime_MouseDown" RenderTransformOrigin="0.5,0.5"> 
    <!-- Some Other Elements Here--> 
    <!-- Some Other Elements Here--> 
    <Ellipse Name="MiddleClock" Fill="#FFC35151" Width="2" Height="2"/> 
</Canvas> 

Ce ne fonctionne pas:

private void ChooserTime_MouseMove(object sender, MouseEventArgs e) 
{ 
    MessageBox.Show("move"); 
    System.Threading.Thread.Sleep(2000); // For Have Time to Moving My Mouse 

    // This will get the mouse cursor relative to the upper left corner of your ellipse. 
    // Note that nothing will happen until you are actually inside of your ellipse. 
    Point curPoint = e.GetPosition(MiddleClock); 

    // Assuming that your ellipse is actually a circle. 
    Point center = new Point(MiddleClock.Width/2, MiddleClock.Height/2); 

    // A bit of math to relate your mouse to the center... 
    Point relPoint = new Point(curPoint.X - center.X, curPoint.Y - center.Y); 
} 

J'ai essayé cela aussi:

public static Point GetMousePositionWindowsForms() 
{ 
    System.Drawing.Point point = System.Windows.Forms.Control.MousePosition; 
    return new Point(point.X, point.Y); 
} 

Et ceci:

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
internal static extern bool GetCursorPos(ref Win32Point pt); 

[StructLayout(LayoutKind.Sequential)] 
internal struct Win32Point 
{ 
    public Int32 X; 
    public Int32 Y; 
}; 

public static Point GetMousePosition() 
{ 
    Win32Point w32Mouse = new Win32Point(); 
    GetCursorPos(ref w32Mouse); 
    return new Point(w32Mouse.X, w32Mouse.Y); 
} 

Je sais si je me trompe sur les coordonnées parce que l'angle entre le milieu du cercle et le curseur est pas comment il devrait être

La fonction d'angle:

double angle = Math.Atan((mousePos.Y - MiddleClock.Y)/(mousePos.X -MiddleClock.X)); 
+1

Quelle est votre mousePos.Y et pourquoi appliquez-vous le décalage sur elle? Si mousePos est relPoint, alors vous avez déjà effectué un décalage et avez cette coordonnée par rapport au "centre" – Rekshino

+0

@Rekshino Alors, que dois-je faire? –

+0

Que voulez-vous faire? :)) – Rekshino

Répondre

1

Pour la coordination de la souris cela a fonctionné pour moi:

Ajouter au début des SomeName.xaml.cs:

using System; 
using System.Runtime.InteropServices; // Add this 

Et puis ajoutez l'intérieur

public partial class Name : Somethingelse 
{ 
    // Add here the code below 
} 

ajouter ce code à l'intérieur des crochets ({}):

/// <summary> 
/// Struct representing a point. 
/// </summary> 
[StructLayout(LayoutKind.Sequential)] 
public struct POINT 
{ 
    public int X; 
    public int Y; 

    public static implicit operator Point(POINT point) 
    { 
     return new Point(point.X, point.Y); 
    } 
} 

/// <summary> 
/// Retrieves the cursor's position, in screen coordinates. 
/// </summary> 
/// <see>See MSDN documentation for further information.</see> 
[DllImport("user32.dll")] 
public static extern bool GetCursorPos(out POINT lpPoint); 

public static Point GetCursorPosition() 
{ 
    POINT lpPoint; 
    GetCursorPos(out lpPoint); 

    return lpPoint; 
} 

Pour l'élément de cercle (ou tout autre UIElement), cela a fonctionné pour moi [Ajouter ceci à l'intérieur des crochets ({})]:

public static Point ElementPointToScreenPoint(UIElement element, Point pointOnElement) 
{ 
    return element.PointToScreen(pointOnElement); 
} 

private void OnElementMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    if (MiddleClock is UIElement) 
    { 
     Point MiddleClockCor = ElementPointToScreenPoint(MiddleClock as UIElement, new Point(0, 0)); 
    } 
} 
+1

C'est agréable de trouver la réponse exacte.Vous êtes un grand frère! Je viens de faire un peu de recherche mais tu creuses profondément dans les racines. impressionnant. – Ramankingdom

+0

@Ramankdom remercie l'homme! –

1

Afin d'obtenir la coordonnées de la souris sur la toile, vous pouvez utiliser l'événement comme mousemove

curPoint = e.GetPosition(ChooserTime); 

afin d'obtenir le centre d'utilisation du cercle

Canvas.GetTop(MiddleClock) and canvas.GetLeft(MiddleClock) 

et ajoutez la hauteur/largeur 2 et/2 pour obtenir le centre `

+0

Je veux les coordonnées de la souris n'importe où sur l'écran lié au cercle –

+1

@RazLuvaton espérons que cet article vous donnera une idée. https://stackoverflow.com/questions/17009075/c-sharp-cursor-position-all-screen Vous devez importer system.wimdows.forms dll dans ce cas – Ramankingdom