Hervorgehoben Quadrate auf einem Schachbrett Custom bestehen nicht über das ursprüngliche MouseDown- Ereignis

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

  •  08-07-2019
  •  | 
  •  

Frage

Ich habe als eine Übung ein Windows-Anwendung Schachspiel in C # worden Codierung meine Fähigkeiten in Honen, und auch, weil es Spaß macht. Ich habe Funktionalität enthalten, die ein Spieler erlaubt, um die Option auszuwählen, die Quadrate ein Stück zu können rechtlich markieren bewegen, wenn es angeklickt wird. Ein Customcontrol übernimmt die Wiedergabe des Schachbretts und es hebt auch die Quadrate.

Es funktioniert alles wie geplant, bis der Spieler das Stück zu einem neuen Platz zu ziehen beginnt. In dem Moment, die Maus bewegt, gehen die Lichter weg. Ich vermute, dass ein Paint-Ereignis ausgelöst wird und der Vorstand neu zeichnet sich. Und da die Highlights nicht Teil des ursprünglichen Board-Layouts sind, dass sie nicht gezogen bekommen.

Was würde Ich mag es geschehen für die Quadrate hervorgehoben zu bleiben, bis das Stück auf seinem Bestimmungsort Platz fallen gelassen wird. Ist es möglich, dies zu erreichen? Alle Vorschläge werden geschätzt.

Psuedo Code:

    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()
            }
        }
    }
War es hilfreich?

Lösung

Es klingt wie Sie die gültigen Quadrate markieren direkt durch Ziehen, aber dies wird auf jeden repaint erhalten gelöscht. Sie werden wahrscheinlich die Highlights verlieren, wenn Sie Ihre Fenster auch aus anderen Gründen neu gestrichen wird, wie zu minimieren und die Wiederherstellung es, oder ein anderes Fenster oben drauf ziehen.

Wenn dies der Fall ist, müssen Sie wahrscheinlich die OnPaint-Methode außer Kraft zu setzen und tun Sie es hervorheben. Wenn Sie ändern mögen, was markiert ist, einigen Zustand in der Klasse gesetzt zu kontrollieren, was in der OnPaint-Methode als hervorgehoben gezeichnet wird, und dann Fenster entkräften.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top