2015-12-09 16 views
5

Pracuję nad programem do łamania słów WordSearch (zwanym także WordFind), w którym trzeba znaleźć określone słowa w masie liter. Używam WinForms C#.MouseHover nie uruchamia się, gdy mysz jest wyłączona.

Mój problem polega na tym, że chcę kliknąć i przytrzymać 1 literę (Label), a następnie przeciągnąć do innych liter, aby zmienić ich ForeColor. Próbowałem googling, ale bezskutecznie.

Oto co mam:

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; 
    }; 
} 

Jednak nigdy zdarzenie MouseHover odpala chyba że mysz nie jest wciśnięty. Również nie ma szczęścia zamieniając MouseHover z MouseEnter. Tak więc, na bieżąco wydarzenia MouseDown i MouseUp i spróbował wykorzystać MouseHover w postaci samego:

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; 
    } 
} 

To zdarzenie nie ognia albo i jestem w rozterce, dlaczego to nie jest wypalanie i co kilka alternatywnych rozwiązań . Każda rada jest doceniana.

+1

można użyć czasomierza i sprawdzić, czy przycisk myszy jest naciśnięty następnie kod z 'frmMain_MouseHover' powinny być wykonywane. Możesz to sprawdzić [odpowiedź] (http://stackoverflow.com/questions/8159534/net-how-to-check-if-the-mouse-is-in-a- control) –

+0

Niesamowite rozwiązanie! Myśl poza polem! Tysm! –

Odpowiedz

3

Można użyć zdarzeń przeciągania i upuszczania.

  1. Ustaw właściwość AllowDrop dla każdego kontrolowanego obiektu docelowego upuszczenia.
  2. Uchwyt MouseDown Zdarzenie dla każdego elementu sterującego, które przeciąga się wraz z nim iw zdarzeniu obsługi zdarzenia DoDragDrop Zdarzenie tej kontrolki i ustaw dane, które chcesz przeciągnąć.
  3. Zdarzenie DragEnetr Zdarzenie z każdego celu przeciągnij i ustaw e.Effect, aby określić, czy dozwolona jest kropla. Oto miejsce, w którym możesz sprawdzić, czy upuszczenie jest dozwolone, zmienić kolor z powrotem na żądany kolor.
  4. Uchwyt DragLeave do resetowania koloru tła.
  5. Hanlde DragDrop i użyj metody GetData, aby e.Data uzyskać dane i wykonać akcje po upuszczeniu.

chodząc

Przykład

mam 3 przyciski button1 i Button2 i button3 i Button2 Target kropli. W poniższym kodzie sprawdzę, czy tekst, który spadnie na przycisk 2, jest tekstem przycisku 1, zmienię kolor przycisku 2 na zielony, a na czerwony kolor. także jeśli usuniesz mysz z przycisku 2, ustawię domyślny kolor tyłu.Jeśli spadnie, będę zmieniać tekst Button2 i ustawić tekst 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 za sugestię, będzie się bawić z tymi zdarzeniami i zobacz, czy to będzie działać lepiej. Zawsze myślałem, że te wydarzenia były tylko dla przeciągania plików na formularz. –

+1

Zapraszamy! Daj mi znać, jeśli masz jakieś pytanie dotyczące odpowiedzi lub czy możesz rozwiązać problem :) –

+0

Bingo! Działały cuda. Twoje zdrowie! –

0

Patrzysz na różnych wydarzeń drag:

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

etc ...

Problem, który jest uruchomiony na to, że używasz niewłaściwych wydarzenia za to, co próbujesz osiągnąć.

+1

Jak dokładnie to nie jest odpowiedź? Używa złych wydarzeń. Nie idź w dół, bo ludzie nie wiedzą, jak rozwiązać problem. Korzystanie z licznika czasu jest głupim i niepotrzebnym sposobem rozwiązania tego problemu, gdy może uzyskać dokładne wyniki, których szuka, używając zdarzeń przeciągania zamiast kliknięć. . . . –

+3

@AnthonyHart Twoja odpowiedź jest poprawna technicznie +1 do twojej odpowiedzi. Ale lepiej jest dodać więcej szczegółów, aby odpowiedzieć, tak jak ja :) Mam nadzieję, że odpowiedź jest dla Ciebie pomocna :) –

+1

Nie możesz opublikować wielu linków bez żadnego wyjaśnienia. Przynajmniej powinieneś napisać, że zdarzenia, których użył, nie pasują do tej sytuacji i musi użyć czegoś innego (określić zdarzenia i sposób ich użycia). Ważne jest posiadanie linków w odpowiedzi, ale mogą one ulec zmianie, dlatego warto przytoczyć je w swojej odpowiedzi. Mój komentarz może być błędny, dlatego jest komentarzem, ale nie odpowiedzią. Całkowicie zgadzam się, że używanie timera nie jest najlepszym podejściem. Proszę poprawić swoją odpowiedź, a ludzie będą ją głosować. –

Powiązane problemy