프로그램

C# - Form 안의 Control 들의 영역, 위치 계산 + SystemInformation 클래스

(주)CKBcorp., 2012. 2. 2. 18:16
반응형

또 다른 광고 프로그램을 만드는데, Form 안의 Component 들의 위치를 계산하는 방식이 생각했던 것과 차이가 있어서 기록해 놓는다.

일반적으로 컴포넌트( 컨트롤 Controls 이라고도 한다.) 의 경우, 해당 영역을 좌표로 계산하기 위한 관련 속성들은 다음과 같다.

Control.Top,
Control.Left,
Control.Width,
Control.Height,



하지만, Component에 따라서는 Top, Left 속성이 없는 경우가 있다. 이때 생각해 봐야 할 속성들이 Location 속성이다. 즉,

Control.Location.X
Control.Location.Y



그런데, 이게 끝이 아니다. 이 값들은 모두, Parent인 Window Form 의 위치가 0,0. 즉,  Form.Location.X,  Form.Location.Y 가 0,0 일때를 가정한 값이다.
문제는, 이 0,0 이라는 좌표값의 위치가, Application 기준이 Control 기준이 좀 다르다는 것.
설명이 지저분하므로 그림으로 해결하자. 

( 글씨 못썼다고 지적질하면 반칙인거다. )


예를들어, 메모장에는 "메뉴" 컴포넌트가 있다. 
이 컴포넌트의  menu.Top, menu.Left 값은 얼마일까? ( menu.Top / Left 대신 menu.Location.X / Y 일수도 있으나, 째째하게 굴지 말자. 응? )
아마 menu.Top, menu.Left 값 모두 ( 0, 0 ) 일 거다. 즉, 그림의 "2"번 좌표를 component 의 property 로 구하면, 0,0 이 나올 것이다. 
그런데 Cursor.Position.x, Cursor.Position.y 값은 얼마일까? 물론 ( 10, 27 ) 이다!!! ( 0, 0 ) 이 아닌거다.
그러므로, 마우스 좌표와 Form 안의 Control 들의 위치를 계산해야 할 일이 생긴다면, Top, Left, Location.X, Location.Y 값을 그냥 쓰면 안된다. 이런 경우에 보정을 위해 사용해야 할 값이 바로 SystemInformation 클래스의 속성값들이다. 
특별히 좌표값 계산을 위해 사용해야 할 값들은

CaptionHeight 창의 표준 제목 표시줄 영역 높이를 픽셀 단위로 가져옵니다. ( 그림에서 3번 값 )
FixedFrameBorderSize 캡션이 있으며 크기를 조정할 수 없는 창의 프레임 테두리 두께(픽셀 단위)를 가져옵니다. ( 그림에서 4번 값 )


사용법은 간단하다.   SystemInformation.CaptionHeight,  SystemInformation.FixedFrameBorderSize 와 같이 사용하면 되고, 전부 int값을 반환하므로 바로 pixel 값 계산에 이용할 수 있다. 
 
이하는 추가 내용들:
 ( 3번 값을 포함한 ) 윈도우 전체 값을 가져오려면, SystemInformation 이외에도 그냥

            int width = Screen.PrimaryScreen.Bounds.Width;
            int height = Screen.PrimaryScreen.Bounds.Height;


를 이용해도 되긴 된다.
  
이정도면 될 것이다. 그럴 것이다아~~~~  흠....



 

반응형