0

这是我的代码:

public partial class Form1 : Form
{
    Graphics g;
    bool mouseUP = false;
    double dimensions = 4.0;
    SolidBrush brush;

    public Form1()
    {
        InitializeComponent();
        g = this.CreateGraphics();
        brush = new SolidBrush(Color.Black);
    }

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        mouseUP = false;
        backgroundWorker1.RunWorkerAsync(e);
    }

    private bool mouseIsUP()
    {
        return mouseUP;
    }

    private void Form1_MouseUp(object sender, MouseEventArgs e)
    {
        mouseUP = true;
        MessageBox.Show("UP");
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        backgroundWorker1.ReportProgress(0,e.Argument);  
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        while (!mouseIsUP())
        {
            g.FillEllipse(brush, ((MouseEventArgs)e.UserState).X - (int)dimensions / 2, ((MouseEventArgs)e.UserState).Y - (int)dimensions / 2, (int)dimensions, (int)dimensions);
            dimensions += 0.2;
            Thread.Sleep(10);
        }
    }
}

为什么永远不会发生 mouseUP 事件???如果我删除 while 我可以看到 MessageBox “UP”...

我试图在按下鼠标时使椭圆变大。当我释放鼠标按钮时,椭圆不应该增长更多。

提前致谢!

4

2 回答 2

1

因为您没有将事件处理程序绑定到事件(假设您没有错过该代码)。

例如,在 Form1 的构造函数中,您可以添加

MouseUp += Form1_MouseUp;
MouseDown += Form1_MouseDown;
于 2013-10-14T12:31:33.403 回答
1

看起来后台工作人员以某种方式阻塞了代码中的事件循环。工人在哪里调用 DoWork?

我认为更好的解决方案可能是覆盖 OnPaint 方法,检查鼠标是否在那里,然后画你的圆圈。

bool isMouseDown = false;
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
    isMouseDown = true;
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
    isMouseDown = false;
}
protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    if (isMouseDown)
    {
        g.FillEllipse(brush, ((MouseEventArgs)e.UserState).X - (int)dimensions / 2, ((MouseEventArgs)e.UserState).Y - (int)dimensions / 2, (int)dimensions, (int)dimensions);
        dimensions += 0.2;
        Thread.Sleep(10);

    }
}
于 2013-10-14T13:05:47.767 回答