Выделенные квадраты на шахматной доске CustomControl не сохраняются после начального события MouseDown - PullRequest
1 голос
/ 10 января 2009

Я кодировал шахматную игру для Windows на C # как упражнение для оттачивания своих навыков, а также потому, что это весело. Я включил функциональность, которая позволяет игроку выбирать опцию для выделения квадратов, на которые часть может легально перемещаться, когда на нее нажимают. CustomControl обрабатывает рендеринг шахматной доски, а также подсвечивает квадраты.

Все работает как запланировано, пока игрок не начнет перетаскивать фигуру на новый квадрат. В тот момент, когда мышь двигается, блики исчезают. Я подозреваю, что событие Paint происходит, и доска перерисовывается. А поскольку основные моменты не являются частью первоначального макета доски, они не прорисовываются.

Я бы хотел, чтобы квадраты оставались выделенными до тех пор, пока фигура не упадет на квадрат назначения. Возможно ли это сделать? Любые предложения будут оценены.

Код 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()
            }
        }
    }

1 Ответ

1 голос
/ 11 января 2009

Звучит так, как будто вы выделяете действительные квадраты, рисуя напрямую, но это будет стерто при любом перекрашивании. Вы, вероятно, потеряете блики, если ваше окно будет перекрашено по другим причинам, таким как сворачивание и восстановление или перетаскивание другого окна поверх него.

Если это так, вам, вероятно, нужно переопределить метод OnPaint и выполнить там выделение. Если вы хотите изменить то, что подсвечено, задайте какое-либо состояние в своем классе, чтобы контролировать то, что рисуется, как подсвечено в методе OnPaint, а затем аннулируйте свое окно.

...