1

我真的不确定这是否是我对 C#、VS 2010、调试、.net 或一般事件缺乏经验的问题,所以请多多包涵。我有一个绘制字母水族馆的项目。将不同颜色的字母添加到面板,然后为它们设置动画。这是一个简单的窗体项目,包括两个类,Fishtank 和 Fish。绘制事件用于绘制彩色字母,我们的任务是为它们设置动画。为了了解绘画事件如何使用具有初始加载和控件的类,我设置了一个断点。使用断点,我无法通过或越过绘制事件。没有断点,程序加载??这是我的经验不足,代码,调试还是什么的问题?

     private void fishTankPanel_Paint(object sender, PaintEventArgs e)
    {
        // Loop through each fish in our fish tank, and draw them.
        for (int i = 0; i < _fishTank.CountFish(); i++)
        {
            Fish fish = _fishTank.GetFish(i);
            e.Graphics.DrawString(fish.FishLetter, new Font("Arial", 10),
                new SolidBrush(fish.FishColor), new Point(fish.XPosition, fish.YPosition));
        }
        fishCountLabel.Text = _fishTank.CountFish().ToString();

    }

class Fish
{
    private Color _fishColor;
    public Color FishColor
    {
        get { return _fishColor; }
        set { _fishColor = value; }
    }

    private int _xPosition;
    public int XPosition
    {
        get { return _xPosition; }
        set { _xPosition = value; }
    }

    private int _yPosition;
    public int YPosition
    {
        get { return _yPosition; }
        set { _yPosition = value; }
    }

    private string _fishLetter;
    public string FishLetter
    {
        get { return _fishLetter; }
        set { _fishLetter = value; }
    }

    private string _direction;
    public string Direction
    {
        get { return _direction; }
        set { _direction = value; }
    }
    public Fish(string fishLetter, int xPosition, int yPosition, Color fishColor, string fishDirection)
    {
        // If no letter specified, use "X."
        if (fishLetter.Length == 0)
        fishLetter = "X";
        _fishLetter = fishLetter;

        // Ensure the position is >= 0.
        if (xPosition < 0)
        xPosition = 0;
        _xPosition = xPosition;

        if (yPosition < 0)
        yPosition = 0;
        _yPosition = yPosition;

        // Set the fish color.
        _fishColor = fishColor;

        // Set fish direction

    }
}class FishTank
{
    // Use a List collection to hold the fish.
    private List<Fish> _fishTank = new List<Fish>();
    public int CountFish()
    {
        return _fishTank.Count;
    }
    public Fish GetFish(int position)
    {
        return _fishTank[position];
    }
    public void AddFish(Fish fish)
    {
        _fishTank.Add(fish);
    }
    public void ClearFish()
    {
        _fishTank.Clear();
    }
}

反馈将不胜感激,并提前致谢。

4

1 回答 1

2

在单步调试绘制方法时,如果您的软件窗口(正在调试的窗口)至少部分与 Visual Studio 的窗口之一重叠 - 重叠甚至一个像素可能足以触发此症状。

发生的情况是,每当您在调试器中执行一个步骤时,焦点就会从调试器窗口切换到您的程序。由于程序窗口(至少部分被 Visual Studio 窗口之一覆盖)现在再次被带到前台,它将触发 Paint 事件。然后焦点将切换回调试器,这将再次(部分)覆盖程序窗口。执行下一步,整个过程重复,您将面临看似永无止境的绘画事件序列。

为避免此问题,请确保 Visual Studio 窗口和您的程序窗口不接触.

如果尽管调试器和程序窗口在空间上是分开的,但绘制事件仍然继续发生,那么您的代码也会在其他条件下触发绘制事件。可能触发绘制事件的典型候选示例是通知窗口已成为活动窗口的事件处理程序或焦点事件处理程序。

但是,如果焦点经常在调试器窗口和您的程序之间切换,那么弄清楚这一点可能会变得有些麻烦。如果怀疑有这样的问题,推荐的方法是使用远程调试。远程调试意味着要调试的程序在与调试器不同的机器/环境上运行,因此完全不受调试器 UI 的干扰。对于调试环境,您可能会使用第二台物理计算机,但通常使用虚拟机也是一个合理的选择。

于 2013-11-15T21:18:06.600 回答