Les cases surlignées sur un échiquier CustomControl ne persistent pas au-delà de l'événement MouseDown initial

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

  •  08-07-2019
  •  | 
  •  

Question

Je suis en train de coder un jeu d'échecs d'application Windows en C # pour améliorer mes compétences et aussi parce que c'est amusant. J'ai inclus une fonctionnalité qui permet à un joueur de sélectionner l'option permettant de mettre en évidence les carrés sur lesquels une pièce peut légalement se déplacer lorsque l'on clique dessus. Un CustomControl gère le rendu de l'échiquier et met également en évidence les carrés.

Tout fonctionne comme prévu jusqu'à ce que le joueur commence à faire glisser la pièce sur une nouvelle case. Au moment où la souris bouge, les points forts disparaissent. Je soupçonne qu'un événement Paint est déclenché et que le tableau se redessine. Et comme les points saillants ne font pas partie de la disposition initiale du tableau, ils ne sont pas dessinés.

Ce que je voudrais, c’est que les cases restent en surbrillance jusqu’à ce que la pièce soit déposée sur sa case de destination. Est-il possible d'accomplir cela? Toutes les suggestions seront appréciées.

Code 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()
            }
        }
    }
Était-ce utile?

La solution

On dirait que vous mettez en surbrillance les carrés valides en dessinant directement, mais cela sera effacé à chaque repeinte. Vous perdrez probablement les points saillants si votre fenêtre est repeinte pour d'autres raisons également, telles que sa réduction et sa restauration, ou le déplacement d'une autre fenêtre par-dessus.

Si tel est le cas, vous devrez probablement remplacer la méthode OnPaint et y mettre en évidence. Lorsque vous souhaitez modifier ce qui est en surbrillance, définissez un état dans votre classe pour contrôler ce qui est dessiné en surbrillance dans la méthode OnPaint, puis Invalidez votre fenêtre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top