I quadrati evidenziati su una scacchiera CustomControl non persistono oltre l'evento MouseDown iniziale
Domanda
Ho programmato una partita a scacchi con un'app di Windows in C # come esercizio per affinare le mie capacità e anche perché è divertente. Ho incluso funzionalità che consentono a un giocatore di selezionare l'opzione per evidenziare i quadrati in cui un pezzo può spostarsi legalmente quando viene cliccato. Un CustomControl gestisce il rendering della scacchiera ed evidenzia anche i quadrati.
Funziona come previsto fino a quando il giocatore inizia a trascinare il pezzo in una nuova casella. Nel momento in cui il mouse si sposta, i momenti salienti scompaiono. Ho il sospetto che venga generato un evento Paint e che la scheda si ridisegni. E poiché i momenti salienti non fanno parte del layout iniziale della scheda, non vengono disegnati.
Quello che vorrei che accadesse è che i quadrati rimangano evidenziati fino a quando il pezzo non viene lasciato cadere sul suo quadrato di destinazione. È possibile farlo? Eventuali suggerimenti saranno apprezzati.
Codice Psuedo:
void piece_MouseDown(object sender, MouseEventArgs e)
{
Piece piece = (Piece)sender;
legalSquares = CalculateLegalSquares(piece.CurrentSquare);
if (legalSquares.Count > 0 && this.showLegalMoves)
{
chessBoard1.HighlightSquares(legalSquares);
}
// I believe a Paint event gets raised either here...
piece.DoDragDrop(piece, DragDropEffects.Move);
}
void piece_DragEnter(object sender, DragEventArgs e)
{
// ...or here, that removes the highlights.
if (e.Data.GetDataPresent("Chess.Piece"))
{
e.Effect = DragDropEffects.Move;
}
else
{
e.Effect = DragDropEffects.None;
}
}
void piece_DragDrop(object sender, DragEventArgs e)
{
Piece piece = (Piece)e.Data.GetData("Chess.Piece");
if (piece.CurrentSquare != dropSquare)
{
if (legalSquares.Contains(dropSquare))
{
// This is where I’d like the highlights to stop
// DoStuff()
}
}
}
Soluzione
Sembra che tu stia evidenziando i quadrati validi disegnando direttamente, ma questo verrà cancellato da qualsiasi ridipingere. Probabilmente perderai i momenti salienti se la tua finestra viene ridipinta anche per altri motivi, come minimizzare e ripristinare o trascinare un'altra finestra sopra di essa.
In questo caso, probabilmente dovrai sovrascrivere il metodo OnPaint ed evidenziarlo. Quando vuoi cambiare ciò che è evidenziato, imposta un certo stato nella tua classe per controllare ciò che è disegnato come evidenziato nel metodo OnPaint, quindi invalida la tua finestra.