鼠标单击时绘制一个矩形

时间:2010-03-27 14:12:21

标签: c# winforms drawing

我可以用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);
}

4 个答案:

答案 0 :(得分:12)

已修改版本:

没有太多假设你想要做的事情:

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();
    }
}

您的代码无法正常工作,因为它正在窗口上绘制矩形(此),然后您的面板会隐藏绘制的矩形。

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

修改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();
    }
}

答案 1 :(得分:3)

尝试使用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()调用时),你经常会遇到非持久性的问题。

更新:这是另一个答案,其中有一个更详细的示例,说明了点击鼠标的位置:

how to draw drawings in picture box

答案 2 :(得分:1)

  
    

我可以用鼠标点击绘制一个矩形吗?

  

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

        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'矩形来绘制“拖动”矩形。

这两个主题可能有所帮助:

dragging picturebox inside winform on runtime

Snap to grid mouse locking up

答案 3 :(得分:0)

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