C# 使用System.Drawing.DrawRectangle绘制选择矩形以选择对象

C# 使用System.Drawing.DrawRectangle绘制选择矩形以选择对象,c#,.net,winforms,drawing,system.drawing,C#,.net,Winforms,Drawing,System.drawing,我有一个Windows窗体应用程序,需要能够选择窗体上的对象,就像通过左键单击并拖动文件在桌面上选择文件一样,如下所示: 我有下面的代码,我自己写的,但它是可怕的。这是不对的。我现在不太担心它的“选择”部分,我主要关心的是我如何像这样画画 private void splitContainer1_Panel1_MouseMove(object sender, MouseEventArgs e) { if (mouseDown) { // TODO: Draw R

我有一个Windows窗体应用程序,需要能够选择窗体上的对象,就像通过左键单击并拖动文件在桌面上选择文件一样,如下所示:

我有下面的代码,我自己写的,但它是可怕的。这是不对的。我现在不太担心它的“选择”部分,我主要关心的是我如何像这样画画

private void splitContainer1_Panel1_MouseMove(object sender, MouseEventArgs e)
{
    if (mouseDown)
    {
        // TODO: Draw Rectangle (so you can select elements on the canvas).


        Graphics graphics = Graphics.FromHwnd(splitContainer1.Panel1.Handle);
        graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

        Pen pen = new Pen(Color.SlateBlue, 0.5f);

        graphics.PageUnit = GraphicsUnit.Pixel;

        graphics.DrawRectangle(pen, e.X, e.Y, (e.Location.X + e.X) - lastCursorLocation.X, (e.Location.Y + e.Y) - lastCursorLocation.Y);
    }
}
更新

私有void splitContainer1_Panel1_Paint(对象发送器,PaintEventArgs e) { //TODO:绘制矩形(以便可以在画布上选择元素)


在将代码放入Paint事件并调用Invalidate()后,表单上根本没有绘制任何内容。我显然做了一些错误的事情,但是什么呢?

检查以下线程。您要查找的是一个称为
橡皮筋的


我最终使用了在Microsoft Connect网站上找到的一些代码:


不要这样做。相反,处理
绘制事件并重新绘制所有内容。@SLaks,谢谢,但我不明白。如果我处理窗体或面板的绘制事件,如果没有MouseDown/MouseMove事件,它如何知道何时要拖动?调用
Invalidate()
若要强制重新绘制。@还有,当您无法从面板1_Pain()中访问e.X或e.Location时,我如何绘制矩形并控制其移动方式方法?您的屏幕截图是工具箱中已有的控件。它是一个ListView,不需要任何努力就可以让它选择这样的项,它是自动的。如果您实际上没有使用ListView,那么您需要明确说明什么是“项”在面板上,如果它们实际上是控件,则会变得更加困难,这需要覆盖。另一个窗口在现有控件的顶部显示矩形。我写了一个。链接已经死了,没有它的答案是无用的。考虑将相关信息编辑成答案。
        Graphics graphics = Graphics.FromHwnd(splitContainer1.Panel1.Handle);
        graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

        Pen pen = new Pen(Color.SlateBlue, 0.5f);

        graphics.PageUnit = GraphicsUnit.Pixel;

        graphics.DrawRectangle(pen, 1, 1, 1, 1);

        Invalidate();
    }