[英]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'矩形来绘制“拖动”矩形。
这两个线程可能有所帮助:
您应该在控件的“Paint”事件中绘制它(在本例中为panel1)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.