I quadrati evidenziati su una scacchiera CustomControl non persistono oltre l'evento MouseDown iniziale

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

  •  08-07-2019
  •  | 
  •  

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()
            }
        }
    }
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top