.NET: Как проверить, находится ли мышь в элементе управления? - PullRequest
2 голосов
/ 17 ноября 2011

Я хочу знать, находится ли мышь в определенном элементе управления в .NET

private void panel1_MouseLeave(object sender, EventArgs e)
{
   if (MouseIsInControl((Control)sender)
      return; //the mouse didn't leave, don't fire a MouseLeave event

   ...
}

public Boolean MouseIsInControl(Control control)
{
    //return (control.Bounds.Contains(MousePosition));
    return control.Bounds.Contains(control.PointToClient(MousePosition))
}

Но мне нужно, чтобы кто-то возился с четырьмя различными системами координат, чтобы заставить его работать .

Похожие вопросы

Ответы [ 3 ]

4 голосов
/ 17 ноября 2011

Этот Ответ Ганса Пассанта может быть адаптирован, чтобы делать то, что вы хотите:

private bool mEntered;
private Timer timer1;

public Form1() {
  InitializeComponent();

  timer1 = new Timer();
  timer1.Interval = 200;
  timer1.Tick += timer1_Tick;
  timer1.Enabled = false;
}

private void panel1_MouseEnter(object sender, EventArgs e) {
  timer1.Enabled = true;
}

private void timer1_Tick(object sender, EventArgs e) {
  bool entered = panel1.ClientRectangle.Contains(panel1.PointToClient(Cursor.Position));
  if (entered != mEntered) {
    mEntered = entered;
    if (!entered) {
      timer1.Enabled = false;
      // OK, Do something, the mouse left the parent container
    }
  }
}
2 голосов
/ 07 ноября 2014

Никаких крючков или подклассов не требуется.

private bool MouseIsOverControl(Button btn)
{
    if (btn.ClientRectangle.Contains(btn.PointToClient(Cursor.Position)))
    {
        return true;
    }
    return false;
}

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

Вы можете легко протестировать метод следующим образом:

private void button1_Click(object sender, EventArgs e)
{

    //sleep to allow you time to move the mouse off the button

    System.Threading.Thread.Sleep(900); 

    //try moving mouse around or keeping it over the button for different results

     if (MouseIsOverControl(button1)) {
        MessageBox.Show("Mouse is over the button.");
    } else {
        MessageBox.Show("Mouse is NOT over the button.");
    }
}
0 голосов
/ 10 ноября 2017

Я также использую System.Windows.Forms.Timer для этого решения, но я больше не использую события ввода / вывода мыши. Они причинили мне слишком много горя. Вместо этого я использую событие MouseMove для компонента, который должен знать, что мышь окончена. У меня есть 2 переменные-члены, названные в этом классе.

bool Hovering = false;
System.Drawing.Point LastKnownMousePoint = new System.Drawing.Point();

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

    private void label1_MouseMove(object sender, MouseEventArgs e)
    {
        // Mouse Position relative to the form... not the control
        LastKnownMousePoint = Cursor.Position; 

        label1.BorderStyle = BorderStyle.Fixed3D;
        timer1.Stop();
        timer1.Interval = 50; // Very fast (Overkill?  :) )
        timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        System.Drawing.Point point = Cursor.Position;
        if (LastKnownMousePoint.Equals(point))
        {
            // If the mouse is somewhere on the label, I'll call that Hovering.  
            // Though not technically the MS definition, it works for me.
            Hovering = true;
        }
        else if (Hovering == false)
        {
            label1.BorderStyle = BorderStyle.None;
            timer1.Stop();
        }
        else
        {
            Hovering = false;
            // Next time the timer ticks, I'll stop the timer and
            // Toggle the border.
        }
    }

Это работает, потому что я обновляю LastKnownMousePoint только тогда, когда мышь находится над элементом управления (в данном случае метка). Поэтому, если мышь перемещается за пределы элемента управления, я не буду обновлять LastKnownMousePoint, и я буду знать, что пришло время переключать стиль границы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...