C# 矩形选择工具MS Paint C

C# 矩形选择工具MS Paint C,c#,selection,paint,C#,Selection,Paint,我一直致力于创建一个类似于MS Paint的程序。我有几个功能,但目前给我带来麻烦的是矩形选择工具。我的程序当前绘制面板上的所有内容,并将其保存在ArrayList中,以便可以在Paint中重新绘制每个形状 像MS paint一样,我希望用户能够在面板上选择图形的一部分,并复制、移动、重新调整大小,甚至删除它。我在考虑让用户画一个矩形&保存信息。然后将该信息作为矩形,传递它们以创建新位图。然后,我将在背景色中绘制一个新的矩形,以显示在移动选定部分时选定区域被删除的外观。这听起来还不错,直到我意识

我一直致力于创建一个类似于MS Paint的程序。我有几个功能,但目前给我带来麻烦的是矩形选择工具。我的程序当前绘制面板上的所有内容,并将其保存在ArrayList中,以便可以在Paint中重新绘制每个形状

像MS paint一样,我希望用户能够在面板上选择图形的一部分,并复制、移动、重新调整大小,甚至删除它。我在考虑让用户画一个矩形&保存信息。然后将该信息作为矩形,传递它们以创建新位图。然后,我将在背景色中绘制一个新的矩形,以显示在移动选定部分时选定区域被删除的外观。这听起来还不错,直到我意识到我不能使用PaintEventArgs变量上的Graphics.FromImage传递给Paint,这使得我的想法毫无用处。不确定这是否有意义,所以如果这是一个混乱的局面,我道歉


我一直在互联网上搜索一些帮助,但我没有找到太多帮助,所以要么这很容易做到,要么很困难,要么矩形选择工具不是合适的术语。任何帮助或指点都将不胜感激!!!谢谢你抽出时间!:

我知道您实际拥有矩形,现在希望从绘制的面板复制一个区域

这是可能的,假设您已经(应该)将所有绘画放置在面板的“绘制事件”中

然后,您可以使用DrawToBitmap要求面板将自身绘制到新位图上;从那里你可以把矩形画到你的面板上

注意:要将其与“绘制操作”列表集成,您必须现在存储位图,或者存储矩形并重新执行整个操作

using (Graphics G = panelCanvas.CreateGraphics() )
{
    Rectangle R0 = new Rectangle(22,22,55,55); // your Rectangle!
    using (Bitmap bmp = new 
           Bitmap(panelCanvas.ClientSize.Width, panelCanvas.ClientSize.Height))
    {    panelCanvas.DrawToBitmap(bmp, panelCanvas.ClientRectangle);
         G.DrawImage(bmp, 111f, 111f, R0, GraphicsUnit.Pixel);
    }
}
旁白:请务必替换ArrayList,它被新的列表(例如,列表或您的类的任何名称)删除

如果只想从面板控件中提取矩形区域,可以使用thsi功能:

public Bitmap getAreaFrom(Control ctl, Rectangle area)
{
    Bitmap bmp2 = new Bitmap(area.Width, area.Height);
    using (Graphics G = ctl.CreateGraphics())
    using (Bitmap bmp = new Bitmap(ctl.ClientSize.Width, ctl.ClientSize.Height))
    {
        ctl.DrawToBitmap(bmp, ctl.ClientRectangle);
        using (Graphics G2 = Graphics.FromImage(bmp2))
            G2.DrawImage(bmp, 0f, 0f, area, GraphicsUnit.Pixel);
    }
    return bmp2;
}

听起来像是你写的。MS Paint不会记住绘制的每个形状,它只是将形状绘制到画布上,并记住画布。这就是为什么你不能移动一个矩形,在它完成后,你点击离开。如果您采用相同的方法,矩形选择工具会容易得多。我将替换ArrayList to List,谢谢您指出这一点。VS没有给我任何关于它的警告,所以我不认为它被弃用了。不过,对于您添加的代码,请提问。我只是保存BMP以确保我有正确的区域,但它始终从面板的左上角开始,而不是从用户绘制选择矩形的位置开始。ArrayList仍然受支持-.NET保留内容,但不鼓励在列表中使用它。-DrawToBitmap确实绘制了整个控件。你需要使用矩形从中提取正确的区域,就像我在DrawImage中所做的那样..对不起,我不明白你从矩形中提取正确的区域是什么意思,就像你在DrawImage中所做的那样。我只是尝试使用您提供的代码,除了在我的面板绘制中使用PaintEventArgs而不是CreateGraphics之外,它仍然从左上角捕获图像。我正在保存BMP,以便可以在Windows照片查看器中查看它,以检查它是否获得图像的正确部分。我做错什么了吗?啊!它保存了正确选择的部分!完美的离实现此选择工具又近了一步。祈祷我不用再问别的问题了。非常感谢您对TaW的所有帮助,这是您在我的项目中帮助我的第二个问题