Это предполагаемое поведение: когда вы делаете mousedown
на элементе управления и выходите из него, элемент управления по-прежнему сохраняет «захват» мыши, то есть элемент управления не будет запускать MouseLeave-Event
. Вместо этого будет вызвано событие Mouse-Leave, когда кнопка мыши выйдет за пределы элемента управления.
Чтобы избежать этого, вы можете просто сказать своему управлению НЕ захватывать мышь вообще:
private void ControlMouseDown(System.Object sender, System.Windows.Forms.MouseEventArgs e)
{
Control control = (Control) sender;
control.Capture = false; //release capture.
}
Теперь событие MouseLeave будет запускаться даже при выходе из режима, когда нажата кнопка.
Если вам нужен Capture INSIDE the Control, вам нужно приложить больше усилий:
Запуск отслеживания положения мыши вручную при нажатии мыши
Сравните положение с Top
, Left
и Size
Атрибутами рассматриваемого элемента управления.
Решите, нужно ли останавливать элемент управления, захватывающий мышь, или нет.
public partial class Form1 : Form
{
private Point point;
private Boolean myCapture = false;
public Form1()
{
InitializeComponent();
}
private void button1_MouseDown(object sender, MouseEventArgs e)
{
myCapture = true;
}
private void button1_MouseMove(object sender, MouseEventArgs e)
{
if (myCapture)
{
point = Cursor.Position;
if (!(point.X > button1.Left && point.X < button1.Left + button1.Size.Width && point.Y > button1.Top && point.Y < button1.Top + button1.Size.Height))
{
button1.Capture = false; //this will release the capture and trigger the MouseLeave event immediately.
myCapture = false;
}
}
}
private void button1_MouseLeave(object sender, EventArgs e)
{
MessageBox.Show("Mouse leaving");
}
}
Конечно, вам нужно остановить собственное отслеживание (myCapture=false;
) на MouseUp. Забыли тот :) 1033 *