调用鼠标事件和向消息框提供输入的问题

本文关键字:输入 问题 消息 鼠标 事件 调用 | 更新日期: 2023-09-27 17:59:47

我的问题似乎有点长,但我知道解决方案是对我的代码进行轻微的更正。我正在表单1 中实现一个由3个鼠标事件和一个绘画事件组成的序列

pictureBox1_鼠标向下,pictureBox1_鼠标移动,pictureBox1_ Paint,pictureBox1_MouseUp。

代码应该是这样工作的:当我点击鼠标并拖动它并在所需的点释放按钮时,应该会出现一个接受输入值的自定义消息框。因此,我构建了一个显示为消息框的表单(form2)。这是我的表单1的代码,你可以在看到代码后理解问题。

形式1:

     private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        // "e.X" and "e.Y" are used to get MousePositionX and MousePositionY
        rect = new Rectangle(0, 0, e.X, e.Y);
        pictureBox1.Invalidate();
    } 
    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        // This makes sure that the left mouse button is pressed.
        if (e.Button == MouseButtons.Left)
        {
            // Draws the rectangle as the mouse moves
            rect.Width = e.X;
            rect.Height = e.Y;
        }
        pictureBox1.Invalidate();
    }
    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        using (Pen pen = new Pen(Color.Red, 2))
        {
            e.Graphics.DrawRectangle(pen, rect);
        }
    }

    private WindowsFormsApplication2.Form2 _form2 = new WindowsFormsApplication2.Form2();
    private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {
        DialogResult dialogresult = _form2.ShowDialog(this);

        if (dialogresult == DialogResult.OK)
        {
            try
            {
                for (int i = 0; i < 2; i++)
                {
                    l[i] = e.X;
                    m[i] = e.Y;
                }
            }
            catch (Exception ex)
            {
            }
        }
    }

这里的问题是:

1) 根据代码,当我们拖动鼠标时,会出现一个矩形,而我们离开鼠标按钮的地方会出现一条消息框,现在这个消息框(form2)无法读取输入值,因为我不知道如何将form2的OK和CANCEl按钮与form1连接起来。在输入并按下OK后,矩形应该会消失,但这里没有发生。

2) 我只需要输入两次,也就是说,我只执行了两次之前的动作序列(所有鼠标事件和绘画事件),所以我相应地编写了FOR循环。但问题是消息框(form2)每次都会被触发,我松开鼠标按钮。这导致了一个严重的问题,因为在给出两个输入之后,我必须实现一个mousedoubleclick事件。

请告诉我我必须做的必要的更正。提前谢谢。

调用鼠标事件和向消息框提供输入的问题

我不知道你说的"将form2的OK和CANCEL按钮与form1连接起来"是什么意思?

你不必"连接"任何东西。您只需要Form2上的两个按钮(OK和Cancel),在每个_click方法中,您需要this.DialogResult = DialogResult.OK;表示OK,this.DialogResult = DialogResult.Cancel;表示Cancel。

然后你继续学习中一的"如果"。

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            DialogResult dialogresult = _form2.ShowDialog(this);
            if (dialogresult == DialogResult.OK)
            {                
                rect.Width = 0;
                rect.Height = 0;
                pictureBox1.Invalidate();
            }
        } 

这将删除矩形。我不知道这是否是一个好的解决方案,但它有效。

方法中的循环无法按您想要的方式工作:每次调用pictureBox1_MouseUp并到达for循环时,循环"i"都将设置为"0",然后循环开始
在Form1的构造函数中需要一个int TwoClicks = 0。您必须相应地更改pictureBox1_MouseUp

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            if (TwoClicks < 2)
            {
            TwoClicks++;
            DialogResult dialogresult = _form2.ShowDialog(this);
            if (dialogresult == DialogResult.OK)
            {                
                rect.Width = 0;
                rect.Height = 0;
                pictureBox1.Invalidate();
            }
            }
        }

请随意提问(如果我没有答对,请描述你的第一个问题)。