鼠标单击时绘制一个矩形

Din*_*inu 10 c# drawing winforms

我可以用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);
}
Run Code Online (Sandbox Code Playgroud)

Axe*_*ger 13

编辑版:

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

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

您的代码无效,因为它在窗口上绘制矩形(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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @roygbiv:OP之后解决方案不正确(参见我的第一行).解决方案是否最佳......这取决于原作者的要求.对于1.)你是对的,应该处理对象.对于2.)你也是对的......但这是否要求矩形保持存在?不能在OP中看到. (2认同)