Ответ 1
Это предполагаемое поведение. Когда вы выполняете mousedown
на элементе управления и оставляете элемент управления, элемент управления STILL сохраняет свой "захват" на мыши, то есть элемент управления не запускает MouseLeave-Event
. Событие Mouse-Leave будет запущено, как только Mousebutton будет выпущен за пределами элемента управления.
Чтобы этого избежать, вы можете просто сказать своему управлению НЕ записывать мышь вообще:
private void ControlMouseDown(System.Object sender, System.Windows.Forms.MouseEventArgs e)
{
Control control = (Control) sender;
control.Capture = false; //release capture.
}
Теперь событие MouseLeave будет запущено даже при перемещении при нажатии кнопки.
Если вам требуется Capture INSIDE 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. Забыл тот:)