quadrados realçados em uma CustomControl tabuleiro de xadrez não persistem além do evento inicial MouseDown
Pergunta
Eu tenho a codificação de um jogo de xadrez aplicativo do Windows em C # como um exercício de aperfeiçoar minhas habilidades, e também porque é divertido. Eu incluí funcionalidade que permite a um jogador para selecionar a opção para destacar os quadrados a peça pode legalmente mover-se para quando ele fica clicado. A CustomControl lida com a prestação do tabuleiro de xadrez e também destaca as praças.
Tudo funciona como previsto até que o jogador começa a arrastar a peça para uma nova praça. No momento em que o mouse se move, os destaques vão embora. Eu suspeito que um evento Paint é levantado ea placa redesenha próprio. E uma vez que os destaques não fazem parte do layout da placa inicial, eles não se mete.
O que eu gostaria que acontecesse é para as praças de permanecer realçado até que a peça cair sobre sua casa de destino. É possível fazer isso? Todas as sugestões serão apreciadas.
código 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()
}
}
}
Solução
Parece que você está destacando as praças válidos por desenhar diretamente, mas isso vai ficar apagado em qualquer repintar. Você provavelmente vai perder os destaques se sua janela é redesenhada por outras razões também, como minimizar e restaurá-lo, ou arrastando uma outra janela em cima dela.
Se este for o caso, você provavelmente precisará substituir o método OnPaint e fazer a sua destacando lá. Quando você quiser mudar o que é destacado, definir algum estado em sua classe para controlar o que é desenhado como destacado no método OnPaint, e, em seguida, invalidar a sua janela.