반응형

Screen 크기 구하기

 

GetSystemMetrics API를 이용해서 구할 수 있는 스크린 크기는 여러 가지가 있다.

상황에 따라 필요한 화면크기를 구할 때는 다음과 같이 코딩하면 된다.

·        스크린 크기( 해상도 )
int iScreenCx = GetSystemMetrics(SM_CXSCREEN);
int iScreenCy = GetSystemMetrics(SM_CYSCREEN);
이 값은 GetDeviceCaps(HORZRES), GetDeviceCaps(VERTRES)값과 같다고 MSDN에 명기되어 있다

 

·        태스크바를 제외한 윈도우가 위치할 수 있는 화면 크기
MSDN을 보면 SM_CXMAXIMIZED(SM_CYXMAXIMIZED) 플래그가 있다.
이 플래그를 인자로 전달하면 원하는 사이즈를 계산해 줄 꺼라 생각할 수 있지만, 실제로는 그렇지 않다
.
SM_CXMAXIMIZED(SM_CYXMAXIMIZED)
값은 Primary 모니터에서 top-level Maximized되었을 때의 윈도우의 사이즈를 리턴 한다
.
원하는 바와 같은 내용인 것 같지만, 테스트 해보면 다른 값이 나옴을 알 수 있다
.
우선 해당 사이즈를 얻은 후 MoveWindow를 해 보면, right bottom이 예상했던 영역을 몇 픽셀씩 벗어난다. 해당 윈도우를 최대화 했을 경우에는 예상했던 영역에 표시된다
.
그런데 spy로 확인해보면, 두 경우의 윈도우 사이즈가 동일하다
.
왜 이런 현상이 발생하는지는 알수 없지만, 어찌됬든 위의 값을 사용할 수는 없다는 얘기다
.
해답은
SM_CXFULLSCREEN(SM_CYFULLSCREEN)에서 찾을 수 있다.( 이 플래그를 이용하라는 얘기가 아니다
.)
이 플래그를 MSDN에서 찾아보면 풀 스크린 윈도우의 클라이언트 width,height를 리턴 한다고 되어있다. 그리고 친절하게도
태스크 바나 응용프로그램 태스크 바의 영역을 제외한 크기를 얻으려면, SystemParametersInfo( , SPI_GETWORKAREA )를 사용하라고 명기되어 있다
.
이 함수를 이용하면 원하는 값을 얻을 수 있다.


다음은 내 컴퓨터에서 테스트한 각 함수호출의 결과값이다.
테스트 PC 해상도는 1680*1050이다.

GetSystemMetrics( SM_CXSCREEN ) = 1680;
GetSystemMetrics(
SM_CYSCREEN
) = 1050;
GetSystemMetrics(
SM_CXMAXIMIZED
) = 1688;
GetSystemMetrics(
SM_CYMAXIMIZED
) = 1030;
GetSystemMetrics(
SM_CXFULLSCREEN
) = 1680;
GetSystemMetrics(
SM_CYFULLSCREEN ) = 1003;

 

RECT rcWorkArea;
SystemParametersInfo(
SPI_GETWORKAREA
, 0, &rcWorkArea, 0 ) ;
rcWorkArea.right - rcWorkArea.left = 1680;
rcWorkArea.bottom - rcWorkArea.top = 1022;

결국 대부분의 간단한 문제에 대한 해답은 MSDN에 있다.~.

 

 

반응형

'Windows Programming' 카테고리의 다른 글

듀얼 모니터에서의 좌표값 확인  (1) 2008.07.04
COM DLL만으로 tlb파일 생성및 COM사용하기  (0) 2008.04.28
Afx의 의미  (0) 2008.04.14
[MFC] Windows Control 제어  (0) 2008.03.31
MFC 전역함수  (0) 2008.03.30

+ Recent posts