Нажав на часть изображения - PullRequest
1 голос
/ 18 августа 2011

Извините, если раньше об этом спрашивали, я пытался найти и ничего не нашел.

Я создаю приложение C # WPF.

У меня есть изображение,например, человека.

Есть ли способ определить, на какую часть тела человека щелкнула мышь?Например, если мышь щелкает по его руке, мы получаем сообщение: «Вы щелкнули по руке»?

Я хотел бы разделить случайные формы, а не только прямоугольники, поэтому щелчок мыши должен быть точным.

Большое спасибо за любую помощь

Ответы [ 3 ]

3 голосов
/ 18 августа 2011

На вашем месте я бы создал несколько полисов поверх изображения и поместил его в правильную позицию / форму, затем сделал бы их прозрачными и обрабатывал бы события щелчка для каждого поли.

2 голосов
/ 18 августа 2011

Конечно, нет проблем.

С XAML вот так:

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

Сделайте что-то вроде этого:

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);
    }
}

Я поднял небольшой код из: Расположение элемента управления WPF в окне? Очевидно, что вы хотите использовать что-то отличное от Border - вам нужно изображение.И вы хотите MouseDown вместо MouseMove.Но это логика, которая вам нужна!

Чтобы сделать это, вам нужно знать X и Y на вашем изображении (например, где «голова» или «рука»).Вы хотите вычислить многоугольник, если сечения не являются прямоугольниками.Если это так, то вам нужно пройти 90% пути.

Удачи!

1 голос
/ 18 августа 2011

Вы можете обрезать изображение на отдельные части, а затем загрузить их в окно, как если бы это было полное изображение. Это не самый эффективный способ, и он работает только для статических изображений (флэш-видео идеально подходит для анимированных «изображений»), но его можно быстро и легко реализовать. Если бы вы использовали HTML, в окне должен был бы использоваться элемент панели инструментов веб-браузера (если только вы сами не написали код).

...