矩形选择类似工具MS Paint C#

本文关键字:MS Paint 工具 选择 | 更新日期: 2023-09-27 18:20:28

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

就像MS paint一样,我希望用户能够在面板上选择绘图的一部分,然后复制、移动、重新调整大小,甚至删除它;保存它的信息。然后获取矩形的信息,传递它们以创建新的位图。然后,我会在背景色中绘制一个新的矩形,以使所选区域在移动所选部分时看起来"被移除"。这听起来还可以,直到我意识到我不能在传递给Paint()的PaintEventArgs变量上使用Graphics.FromImage(),这让我的想法变得毫无用处。不确定这是否有意义,所以如果这是一个混乱的局面,我很抱歉。

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

矩形选择类似工具MS Paint C#

我知道您实际上有Rectangle,现在想从绘制的Panel复制一个区域。

这是可能的,假设您已经将所有绘画放置在PanelPaint事件中。

然后,您可以使用DrawToBitmap来要求Panel将自己绘制到新的Bitmap上;从那里你可以DrawImageRectangle到你的Panel

注意:要将其与"绘制操作"列表集成,您必须立即存储该Bitmap或存储Rectangle并重做整个操作。

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替换为新的List<T>,例如List<PaintAction>或您的类的任何名称!

如果你只是想从面板控制中提取矩形区域,你可以使用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;
}