2015-08-21 2 views
2

Я использую MousePosition, чтобы попытаться определить, каким образом пользователь перемещает свою или ее мышь после запуска события MouseDown. Проблема в том, что я пытаюсь создать стартовую переменную с использованием типа данных Point, и я хочу, чтобы эта точка была заполнена данными один раз, но у меня она есть в MouseDown, поэтому я могу использовать аргументы мыши eX и eY, чтобы определить, где событие MouseDown было называется. Вот пример того, что им думать оПовторное создание точки

public void panel1_MouseDown(object sender, MouseEventArgs e) 
{ 
    Point start = new Point(e.X, e.Y); 
} 
public void panel1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if(MousePosition.X > start.X) 
    { 
     Console.WriteLine("you have moved right"); 
    } 
} 

так, как бы я только создать что начать переменную один раз, все еще имея это иметь доступ к аргументу электронной мыши. а также как мне получить доступ к переменной между panel1_MouseDown и panel1_MouseMove? Если вы видите лучшую альтернативу этому, это будет здорово! Спасибо всем за помощь!

+0

Вы не можете иметь локальную переменную rea d другой функцией. В чем проблема с наличием члена класса (наряду с логическим, который определяет, находится ли мышь или нет)? Кроме того, поскольку 'Point' является типом значений (' struct'), вы не можете иметь его «uninitialized» (то есть его значение не может быть «null») – Jcl

+0

Сделать 'start' частной переменной в ваш класс и потерять объявление типа («Точка») в методе MouseDown. – Eraph

ответ

3

Если у вас есть отвращение определить новые член класса (по некоторым причинам), это как минимум вы могли бы:

Point? start = null; 
public void panel1_MouseDown(object sender, MouseEventArgs e) 
{ 
    start = new Point(e.X, e.Y); 
} 
public void panel1_MouseUp(object sender, MouseEventArgs e) 
{ 
    start = null; 
} 
public void panel1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if(start.HasValue) 
     if(MousePosition.X > start.Value.X) 
     Console.WriteLine("you have moved right"); 
} 

Но для ясности (и функциональности) у меня была бы дополнительная логическая переменная:

bool mouseIsDown = false; 
Point start; 

public void panel1_MouseDown(object sender, MouseEventArgs e) 
{ 
    start = new Point(e.X, e.Y); 
    mouseIsDown = true; 
} 
public void panel1_MouseUp(object sender, MouseEventArgs e) 
{ 
    mouseIsDown = false; 
} 
public void panel1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if(mouseIsDown) 
     if(MousePosition.X > start.X) 
     Console.WriteLine("you have moved right"); 
} 
+0

Я не думал о том, что я вижу теперь огромное спасибо вам :) – Havion

2

объявить начальную точку в качестве частного класса переменной

Private Point start; 

public void panel1_MouseDown(object sender, MouseEventArgs e) 
{ 
    this.start = new Point(e.X, e.Y); 
} 
public void panel1_MouseMove(object sender, MouseEventArgs e) 
{ 
     if(MousePosition.X > this.start.X) 
     { 
      Console.WriteLine("you have moved right"); 
     } 
} 
+0

что я пытался написать от него, просто добавьте в panel1_mousedown, если (start == default (Point)), или пользователь начнет запуск каждый раз, когда он нажимает на мышь вниз – Monah

+0

'Point' является' struct' , и не может быть пустым – Jcl

+0

@Jcl - правильный modifield – vinayan

Смежные вопросы