我一直在用C#编写一个Windows应用程序的国际象棋游戏,作为锻炼技能的练习,也因为它很有趣。我已经添加了一些功能,允许玩家选择该选项来突出显示一个片段在点击时可以合法移动的方块。 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