2015-12-09 19 views
5

Sto lavorando a un programma di enigmi di WordSearch (chiamato anche WordFind) in cui devi trovare determinate parole in una massa di lettere. Sto usando C# WinForms.Mouse non si attiva quando il mouse è inattivo

Il mio problema è quando voglio fare clic e tenere premuto 1 lettera (Label), quindi trascinare su altre lettere per cambiare il loro ForeColor. Ho provato googling ma senza risultato.

Ecco quello che ho:

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

Tuttavia, l'evento MouseHover mai spara a meno che il mouse non viene tenuto premuto. Anche senza fortuna scambiando MouseHover con MouseEnter. Così, ho continuato le MouseDown e MouseUp eventi e provato ad utilizzare MouseHover all'interno del modulo stesso:

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

Questo evento non sia e io sono in perdita per spiegare perché non è sparare e quali alcune soluzioni alternative sono . Qualsiasi consiglio è apprezzato.

+1

Si potrebbe utilizzare un timer e verificare se il pulsante del mouse è in basso e poi il codice da 'frmMain_MouseHover' deve essere eseguito. Puoi controllare [risposta] (http://stackoverflow.com/questions/8159534/net-how-to-check-if-the-mouse-is-in-a-control) –

+0

Soluzione eccezionale! Pensare fuori dagli schemi! Tysm! –

risposta

3

È possibile utilizzare gli eventi di trascinamento della selezione.

  1. Impostare la proprietà AllowDrop per ogni controllo che è obiettivo di rilascio.
  2. Maniglia MouseDown evento per ogni controllo che il trascinamento inizia con esso e nel gestore chiamata DoDragDrop evento di quel controllo e imposta i dati che si desidera trascinare.
  3. Gestire l'evento DragEnetr di ciascun obiettivo di trascinamento e impostare e.Effect per determinare se la caduta è consentita o meno. Qui è il posto in cui è possibile verificare se è consentito il rilascio, cambiare il colore del retro al colore desiderato.
  4. Maniglia DragLeave per ripristinare il colore posteriore.
  5. Hanlde DragDrop e utilizzare il metodo GetData se e.Data per ottenere i dati ed eseguire le azioni quando si rilasciano.

piedi attraverso

Esempio

Ho 3 pulsanti, button1 e button2 e button3 e button2 è bersaglio di goccia. Nel codice qui sotto, controllerò se il testo che verrà rilasciato sul pulsante 2, sarà il testo del pulsante 1, cambierò il colore posteriore del pulsante 2 in verde, altrimenti in rosso. anche se trascini il mouse fuori dal pulsante2, imposterai il colore posteriore come predefinito.Se si lascia cadere, cambierò il testo di Button2 e porrò il testo di 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 per il suggerimento, andando a giocare con questi eventi e vedere se questo avrebbe funzionato meglio. Ho sempre pensato che questi eventi fossero solo per trascinare i file sul modulo. –

+1

Siete i benvenuti :) fatemi sapere se avete qualche domanda sulla risposta o se è possibile risolvere il problema :) –

+0

Bingo! Ha fatto meraviglie. Saluti! –

0

siete alla ricerca per i vari eventi di trascinamento:

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

ecc ...

Il problema che si esegue in è che si sta utilizzando gli eventi sbagliati per quello stai cercando di realizzare.

+1

In che modo esattamente non si tratta di una risposta? Sta usando gli eventi sbagliati. Non andare a svalutare le persone solo perché non sai come risolvere il suo problema. Usare un timer è un modo stupido e inutile per risolvere questa soluzione quando può ottenere i risultati esatti che sta cercando utilizzando gli eventi di trascinamento invece del clic. . . . –

+3

@AnthonyHart La tua risposta è tecnicamente corretta +1 alla tua risposta. Ma è meglio aggiungere più dettagli per rispondere, come ho fatto :) Spero che tu trovi la risposta utile :) –

+1

Non puoi pubblicare un gruppo di link senza alcuna spiegazione. Almeno, dovresti scrivere che gli eventi che ha usato non si adattano a questa situazione e ha bisogno di usare qualcos'altro (specificare gli eventi e come usarli). È importante avere dei collegamenti nella risposta, ma possono cambiare in modo tale che sia necessario citarli nella risposta. Il mio commento potrebbe essere sbagliato, ecco perché è un commento ma non una risposta. Sono assolutamente d'accordo che l'utilizzo di un timer non è l'approccio migliore. Per favore, migliora la tua risposta e la gente lo inviterà. –

Problemi correlati