2014-09-02 47 views
0

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

像MS油漆我希望用户能够选择在面板上绘制的部分,且其复制,移动,重规模,或者甚至将其删除。我正在考虑让用户画一个矩形&保存它的信息。然后将矩形的这些信息传递给它们,以创建一个新的位图。然后,我会在背景颜色中绘制一个新的矩形,以显示选定部分移动时所选区域被“移除”的外观。直到我意识到我不能转嫁到涂料的PaintEventArgs的变量(),这使我的想法没用使用Graphics.FromImage()这听起来不错。不知道这是否有道理,所以我很抱歉,如果这是一个混乱的混乱。

我一直在寻找一些帮助互联网,我还没有发现太多的帮助所以要么这是很容易做到的,非常困难,或“矩形选择工具”是不正确的术语。任何帮助或指针将不胜感激!感谢您的时间! :)

+0

这听起来像你写[一个“画”节目,而不是“画图”程序] (http://www.pcdon.com/deDrawingAndPaintingPrograms.html)。 MS Paint不会记住每个绘制的形状,它只是将该形状绘制到画布上,并记住画布。这就是为什么在最终完成后你无法移动矩形(你已经点击了)。如果采用相同的方法,矩形选择工具将更容易。 – Blorgbeard 2014-09-02 03:27:04

回答

0

据我所知,你实际上有Rectangle,现在想从你的油漆Panel复制一个区域。

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

然后,您可以使用DrawToBitmap来要求Panel吸取新的Bitmap;从那里,你可以DrawImageRectangle到您Panel

注意:为了与您的'Paint-Actions'列表集成,您必须现在存储该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>,例如depracated一个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; 
} 
+0

我会将ArrayList替换为List,谢谢你指出。 VS并没有给我任何警告,所以我不认为它已被弃用。问题,虽然你添加的代码。我只是保存BMP以确保我有正确的区域,但它始终从面板的左上角开始,而不是用户绘制选择矩形的位置。 – Dani 2014-09-02 17:36:54

+0

仍然支持ArrayList - .NET保留了这些内容,但是列表不鼓励使用它。 - DrawToBitmap确实描绘了整个控件。你需要使用Rectangle从它中提取正确的区域,就像我在DrawImage中完成的一样。 – TaW 2014-09-02 17:48:55

+0

我很抱歉,我不明白你的意思是从它提取正确的区域,就像你用DrawImage做的那样。我只是试图使用您提供的代码(除了我的Paint()中使用PaintEventArgs而不是CreateGraphics)并且它仍然从左上角捕获图像。我正在保存BMP,以便我可以在Windows照片查看器中查看它,以检查它是否获取图像的正确部分。我做错了什么吗? – Dani 2014-09-02 18:08:56