윈도우 8.1 에서의 장치 독립적 코드 작성을 위한 DPI 설정 방법 :: iopeni - Think of C#

Control 클래스는 Control의 위치와 크기를 지정하기 위해서 사용하는 Location 과 Size라는 두 개의 Property를 정의 하고 있습니다.


Location Property 는 Point Structure Type 으로 X 와 Y라는 두개의 int type field를 포함 합니다. 단위는 Pixel 입니다. Location Property 는 부모의 왼쪽 위 모서리로 부터 떨어진 상대적인 위치를 가리킵니다.


Size Property 는 width와 height라는 두개의 field를 포함하는 Size Structure Type 이며, Pixel단위로 컨트롤의 크기를 지정 합니다.


다들 아시겠지만 SizeF 구조체는 실수형 타입 입니다.


모든 윈도우 폼은 폼이 가지고 있는 모든 컨트롤을 표시 할 수 있어야 하며, 이것은 결국 장치 독립적 폼으로 디자인 되어야 한다는 것을 의미 합니다. 

즉 개발자가 가진 노트북에서는 모든 컨트롤을 다 표시 할 수 있으나 다른 모니터로 이동하게 되면 모든 내용이 다 표시 되지 않는 사태가 발생 될 수 있으며 이런 것을 방지 하기 위한 것 입니다. 결국 예전의 모든 해상도에 맞게 또는 모든 모니터 디바이스에 맞게 폼을 다시 디자인 했었을 수도 있었을 것입니다. 이런 일들 정말 힘들고 고된 일들이죠. 저에겐 아직도 장치 독립적 이라는 주제가 어렵게 느껴집니다. 결국 저는 초딩 때 산수 공부를 정말 안한것 같습니다.


프린터는 기본적으로 300 dpi(dot per inch : 인치 당 dot(점) 의 수), 600 dpi, 또는 1200 dpi 와 같은 장치 해상도가 있는 것 처럼 비디오 디스플레이에도 특정한 장치 해상도를 가지고 있습니다. 윈도우 7 까지는 기본 해상도로 96 dpi가 사용 되었으나 윈도우 8 부터는 기본 해상도로 120 dpi가 사용 되고 있습니다.


윈도우 8.1을 설치 하고 난뒤 모든 것들이 전부 크게 보여 참 당혹스러워 했던 기억이 있습니다.


제가 가진 노트북의 Display panel은 물리적으로 15.7 인치의 사이즈 이며 이 사이즈 안에 1920 * 1080 (pixel)으로 이루어 져 있습니다. 


다른 환경에서 같은 것을 경험한다는 것은 참 어려운 일인듯 합니다만 마이크로소프트는 다른 사용자가 각기 다른 디바이스들에서 같은 윈도우 화면을 경험하게 하고자 했던 것 같습니다.


윈도우 8.1에서 이 dpi를 설정 하는 방법을 알아 보도록 하죠.


우선 바탕화면에서 마우스 오른쪽 버튼을 클릭하여, 개인설정을 표시 합니다.




개인 설정이 표시 되면 좌측 하단의 디스플레이를 클릭 합니다.


다음 화면에서 우리는 dpi 설정을 할 수 있습니다.



작게 - 100%(S)                 : 96  dpi (pixel / dot per inch)

보통(M) - 125%(기본값)      : 120 dpi (pixel / dot per inch)

크게 - 150%(L)                 : 144 dpi (pixel / dot per inch)


사용자 지정 크기 조정 옵션을 선택 하면 좀 더 다양한 Scale 을 지정 할 수 있습니다.


Windows Form Program 은 Graphics 클래스의 DpiX 와 Dpi Property를 사용하여, 비디오 디스플레이를 포함한 모든 그래픽 출력 장치의 해상도를 얻을 수 있습니다.


Windows Forms의 기본 글꼴은 약 9 Point 입니다. (포인트는 1/72 인치를 나타내는 측정 단위 입니다.) 이 값은 Font 클래스의 SizeInPoints로 구할 수 있습니다. 


장치 독립적인 프로그래밍을 위한 가장 근본이 되는 기초 이론을 살펴 보았지만.. 역시 이건 너무 어렵네요... 그냥 이런게 있다는 것 정도만.... OTL.....


Microsoft 의 Visual Studio는 AutoScaleDimensions 와 AutoScaleMode Property 를 사용하여 장치 독립적인 기능을 지원하고 있습니다. 이 Property들은 ContainerControl Class에 정의 되어 있습니다.

이 클래스는 Control클래스를 상속 받았으며, Form 클래스는 ContainerControl  클래스를 상속 받습니다.


AutoScaleMode Property 는 AutoCaaleMode Enum Value를 받습니다. 이 열거형은 다음과 같이 정의 되어 있습니다.


public enum AutoScaleMode

    {

        None,

        Font,

        Dpi,

        Inherit

    }


만약 AutoScaleMode 속성을 AutoScaleMode.Font로 설정 한다면, Form 클래스는 폼의 Font 속성에서 지정한 크기 비율(Font 의 크기 비율은 Font.height에 비해 Font.width 는 대략적으로 1/2의 비율 크기를 갖습니다.)에 따라서 모든 크기를 AutoScaleDimresions속성에서 지정한 배율 크기로 조절할 것입니다. 만약 윈도우가 96 DPI의 작은 배율로 설정 되어 있다면, VisualStudio는 다음과 같은 두 문장을 자동으로 추가 할 것입니다.


this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;


만약 디스플레이 해상도를 참조 하여 폼을 디자인 하고 싶다면 다음과 같이 할 수 있습니다.


this.AutoScaleDimensions = new System.Drawing.SizeF(96, 96);

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;


this.AutoScaleDimensions = new System.Drawing.SizeF(120, 120);

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;


아무리 봐도 이건 참 어렵습니다.



'Functional World > C#' 카테고리의 다른 글

널 병합 연산자.....  (0) 2014.12.15
Collection Object Dispose() 쉽게 하기......  (0) 2014.11.12
Form.ActiveForm  (0) 2013.11.07
바이트 배열 취득  (0) 2013.10.01
boxing 에 대한 생각의 오류....  (0) 2013.09.30
Posted by 프로그래머란 카페인을 코드로 변환하는 기계다
,