CustomControlチェスボード上の強調表示された四角形は、最初のMouseDownイベントを超えて保持されません。

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

  •  08-07-2019
  •  | 
  •  

質問

C#でWindowsアプリチェスゲームをコーディングしてきたのは、スキルを磨くための練習として、また楽しいからです。プレーヤーがオプションをクリックして、ピースがクリックされたときに合法的に移動できる正方形を強調表示できる機能を追加しました。 CustomControlはチェス盤のレンダリングを処理し、正方形も強調表示します。

プレーヤーがピースを新しい正方形にドラッグし始めるまで、すべてが計画どおりに機能します。マウスを動かすと、ハイライトが消えます。 Paintイベントが発生し、ボード自体が再描画されると思われます。また、ハイライトは初期ボードレイアウトの一部ではないため、描画されません。

私がしたいことは、ピースが目的の正方形にドロップされるまで、正方形が強調表示されたままになることです。これを達成することは可能ですか?提案は大歓迎です。

擬似コード:

    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