반응형
또 다른 광고 프로그램을 만드는데, 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;
를 이용해도 되긴 된다.
반응형
'프로그램' 카테고리의 다른 글
영화, 드라마, TV 리뷰용 화면 자동 갈무리 프로그램. (4) | 2012.02.16 |
---|---|
PHP 강좌 파일. (0) | 2012.02.06 |
visual studio 에서 대소문자 바꾸기 단축키. (0) | 2012.01.31 |
android back key 에서 super 의 사용. (0) | 2012.01.26 |
getTag() 값은 String 으로만 변경 가능한 걸까? (0) | 2012.01.21 |