2014-09-02 46 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