2014-09-02 2 views
0

나는 MS Paint와 유사한 프로그램을 만드는 중입니다. 나는 몇 가지 기능을 가지고 있지만 현재 나에게 문제가되는 것은 직사각형 선택 도구이다. 내 프로그램은 현재 패널에 모든 것을 그려서 ArrayList에 모두 저장하므로 각 도형을 Paint()에 다시 그릴 수 있습니다.직사각형 선택 도구 MS 그림판 C#

MS 페인트와 비슷합니다. 사용자가 패널에서 그림의 단면을 선택하고 복사하거나, 이동하거나, 크기를 조정하거나, 삭제할 수 있기를 바랍니다. 나는 사용자가 그것에 대한 정보를 저장하는 사각형 &을 그리게하는 것에 대해 생각하고 있었다. 그런 다음 사각형에 대한 해당 정보를 가져 와서 새 Bitmap을 만듭니다. 그런 다음 선택한 부분을 이동할 때 선택한 영역이 "제거 된"것처럼 보이게하려면 배경색에 새 사각형을 그립니다. 내 생각을 쓸모 없게 만든 Paint()에 전달 된 PaintEventArgs 변수에 Graphics.FromImage()를 사용할 수 없다는 것을 알기 전까지는 괜찮 았습니다. 혼란스러운 혼란이 있다면 그렇게 사과 할 지 모르겠다.

저는 인터넷을 통해 도움을 구하고 있습니다. 도움을 많이 얻지 못 했으므로 매우 쉽거나 매우 어렵거나 "직사각형 선택 도구"가 적절한 용어가 아닙니다. 어떤 도움이나 포인터를 크게 주시면 감사하겠습니다 !!! 시간 내 주셔서 감사합니다! :)

+0

그것은 소리 [A "그릴"프로그램, 오히려 "페인트"프로그램을보다] (http://www.pcdon.com/deDrawingAndPaintingPrograms.html). MS Paint는 그려진 각 도형을 기억하지 않고 캔바스에 도형을 칠하고 캔버스를 기억합니다. 그렇기 때문에 사각형을 완성한 후에는 사각형을 움직일 수 없습니다 (멀리 클릭 한 것). 직사각형 선택 도구는 동일한 접근 방식을 취하면 ** 많이 ** 쉬울 것입니다. – Blorgbeard

답변

0

실제로 나는 Rectangle을 가지고 있으며 이제 채색 된 영역 Panel을 복사하고 싶습니다.

PanelPaint 이벤트에있는 모든 그림을 배치해야한다고 가정하면 가능합니다.

그런 다음 DrawToBitmap을 사용하여 Panel에 새로운 Bitmap에 그려달라고 요청할 수 있습니다. 여기에서 DrawImageRectanglePanel에 붙여 넣을 수 있습니다.

참고 : '페인트 작업'목록과 통합하려면 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); 
    } 
} 

: 새로운 List<T>, 예를 들어,에 의해 depracated하는 ArrayList를 대체 마십시오 List<PaintAction> 또는 클래스 이름이 무엇이든간에!

당신은 단순히 당신이 thsi 기능을 사용할 수있는 패널 컨트롤에서 rectanglular 영역을 추출 할 경우 : 당신이 쓴 것처럼

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

+0

ArrayList는 여전히 지원됩니다. .NET은 일을 계속하지만 목록 에 대해서는 사용하지 않는 것이 좋습니다. DrawToBitmap은 실제로 모든 컨트롤을 그립니다. DrawImage에서했던 것처럼 Rectangle을 사용하여 오른쪽 영역을 추출해야합니다. – TaW

+0

미안하지만, DrawImage로 어떻게했는지와 같은 올바른 영역을 추출하여 무슨 뜻인지 이해할 수 없습니다. 방금 제공 한 코드 (CreateGraphics 대신 내 패널의 PaintEventArgs (PaintEventArgs) 사용)를 사용하려고했지만 여전히 왼쪽 상단 모서리에서 이미지를 캡처했습니다. BMP를 저장하므로 Windows Photo Viewer에서 이미지의 오른쪽 부분을 확인하는지 확인할 수 있습니다. 내가 뭔가 잘못하고 있니? – Dani