2011-08-18 10 views
1

Je suis désolé si cela a déjà été demandé, j'ai essayé de chercher et je n'ai rien trouvé.En cliquant sur une partie d'une image

Je crée une application C# WPF.

J'ai une image, par exemple d'un homme.

Existe-t-il un moyen de détecter la partie du corps de l'homme sur laquelle la souris a cliqué? par exemple, si la souris clique sur sa main, nous recevons une boîte de message: "Vous avez cliqué sur la main"?

Je voudrais diviser en formes aléatoires pas seulement des rectangles, de sorte que le clic de la souris doivent être précis.

Merci beaucoup pour toute aide

+0

est l'image statique ou va-t-elle changer souvent? – Ali

Répondre

3

Si je vous, je crée plusieurs polys sur le dessus de l'image et l'obtenir à la position/forme correcte, puis les rendre transparents et poignée cliquez pour événements chaque poly.

+0

Pouvez-vous me donner une idée sur la façon de faire cela? Je ne cherche pas le code complet juste un exemple simple serait génial. Je vous remercie – Youssef

1

Vous pouvez recadrer l'image en morceaux séparés, puis les charger dans la fenêtre comme si elle était une image complète. Ce n'est pas le moyen le plus efficace, et cela ne fonctionne que pour les images statiques (une vidéo flash serait parfaite pour les "images" animées), mais elle peut être implémentée rapidement et facilement. Si vous deviez utiliser HTML, la fenêtre devrait utiliser l'élément de la boîte à outils du navigateur Web (sauf si vous codez le vôtre en quelque sorte).

2

Bien sûr, pas de problème.

Avec XAML comme ceci:

<Border BorderBrush="Gray" 
     BorderThickness="1" 
     Height="200" Width="200" 
     MouseMove="Border_MouseMove"> 
    <TextBlock Name="Jerry" /> 
</Border> 

quelque chose comme ça:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Border_MouseMove(object sender, MouseEventArgs e) 
    { 
     var _Control = (sender as System.Windows.Controls.Border); 
     var _ControlLocation = _Control.PointToScreen(new Point(0, 0)); 
     var _MousePosition = MouseInfo.GetMousePosition(); 
     var _RelativeLocation = _MousePosition - _ControlLocation; 
     this.Jerry.Text = _RelativeLocation.ToString(); 
    } 
} 

internal class MouseInfo 
{ 
    [System.Runtime.InteropServices.DllImport("user32.dll")] 
    [return: System.Runtime.InteropServices.MarshalAs(
     System.Runtime.InteropServices.UnmanagedType.Bool)] 
    internal static extern bool GetCursorPos(ref Win32Point pt); 

    [System.Runtime.InteropServices.StructLayout(
     System.Runtime.InteropServices.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 levai un peu de code à partir de: Location of WPF control in window? Il est clair que vous voulez utiliser quelque chose de différent d'une frontière - vous voulez un Image. Et vous voulez MouseDown au lieu de MouseMove. Mais c'est la logique dont vous avez besoin!

Pour faire ce travail, il va être à vous de connaître le X et Y sur votre image personnalisée (comme, où la « tête » ou « bras » est). Vous voudrez calculer un polygone si les sections ne sont pas des rectangles. Si c'est le cas, cela devrait vous rapporter 90% du chemin.

Bonne chance!

Questions connexes