레이블이 net인 게시물을 표시합니다. 모든 게시물 표시
레이블이 net인 게시물을 표시합니다. 모든 게시물 표시

2010년 6월 19일 토요일

VisualBrush와 RenderTargetBitmap

 

WPF에서 쓰이는 화면에 보이는 UIElement들은 제 각각 Visual 이라는 객체를 상속받아 만들어지는데 이들은 스스로 자신을 화면에 그릴수 있는 기능이 있다. 따라서 Visual의 이 기능을 이용하여 다음과 같이 재밌는 일을 할수 있다. (미리보기등을 이러한 방법으로 만들수 있다.)

 

Clone 화면 만들기

VisualBrush를 이용하면 Visual의 화면 이미지를 실시간으로 복제하여 Brush를 필요로 하는 위치에 그려주게 된다. 내부적으로 브러시의 원본 객체의 surface 를 복제함으로서 이루어진다.

 

 

  1. VisualBrush brush = new VisualBrush(this.DrawingCanvas);
  2. Rectangle rect = new Rectangle();
  3.  
  4. rect.Width = this.DrawingCanvas.ActualWidth;
  5. rect.Height = this.DrawingCanvas.ActualHeight;
  6. rect.Fill = brush;

    Window wd = new Window();
  7. wd.Content = rect;

 

 

마치 클론 화면을 쓰는 것처럼 쉽게 복제된 화면을 여러개 만들수 있다. 원본 화면에서 뭔가 일어나면 다른 화면에서도 똑같이 발생한다.



화면의 특정부위 스샷찍기

화면을 복제하는 것보다, 그때 스샷을 찍고 싶을때가 있다. 특히 원하는 컨트롤 또는 부위에 대해서. 이런때엔 RenderTargetBitmap을 이용하면 간단히 해결된다. 이때엔 별도의 Bitmap이미지를 생성한후 객체의 Visual 화면을 BitBlt 하여 복제한다. 단, 이때엔 새로만들어지는 비트맵의 색상 또는 dpi를 지정해 줄수 있는데 이를 이용하여 성능을 조절할 수 있다.

 

 

  1. RenderTargetBitmap rtb = new RenderTargetBitmap((int)this.DrawingCanvas.ActualWidth, (int)this.DrawingCanvas.ActualHeight, 100, 100, PixelFormats.Default);
    rtb.Render(this.DrawingCanvas);

    Window testWin = new Window();
    testWin.Width = this.DrawingCanvas.ActualWidth;
    testWin.Height = this.DrawingCanvas.ActualHeight;
    (testWin.Content as Image).Source = rtb;

    testWin.Show();

 

 

현재 화면을 복제하고, 원본 화면이 바뀌더라도 현재 화면을 유지한다.

 

 

 

 

이 글은 스프링노트에서 작성되었습니다.