본문

SWT에서의 GC, Drawable, Canvas #1. 설명

Graphic Context :
Control 위에서 그림판같은 기능을하여, 모양, 이미지, 텍스트를 GUI 컴포넌트에 추가한다. 또한 Control의 외관이 갱신될 때 관련 이벤트를 처리한다. SWT/JFace에서는 Graphic Context를 GC 클래스에서 캠슐화하며, GC 객체는 기존 Control과 연동하여 그래픽을 추가할 수 있도록 한다. 무엇보다도 Graphic Context를 생성 후 이를 컴포넌트에 연결해야 하는데 GC 생성자 메소드[GC(Drawable)]는 이 작업을 대신 수행해준다. 



이때 Drawable 인터페이스를 구현하는 객체를 요구하는데, 이 인터페이스는 Graphic Context의 내부와 연관되는 메소드를 포함한다. SWT에서는 Drawable 객체를 구현하는 클래스로 Image, Device, Control의 세가지 클래스를 제공한다. 만약 자신만의 고유한 Drawable 객체를 생성하지 않는다면, SWT에서 제공하는 Drawable을 구현한 클래스나 그 하위 클래스의 인스턴스에만 그래픽을 덧붙일 수 있다. 여러 클래스등 중 GC 객체에 적합한 클래스는 Canvas로서, 다른 컨트롤을 포함하는 Composite의 속성을 가지고 있으면서 동시에 그래픽을 해당 영역에서 어떻게 보여줄지를 결정하는 여러 도구를 사용하여 자신만의 모양을 만들  수 있다.

만약 쉘을 가리거나 최소화 될 때마다 그 도형들이 지워지게 되는데, 이는 윈도우가 변화하더라도 그래픽은 유지되게 하는 작업을 해줘야 하며, SWT에서는 Drawable객체가 갱신될 때의 처리(Painting이라 한다)를 개발자가 직접 다루어야 한다는 의미를 갖는다. 

GC 메소드가 Drawable 객체에 그림을 그릴때, 페인팅 프로세스를 단 한번만 수행하므로, 만약 사용자가 그 객체의 크기를 재조정하거나 다른 윈도우로 Drawable 객체를 가리면, 그 객체의 그래픽은 지워진다. 이러한 외부 이벤트를 PaintEvent라 하며, 이러한 이벤트를 받는 인터페이스를 PaintListener라고 한다. Control은 애플리케이션에서 출력할 내용이 바뀌거나 외부동작에 의해 화면에 그린 내용이 영향을 받읐을 때, PaintEvent를 발생시킬 수 있다. PaintListener는 단 하나의 이벤트만 갖기 때문에, 어댑터 클래스는 필요하지 않다.

PaintListener를 사용하는데 있어서 흥미로운 부분은 각 PaintEvent 객체가 자신만의 GC를 갖는다는 것이다. 이것이 중요한 이유에는 두가지가 있는데, 첫째로, 이벤트가 GC 인스턴스를 생성하므로 PaintEvent는 이 인스턴스의 해제 또한 관리해야한다. 둘째, 애플리케이션은 쉘을 열기 전에 GC를 생성할 수 있는데, 이는 그래픽이 별도의 클래스에서 설정될 수 있다는 것을 의미한다.

SWT는 PaintListener에의한 페인팅에 최적화 되어있으며, 또다른 이유로 그래픽을 갱신해야 한다면 redraw()메소드를 사용하는것이 좋다. redraw()메소드로 페인트요청을 큐에 추가한 후에 update()메소드를 호출하여, 그 컨트롤 객체와 연관된 모든 페인팅 요청을 처리할 수 있다. 

기본적으로 Graphic Context로 그릴 수 있는 영역은 연결된 Control의 영역과 같다. 하지만 GC는 그래픽 영역의 경계를 지정하는 메소드를 제공하는데, 이 영역을 Clipping 영역이라 한다. setClipping()메소드는 GC의 그래픽을 위한 제한범위를 명시하고, getClipping()메소드는 클립핑 영역의 좌표를 반환한다.

Clipping 개념이 중요한 다른 경우는 PaintEvent를 다룰 때인데, 이 이벤트는 Drawable 객체를 다른 윈도우가 가릴때마다 발생될 뿐만 아니라, 가려진 영역의 정보를 유지한다. 즉, 사용자가 Canvas의 일부를 두번째 윈도우로 덮을 경우, PaintEvent가 어떤부분이 잘려졌는지를 알아내어 x, y, height, width 필드를 설정한다. (가려진 영역을 둘러쌀 수 있는 가장 작은 사각형 영역) 이로서 다시 그리는 부분을 전체 객체가 아니라 잘린 영역으로 한정할 수 있다.


출처 : SWT/JFace 인 액션 




================ 
GUI 부분인 만큼 역시 MFC 와는 큰 개념적 차이는 보이지 않는다. PaintEvent는 MFC에서의 WM_PAINT와 매우 유사하다. 또한 가려진 부분이라고 명시해 놓은 것 역시 무효화 영역(Invalid Region)이라는 단어를 사용할 수 있고, 이부분을 갱신하는 행위에서는 위에서의 Clipping 개념을 사용하여 시스템에 큰 부하 없이 효과적인 화면 갱신이 가능하다. 다음 포스팅에서는 실제로 동작하는 SWT 소스와 주석을 올려놓을 예정이다.

댓글

Holic Spirit :: Tistory Edition

design by tokiidesu. powerd by kakao.