2010-08-18 3 views
0

C#에서는 WinBox에서 PictureBox를 사용하고 있습니다.C# 그래픽 덮어 쓰기 중

MSPaint를 다시 만들어서 그래픽 개체에 대해 배우려고합니다. 그것은 다른 모든 창이 PictureBox 위에있을 때 또는 전체 양식의 크기가 변경 될 때 거기에있는 다른 창 아래에 그려지는 것은 제거된다는 점을 제외하고는 모두 잘 작동합니다.

다음은 내가 작업하고있는 코드의 축소 버전입니다.

private Graphics _g; 
private bool _bIsMouseDown = false; 

private void picCanvas_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (!_bIsGraphicsSet) _g = picCanvas.CreateGraphics(); 
    _bIsMouseDown = true; 
    DrawRectangle(e); 
} 

private void picCanvas_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (_bIsMouseDown) DrawRectangle(e); 
} 

private void picCanvas_MouseUp(object sender, MouseEventArgs e) 
{ 
    _bIsMouseDown = false; 
} 

private void DrawRectangle(MouseEventArgs e) 
{ 
    System.Drawing.Rectangle r = CreateRectangle(e); 
    Pen pen = ChooseDrawColor(); 
    _g.DrawRectangle(pen, r); 
} 

private Rectangle CreateRectangle(MouseEventArgs e) 
{ 
    int h = 10; 
    int w = 10; 
// there is code in here for multiple sized rectangles, 
//I know the math can be simplified for this example. 
      return new Rectangle(e.X - (w/2), e.Y - (h/2), w, h); 
     } 

어떤 생각이라도 대단히 감사하겠습니다.

답변

3

당신이 창문에 그림을 그리지 않았기 때문에, 당신은 단지 창문이있는 화면을 그리는 것입니다.

그림을 그리려면 Paint 이벤트를 사용해야합니다. 반복 할 수 있도록 명령 목록이나 비트 맵 이미지로 어떤 방법으로 그리는 것을 저장해야합니다.

무언가를 그리려면 명령 목록에 추가하거나 비트 맵에 그려야합니다. 그런 다음 Paint 이벤트가 호출되도록 컨트롤을 무효화하십시오. Paint에서도 실제 그림을 그리는 코드를 추가합니다. 즉, 목록에 명령을 반복하거나 비트 맵을 컨트롤에 그립니다.

1

모든 그리기 코드를 Paint 이벤트 처리기로 이동해야합니다. 마우스 이벤트 핸들러에서 새 이미지 상태를 반영하는 변수를 설정하고 창을 무효화하십시오. 이 샘플을보십시오 : http://www.codeproject.com/KB/graphics/drawtools.aspx

1

나는 당신이 그림을 그 그림 이벤트가 페인트 이벤트에 다시 칠해진다는 것을 생각합니다.

  • 스토어 클래스의 구성원으로 사진의 일부 추상 표현 :

    나는 보통 사용자 정의 페인트 작업을 관리하는 가지고 접근 방식이있다. 나는 당신의 경우, 그것은 모양, 비트 맵, 또는 등등의 모음 수 있습니다.

  • 컨트롤을 확장하는 경우 OnPaint 메서드 또는 Paint 이벤트 처리기를 재정의하고 위에 저장된 데이터를 사용하여 드로잉 단계를 반복합니다.
  • picCanvas_MouseDown과 같은 업데이트가 필요한 이벤트의 경우 컨트롤에서 Invalidate()을 호출하여 다시 그리도록합니다.

resize 이벤트가 무효화되므로 페인트 루틴이 호출되어 그림이 변경되지 않은 상태로 유지됩니다.

0

도면을 저장할 이미지를 만들 수 있습니다.

private Bitmap _drawBuffer; 

... 

_drawBuffer = new Bitmap(pictureBox.Image); 
_g = Graphics.FromImage(_drawBuffer)); 

... 

private void DrawRectangle(MouseEventArgs e) 
{ 
    System.Drawing.Rectangle r = CreateRectangle(e); 
    Pen pen = ChooseDrawColor(); 
    _g.DrawRectangle(pen, r); 
    pictureBox.Image = _drawBuffer; 
} 

Image.Save 기능을 사용하여 이미지를 저장할 수있는 장점이 있습니다. 크기를 조정할 때 비트 맵의 ​​크기를 조정해야합니다.