티스토리 뷰

Windows 8

[Windows 8] Size와 Orientation의 변화 감지

생각많은 소심남 2012. 7. 15. 23:36

MSDN Magazine의 전신인 Microsoft System Journal 에 소개되었던 가장 최초의 프로그램은 WHATSIZE라는 프로그램입니다. 이 프로그램의 역할은 단순하게 지금 띄워져 있는 창의 크기를 보여주는 역할을 했고, 그 창의 변화를 감지해서 크기를 실시간으로 알려줍니다. 그 때 당시에는 WM_PAINT라는 API가 있어서 WHATSIZE로부터 받은 데이터를 화면에 그대로 뿌려줬었다고 합니다.

 Windows 8 API를 구성하고 있는 WinRT는 그 때와는 조금 다른 방식으로 글자를 화면상에 뿌려줍니다. 그 때 처럼 직접적으로 원할 때 화면상에 글자를 적는 것이 아니라 실질적으로는 (물론 .net에서는) TextBlock을 삽입함으로써 표현할 수 있습니다. 다른 요소들도 직접적으로 그걸 그리는 형식이 아니라 그걸 구성하고 있는 요소를 화면상에 삽입하고 속성값을 조절하면서 원하는 개체를 생성할 수 있습니다. 이번 포스트에서 해볼 것은 위와 같은 개체들을 활용해서 WHATSIZE를 구현해보는 예제를 해보고자 합니다. 우선 사전에 알아야 할 내용은 실시간으로 사이즈 변화를 감지하는 이벤트가 OnPageSizeChanged라는 이름으로 정의되어 있다는 겁니다. 프로젝트를 하나 생성하고 그 안의  Grid안에 다음과 같이 작성합시다.

 

오타입니다 heightText입니다..

여기서 중간중간에 나오는 &#x21A... 같은 건 특수기호에 대한 코드를 삽입할때 사용합니다. 물론 저런식이 아니라 그냥 TextBlock으로 들어가서도 표현할 수 있습니다. 위와 같이 쓴 이유는 줄간의 간격을 띄워주는 Line Break를 사용하기 위함입니다. 그런데 막상 이렇게 하면 글자 크기가 너무 작습니다.

 

 

물론 위와 같은 경우는 개체가 두개만 있기 때문에 간단히 Fontsize를 변경하면 되긴 하지만 만약 개체가 많다면 한꺼번에 바꾸기가 힘들겁니다. 이때는 전체 페이지의 속성값을 변경시켜서 한꺼번에 적용시킬 수 있습니다. 다음과 같이 Page 정의단에 FontSize를 삽입합니다.

 

 

물론 위와 같이 하면 다른 변화를 줘야할 텍스트도 같이 커지게 됩니다. 그 대신 개체 속성으로 먼저 정의해둔 것의 영향을 받기 때문에 그런 것에 대한 상관관계를 잘 유념하셔서 전체 속성을 지정하시면 될거 같네요. 자 이제 이벤트 삽입입니다. 앞에서도 언급했다시피 이번에 삽입할 이벤트는 OnPageSizeChanged 입니다. Page를 선택한 상태에서 지난 시간에 계속 했던 것처럼 이벤트를 삽입합니다.

 

 

이제 cs 코드를 보면 해당 이벤트에 대한 정의가 되어 있습니다. 거기에 크기에 대한 화면 출력코드를 작성하면 됩니다. 물론 앞에서 x:Name을 통해서 각각에 대한 이름을 정의했습니다. 그걸 표현해주면 되겠지요. 여기서 발생하는 이벤트 개체중에 NewSize를 적용하고 합니다.

 

해당 개체를 삽입함으로써 새로운 사이즈가 정의되었을 때 그 사이즈에 대한 정보를 얻을 수 있습니다.

 

  자 결과는 다음과 같습니다.

 

 

1920x1080 이상의 해상도에서는 조금 비정상적으로 메세지가 출력됩니다. 왠지 버그일거 같습니다. 아무튼 피벗을 했을 때에서 해당 Text가 실시간으로 변화하는 것을 확인할 수 있습니다. 그런데 지난 시간에 이야기 했던 Tap과 동일하게도 Xaml 상에서 해당 이벤트를 구현하지 않아도 됩니다. 그냥 MainPage가 intialize될때 같이 호출시키면 size가 변할 때 해당 이벤트가 발생하게 됩니다. xaml 상에서 Page_SizeChanged를 제거하고 다음과 같이 cs파일에만 코드를 삽입합니다.

역시 기존과 마찬가지로 이 상태에서 Tab 키를 두번 눌러주면 해당 이벤트가 자동으로 생성됩니다. 역시 생성한후 다음과 같이 채워주면 됩니다.

 

어떻게 보면 이런식으로 이벤트를 생성하는 편이 조금더 관리측면에서 깔끔하지 않을까 생각됩니다.

 

댓글