Перейти к содержимому

Фото
- - - - -

[C#] Выход указателя мыши за предел формы


  • Закрытая тема Тема закрыта
7 ответов в этой теме

#1 Din-nk

Din-nk
  • Новобранец
  • 7 сообщений

Отправлено 23 Декабрь 2008 - 20:01

Пытаюсь добавить функцию к форме, чтобы когда на нее наводишь мышку, она увеличивала свою видимость (свойство Opacity) а соответственно, когда мышку убираешь с формы - уменьшала до некоторого порогового значения (скажем 0.25).

Суть проблемы:
Для определения момента, когда мышка заходит на форму и когда она с нее уходит, использовал события MouseEnter, MouseLeave, но обнаружил, что событие MouseLeave генерируется, даже когда мышка, находясь над формой, наводится на какой нибудь элемент формы (кнопка, текст бокс...) и, когда мышка возвращается с объекта на "чистую" формы - происходит событие MouseEnter...

Как поймать момент пересечения мышкой границ формы (внешних границ)? Есть ли какое-то особое событие, или что-то еще?
  • 0

#2 PyPL

PyPL
  • Пользователь
  • 54 сообщений

Отправлено 23 Декабрь 2008 - 20:10

Можно сделать так : запоминаешь границы твоей формы (это максимальные значения координат X,Y). Потом с помощью события MouseMove определяешь текущую позицию курсора мыши, и изменаешь opacity когда координаты курсора в поле видимости формы и вне поля видимости.

Т.е если вот так по ступенькам :

1) Берёшь и запоминаешь максимальный X,Y нужной формы.
2) Цепляешь событие MouseMove.
3) Далее проверка :
Если мышь.Х > форма.граница.Х || мышь.Y > форма.граница.Y
opacity = 0.25
Иначе
opacity = 100

Вот так должно работать. Свойства у формы я думаю найдёшь сам. :)

Сообщение изменено: PyPL (23 Декабрь 2008 - 20:12 )

  • 0

#3 Din-nk

Din-nk
  • Новобранец
  • 7 сообщений

Отправлено 23 Декабрь 2008 - 20:14

Можно сделать так : запоминаешь границы твоей формы (это максимальные координаты X,Y). Потом с помощью события MouseMove определяешь текущую позицию курсора мыши, и изменаешь opacity когда координаты курсора в поле видимости формы и вне поля видимости.

Т.е если вот так по ступенькам :

1) Берёшь и запоминаешь максимальный X,Y нужной формы.
2) Цепляешь событие MouseMove.
3) Далее проверка :
Если мышь.Х > форма.граница.Х || мышь.Y > форма.граница.Y
opacity = 0.25
Иначе
opacity = 100

Вот так должно работать. Свойства у формы я думаю найдёшь сам. :)


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

#4 leray

leray
  • Пользователь
  • 37 сообщений

Отправлено 23 Декабрь 2008 - 21:26

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


что мешает, ко всему выше сказаному, проверять какое окно активно в данный момент
  • 0

#5 Warvick

Warvick
  • Пользователь
  • 411 сообщений
  • Откуда:Tallinn

Отправлено 24 Декабрь 2008 - 00:46

На скорую руку:

public partial class Form2 : Form
	{
		public Form2()
		{
			InitializeComponent();
		}

		/// <summary>
		/// Determines whether cursor position is within the form.
		/// </summary>
		/// <returns>
		/// 	<c>true</c> if cursor position is within the form; otherwise, <c>false</c>.
		/// </returns>
		private bool IsCursorInForm()
		{
			return ClientRectangle.Contains(PointToClient(Cursor.Position));
		}


		/// <summary>
		/// Handles the MouseEnter event of the Form2 control.
		/// </summary>
		/// <param name="sender">The source of the event.</param>
		/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
		private void Form2_MouseEnter(object sender, EventArgs e)
		{
			//set opacity, only when cursor is within Form2
			if (IsCursorInForm())
			{
				this.Opacity = 1;
			}
		}

		/// <summary>
		/// Handles the MouseLeave event of the Form2 control.
		/// </summary>
		/// <param name="sender">The source of the event.</param>
		/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
		private void Form2_MouseLeave(object sender, EventArgs e)
		{
			//set opacity only when the cursor is NOT within Form2
			if (!IsCursorInForm())
			{
				this.Opacity = 0.25;
			}

		}
	   
	}

К сожалению тайтл бар не входит в границы контрола, поэтому при наведении на неё прозрачность будет устнавливаться а 0.25
Также, если на форме есть контрол, котрый располагается вплотную к границе формы, или пересекает её, то код коннектно работать не будет. Но тут уже легче - достатончно подписатья на MouseEnter/Leave для всех контролов.
  • 0
Да, я такой!

#6 Din-nk

Din-nk
  • Новобранец
  • 7 сообщений

Отправлено 24 Декабрь 2008 - 15:04

Есть небольшая проблема, когда приходит событие MouseLeave мышка находится еще над фомрой, т.е. форма становится прозрачнее только если очень резко выдернуть мышку с нее
  • 0

#7 Warvick

Warvick
  • Пользователь
  • 411 сообщений
  • Откуда:Tallinn

Отправлено 24 Декабрь 2008 - 15:42

Din-nk,
недопонял.
у мну всё нормально с выдергиваниями и т.д. Попробуй изменить код. чтобы впроверялись координаты не ClientRectangle а самого окна.
  • 0
Да, я такой!

#8 Din-nk

Din-nk
  • Новобранец
  • 7 сообщений

Отправлено 24 Декабрь 2008 - 18:13

Din-nk,
недопонял.
у мну всё нормально с выдергиваниями и т.д. Попробуй изменить код. чтобы впроверялись координаты не ClientRectangle а самого окна.


Пробовал, но все равно, функция IsCursorInForm() все время возвращает true

Все, заработало, просто у меня была ошибка с координатами небольшая (X и Y перепутал)
Warvick, большое спасибо!

Сообщение изменено: Din-nk (24 Декабрь 2008 - 18:35 )

  • 0