繁体   English   中英

鼠标单击时绘制一个矩形

[英]Draw a rectangle on mouse click

我可以用mouseClick绘制一个矩形吗? 到目前为止,我的代码无效。 你能帮助我吗?

private void panel1_MouseClick(object sender, MouseEventArgs e)
{
    Graphics g = this.CreateGraphics();
    Pen pen = new Pen(Color.Black, 2);

    g.DrawRectangle(pen, 100,100, 100, 200);
}

编辑版:

没有太多假设你想做什么:

private void panel1_Click(object sender, EventArgs e) {
    using (Graphics g = this.panel1.CreateGraphics()) {
        Pen pen = new Pen(Color.Black, 2);
        Brush brush = new SolidBrush(this.panel1.BackgroundColor);

        g.DrawRectangle(pen, 100,100, 100, 200);

        pen.Dispose();
    }
}

您的代码无效,因为它在窗口上绘制矩形(this),然后您的面板隐藏绘制的矩形。

对于这样一个简单的情况, 通常 重写Paint只是为了在面板上绘制矩形而付出太多努力。 但是,以这种方式绘制矩形是有效的,但是当重新绘制表单时矩形将消失(例如,通过最小化并随后再次显示该表单。如果矩形必须是持久的,则必须使用绘制方法,为此您将必须(例如)在click事件中创建矩形,然后在paint事件中绘制它。(请参阅roygbiv的解决方案以获得此类方法)。注意:如果您同时使用paint方法,则应将其保留为尽可能高效,因为paint方法经常被称为verry。

编辑2

您无需清除背景,因为您的矩形将始终在同一位置绘制。 为了在用户提示的位置绘制矩形( 假设这是您想要的 ),您应该将代码移动到鼠标按下事件,例如:

private void panel1_MouseDown(object sender, MouseEventArgs e) {
    using (Graphics g = this.panel1.CreateGraphics()) {
        Pen pen = new Pen(Color.Black, 2);
        Brush brush = new SolidBrush(this.panel1.BackColor);

        g.FillRectangle(brush, this.panel1.Bounds);  // redraws background
        g.DrawRectangle(pen, e.X, e.Y, 20, 20);

        pen.Dispose();
        brush.Dispose();
    }
}

尝试用PictureBox代替这个代码(只是为了让你开始 - 有很多不同的方法来做到这一点):

private void pictureBox1_Click(object sender, EventArgs e)
{
    if (pictureBox1.Image == null)
    {
            pictureBox1.Image = new Bitmap(pictureBox1.width, 
                    pictureBox1.height);
    }
    using (Graphics g = Graphics.FromImage(pictureBox1.Image))
    {
        // draw black background
        g.Clear(Color.Black);
        Rectangle rect = new Rectangle(100, 100, 200, 200);
        g.DrawRectangle(Pens.Red, rect);
    }
    pictureBox1.Invalidate();
}

此技术将自动“持久化”您的绘图,这意味着如果另一个窗口被拖过它,它将不会消失。 当您直接绘制控件(您正在尝试使用CreateGraphics()调用时),您通常会遇到非持久性问题。

更新 :这是另一个答案,其中包含一个更详细的示例,用于绘制响应鼠标点击位置的内容:

如何在图片框中绘制图纸

我可以用mouseClick绘制一个矩形吗?

如果你的意思是“当我在面板上单击鼠标时,我想显示一个矩形”,那么你可以这样做:

        private bool displayRectangle = false;

        private void panel1_MouseClick(object sender, MouseEventArgs e)
        {
            displayRectangle = true;
            panel1.Invalidate(false);
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            if (displayRectangle)
            {
                using (Pen p = new Pen(Color.Black, 2))
                {
                    e.Graphics.DrawRectangle(p, 100, 100, 100, 200);
                }
            }
        }

如果你的意思是“我想在我的面板上拖动鼠标来创建矩形”,那么你还有一些工作要做。

您需要处理鼠标向上,向下和向下事件,跟踪鼠标按下点和当前位置之间的增量。 最后,在鼠标上移动时,您将绘制矩形。 它变得更复杂,因为你需要使用双缓冲或'xor'矩形来绘制“拖动”矩形。

这两个线程可能有所帮助:

在运行时在winform中拖动图片框

对齐网格鼠标锁定

您应该在控件的“Paint”事件中绘制它(在本例中为panel1)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM