Answer the question
In order to leave comments, you need to log in
Mouse events and prohibition of method execution more than once?
Good day to all!
I am writing my own GUI interface for a toy.
class Button
.
We have the following set of event delegates:
public event EventHandler MouseUpHandler;
public event EventHandler MouseDownHandler;
public event EventHandler MouseOutHandler;
public event EventHandler MouseInHandler;
private void OnMouseIn() {...}
private void OnMouseOut() {...}
private void OnMouseUp() {...}
private void OnMouseDown() {...}
private void OnMouseDown()
{
EventHandler tempHandler = MouseDownHandler; // получаем делегат события
if (tempHandler != null) // проверяем, не пустой ли делегат
{
tempHandler(this, EventArgs.Empty); // вызываем событие
}
_state = ButtonState.Click; // используется для определения правильных координат на спрайте текстуры кнопки во время ее рисования
}
Update()
that calculates the logic of the code:public void Update()
{
/* Формируем данные о положении мыши и о зоне пересечения (на основе позиции и размеров кнопки) */
MouseState mouseState = Mouse.GetState();
Point mousePosition = new Point(mouseState.X, mouseState.Y);
Rectangle buttonRectangle = new Rectangle
(
(int) this.Position.X, (int) this.Position.Y,
(int) this.Size.X, (int) this.Size.Y
);
if (buttonRectangle.Contains(mousePosition)) // проверяем на наличие пересечения курсора мыши и кнопки
{
if (mouseState.LeftButton == Microsoft.Xna.Framework.Input.ButtonState.Pressed) //ЛКМ - нажатие кнопки мыши
{
OnMouseDown();
}
if (_mousePrevState.LeftButton == Microsoft.Xna.Framework.Input.ButtonState.Pressed && mouseState.LeftButton == Microsoft.Xna.Framework.Input.ButtonState.Released) // ЛКМ - отпускание кнопки мыши
{
OnMouseUp();
}
} else // выход курсора за границы кнопки
{
OnMouseOut();
}
_mousePrevState = mouseState; // сохраняем предыдущее состояние (MouseUp может быть только после MouseDown)
}
Button button = new Button(...);
button.MouseInHandler += Название_метода;
Update()
OnMouseOut()
OnMouseIn()
private bool _isMouseUp;
private bool _isMouseDown;
private bool _isMouseIn;
private bool _isMouseOut;
private void OnMouseIn()
{
if (!_isMouseIn) // если событие не вызывалось
{
EventHandler tempHandler = MouseInHandler;
if (tempHandler != null)
{
tempHandler(this, EventArgs.Empty);
}
_isMouseIn = true; // определяем событие, как вызванное и не даем ему совершиться повторно
_isMouseOut = false; // после In события можно допустить выполнение Out события
}
_state = ButtonState.Hover;
}
// примерно такой же код ниже, разве что теперь Out и In поменялись местами
private void OnMouseOut()
{
if (!_isMouseOut)
{
EventHandler tempHandler = MouseOutHandler;
if (tempHandler != null)
{
tempHandler(this, EventArgs.Empty);
}
_isMouseOut = true;
_isMouseIn = false;
}
_state = ButtonState.Normal;
}
MouseDown
and MouseUp
corresponding changes. Answer the question
In order to leave comments, you need to log in
Put a break in the place where you subscribe to the event
and see how many times this happens.
This is a common situation when, in one context, an event was subscribed, but they forgot to unsubscribe, and therefore the invocation list of the event is filled with unnecessary handlers.
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question