quadrados realçados em uma CustomControl tabuleiro de xadrez não persistem além do evento inicial MouseDown

StackOverflow https://stackoverflow.com/questions/431739

  •  08-07-2019
  •  | 
  •  

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()
            }
        }
    }
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top