2013-08-07 6 views
1

이 사이트와 다른 사이트에서 많이 묻는 것을 보았습니다. 그러나 아직 답을 찾지 못했습니다. 내가 뭘하려는 건지 대략 10x10 크기의 직사각형을 연속으로 그립니다. 그래서 버튼이, 내가 그것을 클릭하면, 그것은패널 내부 드로잉

xgraphics = pnlContainer.CreateGraphics(); 
xgraphics.FillRectangle(new SolidBrush(Color.Red), xAxis, yAxis, 10, 10); 
pnlContainer.AutoScrollPosition = new Point(Convert.ToInt32(xAxis),Convert.ToInt32(yAxis)); 
yAxis += 10; 

그것은 다음 사각형을 만들어 또 다른 사각형 생성을 클릭 다음에, 아래로 이동하여 내 패널 내부에 사각형을 만듭니다 가지고 있지만 지금은 등 아래쪽과의 기타 등등. 나는 여기에 autoscoll이있는 패널 안에 패널을 놓아서 화면을 스크롤하는 방법과 바닥에 도달했을 때 내부 패널의 높이를 올리는 방법에 대해 읽었습니다. 그것은 대단한 작품 !! 패널 스크롤바가 나타나면 모든 그래픽이 지워집니다.

나는 이것을 사용하여 invalidate(); 하지만 이렇게하면 그래픽을 사각형으로 변환 할 수 없다는 오류가 발생합니다. 그래서 F 무엇?

나는이 작업을 수행 할 수 MSDN에서 볼

:

private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) 
{ 

    // Draw the rectangle... 

    e.Graphics.DrawRectangle(new Pen(Color.Blue, PenWidth), RcDraw); 

} 

그러나,이 내 상황에서 작업을 못해 마우스를 사용하여 사각형을 만듭니다. 간단히 말해 패널에 직사각형을 만들 수 있어야합니다. 패널이 맨 아래에 오면 스크롤하고 더 많은 직사각형을 추가 할 수있게됩니다 ... 그다지 힘들지는 않지만, 근본적인 것 또는 무엇인가 놓치고 있고, 그것은 정말로 나의 기어를 갈기 시작하고있다! 도와주세요!

+0

컨트롤에 직접 칠하는 경우 컨트롤을 다시 칠하거나 페인트를 잃을 때마다 페인트 처리기에서이 작업을 수행해야합니다. 재사용 할 때 다시 채 웁니다. 덮어 쓴 다음 덮어 씌우면됩니다. 비트 맵에 페인팅을 한 다음 페인트 메서드의 컨트롤에 blit합니다. – Blorgbeard

답변

1

Paint 이벤트가 아닌 곳에서는 Graphics 속성을 사용하는 것은 좋지 않습니다. 새로 고침을 한 후에 칠한 것을 잃고 싶지 않으므로 필요할 때마다 페인트해야합니다 (즉, Paint 이벤트에 있음). 다음이 이미지 패널의 BackGroundImage 속성을 설정

먼저는, Image 만들기 이미지에서 Graphics을 얻고 여기에 항목을 그릴 : 그래서 당신은 두 가지 선택이있다. 이렇게하면 그림을 엉망으로 만들지 않고 컨트롤 자체에 넘겨 줄 수 있습니다.

두 번째 드로잉 직사각형에 필요한 데이터를 폼의 범위에있는 변수에 저장하십시오.

private List<Rectangle> myrects=new List<Rectangle>; 

    private void childPanel_Paint(object sender, System.Windows.Forms.PaintEventArgs e) 
    { 
     e.Graphics.FillRectangles(Brushes.Red, myrects.ToArray()); 
    } 

당신이

언급 스크롤 트릭을 사용하는 경우 자식 패널이를 포함해야합니다 : 당신은 필요할 때마다 Paint 이벤트에 그들을 잡아 다음, 각 클릭에 List 그들에게 Add Rectangle의의 등을 사용할 수있다
+0

bleh, 나는 그 것을 두려워했다. ... 나는 그것을 부를 수있을만큼 어떻게 그 예를 수업에 집어 넣을 것인가? 나는 끌기를하기 위해 데이터를 전달하는 드로 클래스를 가지고 있습니다. 수동 그리기는 발신자와 페인트 이벤트를 전달하면됩니까? 배열을 생성자에 전달할 수있게하려면 페인트 void (사용자의 예)를 호출하고 그리기를 수행합니다. 그게 효과가 있어야합니다 ... 나는 이미지를 만드는 것이 더 쉬운 방법이 될 것이라고 생각합니다. 나는 단지 그것이 비행 중에 생성되기를 정말로 원했습니다. –

+0

방금 ​​시도 : public float yAxis; 개인 무효 pnlBlackBoard_Paint (객체 발신자가있는 PaintEventArgs E) {위한 는 (나는 10 <; I = 0 int로 난 ++) { e.Graphics.FillRectangle (Brushes.Red, 10F, y 축, 10F, 10F); yAxis + = 10f; pnlBlackBoard.Height + = 10; pnlBlackBoard.Invalidate(); 대략 당신이 준 예이다} } 하지만,하지만 최대한 빨리 다시 삭제됩니다 화면을 스크롤 ..... –

+0

이'pnlBlackBoard.Invalidate()가'문제가있다. 'Invalidate()'메쏘드가 프로그램의 ** Other ** 프로 시저에서 호출되어'Panel'에 ** Repaint **를 알립니다. 루프를 생성하기 때문에'Panel_Paint()'이벤트에 이것을 포함해서는 안됩니다. 'yAxis'는 무엇인가? – ehsan88