我可以用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);
}
答案 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()调用时),你经常会遇到非持久性的问题。
更新:这是另一个答案,其中有一个更详细的示例,说明了点击鼠标的位置:
答案 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'矩形来绘制“拖动”矩形。
这两个主题可能有所帮助:
答案 3 :(得分:0)
您应该在控件的“Paint”事件中绘制它(在本例中为panel1)。