CustomControl Chessboard의 강조 표시된 사각형은 초기 Mousedown 이벤트를 넘어 지속되지 않습니다.

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

  •  08-07-2019
  •  | 
  •  

문제

나는 C#의 Windows 앱 체스 게임을 내 기술을 연마하는 연습으로 코딩하고 있으며 재미 있기 때문입니다. 플레이어가 클릭 할 때 조각이 법적으로 이동할 수있는 제곱을 강조 표시하는 옵션을 선택할 수있는 기능이 포함되어 있습니다. CustomControl은 체스 판의 렌더링을 처리하고 사각형도 강조합니다.

플레이어가 조각을 새 정사각형으로 끌기 시작할 때까지 계획된대로 작동합니다. 마우스가 움직이는 순간 하이라이트가 사라집니다. 나는 페인트 이벤트가 제기되고 보드가 자체적으로 다시 그리기를 생각합니다. 그리고 하이라이트는 초기 보드 레이아웃의 일부가 아니기 때문에 그려지지 않습니다.

내가하고 싶은 것은 조각이 대상 사각형에 떨어질 때까지 사각형이 강조 표시되는 것입니다. 이것을 달성 할 수 있습니까? 모든 제안에 감사드립니다.

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