2015-12-09 2 views
5

Я работаю над программой голосовой WordSearch (также называемой WordFind), где вам нужно найти определенные слова в массе букв. Я использую C# WinForms.MouseHover не стреляет, когда мышь не работает

Моя проблема в том, когда я хочу нажать и удерживать 1 букву (Label), а затем перетащить ее на другие буквы, чтобы изменить их ForeColor. Я пробовал поиск в Интернете, но безрезультатно.

Вот что у меня есть:

foreach (Letter a in game.GetLetters()) 
{ 
    this.Controls.Add(a); 
    a.MouseDown += (s, e2) => 
    { 
     isDown = true; 
     a.ForeColor = Color.Yellow; 
    }; 
    a.MouseUp += (s, e2) => 
    { 
     isDown = false; 
    }; 
    a.MouseHover += (s, e2) => 
    { 
     if (isDown) 
      a.ForeColor = Color.Yellow; 
    }; 
} 

Однако событие MouseHover никогда не срабатывает, если мышь не не удерживается. Также не повезло обменивать MouseHover с MouseEnter. Таким образом, я держал MouseDown и MouseUp события и пытался использовать MouseHover в самой форме:

private void frmMain_MouseHover(object sender, MouseEventArgs e) 
{ 
    if (isDown) 
    { 
     foreach (Letter l in game.GetLetters()) 
      if (l.ClientRectangle.Contains(l.PointToClient(Control.MousePosition))) 
       l.ForeColor = Color.Purple; 
    } 
} 

Это событие не срабатывает либо, и я в недоумении, почему это не обжига и то, что некоторые альтернативные решения , Любые советы приветствуются.

+1

Вы могли бы использовать таймер и проверить, если кнопка мыши нажата, то код из 'frmMain_MouseHover' должен быть выполнен. Вы можете проверить это [ответ] (http://stackoverflow.com/questions/8159534/net-how-to-check-if-the-mouse-is-in-a-control) –

+0

Удивительное решение! Думайте нестандартно! Tysm! –

ответ

3

Вы можете использовать события перетаскивания.

  1. AllowDrop Недвижимость для каждого элемента управления, предназначенного для капли.
  2. Ручка MouseDown Событие для каждого элемента управления, с которого начинается перетаскивание, и в вызове обработчика DoDragDrop события этого элемента управления и установки данных, которые вы хотите перетащить.
  3. Ручка DragEnetr Событие каждой цели перетаскивания и задано e.Effect, чтобы определить, разрешено ли падение или нет. Здесь вы можете проверить, разрешено ли удаление, изменить цвет задней части на нужный цвет.
  4. Ручка DragLeave для сброса заднего фона.
  5. Hanlde DragDrop и использовать метод GetData, если e.Data, чтобы получить данные и выполнить действия при падении.

ходьба через

Пример

У меня есть 3 кнопки, Button1 и Button2 и Button3 и button2 является объектом капли. В приведенном ниже коде я проверю, будет ли текст, который выпадет на кнопке 2, текст кнопки 1, я изменил цвет кнопки 2 на зеленый, а затем на красный. также, если вы перетаскиваете мышь из кнопки 2, я поставлю задний цвет по умолчанию.Если вы уронили, я изменю текст button2 и установит текст button1:

//Start drag for button 2 
private void button1_MouseDown(object sender, MouseEventArgs e) 
{ 
    this.button1.DoDragDrop(this.button1.Text, DragDropEffects.Copy); 
} 

//Start drag for button 3 
private void button3_MouseDown(object sender, MouseEventArgs e) 
{ 
    this.button3.DoDragDrop(this.button3.Text, DragDropEffects.Copy); 
} 

//Check if drop is allowed and change back color 
private void button2_DragEnter(object sender, DragEventArgs e) 
{ 
    if(e.Data.GetData(DataFormats.Text).ToString()== button1.Text) 
    { 
     e.Effect = DragDropEffects.Copy; 
     this.button2.BackColor = Color.Green; 
    } 
    else 
    { 
     e.Effect = DragDropEffects.None; 
     this.button2.BackColor = Color.Red; 
    } 
} 

//Perform drop actions 
private void button2_DragDrop(object sender, DragEventArgs e) 
{ 
    this.button2.Text = e.Data.GetData(DataFormats.Text).ToString(); 
} 

//Reset back color here 
private void button2_DragLeave(object sender, EventArgs e) 
{ 
    this.button2.BackColor = SystemColors.Control; 
} 
+0

Tysm за предложение, собираюсь поиграть с этими событиями и посмотреть, будет ли это работать лучше. Всегда считал, что эти события предназначены только для перетаскивания файлов в форму. –

+1

Добро пожаловать :) дайте мне знать, если у вас есть какие-либо вопросы по поводу ответа или если вы можете решить проблему :) –

+0

Бинго! Твои чудеса. Ура! –

0

Вы ищете различные события перетаскивания:

https://msdn.microsoft.com/en-us/library/system.windows.forms.control.dragenter(v=vs.110).aspx https://msdn.microsoft.com/en-us/library/system.windows.forms.control.dragover(v=vs.110).aspx

и т.д ...

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

+1

Как именно это не ответ? Он использует неправильные события. Не уходите от людей, потому что вы не знаете, как исправить его проблему. Использование таймера - это глупый и ненужный способ решения этого решения, когда он может получить точные результаты, которые он ищет, используя события перетаскивания, а не щелчки. , , , –

+3

@AnthonyHart Ваш ответ технически правильный +1 к вашему ответу. Но лучше добавить более подробную информацию, чтобы ответить, как и я :) Надеюсь, вы найдете ответ полезным :) –

+1

Вы не можете публиковать кучу ссылок без каких-либо объяснений. По крайней мере, вы должны написать, что события, которые он использовал, не подходят в этой ситуации, и ему нужно использовать что-то еще (указать события и как их использовать). Важно иметь ссылки в ответе, но они могут измениться, поэтому он может ссылаться на них в вашем ответе. Мой комментарий может быть неправильным, поэтому это комментарий, но не ответ. Я полностью согласен с тем, что использование таймера - не лучший подход. Пожалуйста, улучшите свой ответ, и люди повысят его. –

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