Los cuadros resaltados en un tablero de ajedrez CustomControl no persisten más allá del evento inicial MouseDown

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

  •  08-07-2019
  •  | 
  •  

Pregunta

He estado codificando un juego de ajedrez de aplicaciones de Windows en C # como un ejercicio para perfeccionar mis habilidades y también porque es divertido. He incluido una funcionalidad que permite a un jugador seleccionar la opción para resaltar los cuadros a los que una pieza puede moverse legalmente cuando se hace clic. Un CustomControl maneja la representación del tablero de ajedrez y también resalta los cuadrados.

Todo funciona según lo planeado hasta que el jugador comienza a arrastrar la pieza a un nuevo cuadrado. En el momento en que se mueve el mouse, los aspectos más destacados desaparecen. Sospecho que se genera un evento Paint y el tablero se vuelve a dibujar. Y dado que los aspectos más destacados no son parte del diseño inicial del tablero, no se dibujan.

Lo que me gustaría que sucediera es que los cuadrados permanezcan resaltados hasta que la pieza se suelte en su cuadrado de destino. ¿Es posible lograr esto? Cualquier sugerencia será apreciada.

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

Solución

Parece que está resaltando los cuadrados válidos dibujando directamente, pero esto se borrará en cualquier repintado. Probablemente perderá los resaltados si su ventana también se vuelve a pintar por otras razones, como minimizarla y restaurarla, o arrastrar otra ventana encima de ella.

Si este es el caso, probablemente deba anular el método OnPaint y resaltar allí. Cuando desee cambiar lo que está resaltado, establezca algún estado en su clase para controlar lo que se dibuja como resaltado en el método OnPaint y luego invalide su ventana.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top