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

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

  •  08-07-2019
  •  | 
  •  

Вопрос

Я программировал шахматную игру для 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()
            }
        }
    }
Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top