鼠标单击时绘制一个矩形

我可以用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, eX, eY, 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)。