AdjustWindowRect

원형 BOOL AdjustWindowRect(LPRECT lpRect, DWORD dwStyle, BOOL bMenu);
MFC 원형 해당하는 함수가 없음
인수

▶lpRect:원하는 작업 영역의 사각 크기를 전달하면 이 인수로 조정된 윈도우 크기가 리턴된다.

▶dwStyle:윈도우의 스타일을 지정한다. WS_OVERLAPPED 스타일은 지정할 수 없다.

▶bMenu:메뉴가 있으면 TRUE를 전달하고 그렇지 않으면 FALSE를 전달한다.

리턴

성공하면 nonzero리턴, 실패하면 0 리턴

설명

작업 영역의 크기는 윈도우 크기에서 타이틀 바와 경계선, 메뉴, 스크롤 바 등의 영역을 제외한 영역이다. 일반적으로 MoveWindow, SetWindorPos 등의 함수로 윈도우 크기는 원하는대로 바꿀 수 있지만 작업 영역의 크기를 원하는대로 설정하는 방법은 없다. 작업 영역을 특정한 크기대로 설정하려면 이 함수로 원하는 윈도우 크기를 먼저 계산하고 MoveWindow 등의 함수로 윈도우 크기를 변경해야 한다.

이 함수는 윈도우의 스타일(타이틀 바의 유무, 타이틀 바의 높이, 경계선의 두께)와 메뉴의 존재 여부 등을 고려하여 작업 영역의 크기가 lpRect가 될 수 있는 윈도우 크기를 구해 lpRect로 리턴해 준다. 단 이 함수는 메뉴 바가 두 줄로 출력되어 있는 경우와 스크롤 바의 존재에 대해서는 정확한 계산을 해 주지 않는다. 만약 스크롤 바를 가지고 있다면 구해진 영역 크기에 스크롤바의 높이와 폭을 더해 주어야 한다.

예제1

다음 예제는 작업 영역의 크기를 300*200으로 설정하고 타원을 그린다.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	RECT rt={0,0,300,200};
	switch(iMessage) {
	case WM_CREATE:
		AdjustWindowRect(&rt,WS_OVERLAPPEDWINDOW,FALSE);
		MoveWindow(hWnd,100,100,rt.right-rt.left,rt.bottom-rt.top,FALSE);
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		Ellipse(hdc,0,0,300,200);
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

WM_CREATE에서 AdjustWindowRect 함수를 호출하되 {0,0,300,200}으로 초기화된 rt를 첫번째 인수로 전달하였으며 이 윈도우는 메뉴가 없고 WS_OVERLAPPEDWINDOW 스타일로 생성되었음을 알려 주었다. AdjustWindowRect 함수는 윈도우 스타일과 현재 윈도우의 메트릭스 값을 참조하여 작업 영역이 300*200의 크기가 되도록 윈도우 영역을 계산해서 rt에 그 영역을 리턴해 준다. MoveWindow 함수로 rt의 폭과 높이를 취해 윈도우 크기를 변경하면 작업 영역의 크기가 정확하게 300,200으로 설정된다. 다음은 실행 결과이다.

작업 영역의 크기를 확인하기 위해 300*200의 크기로 타원을 그려 보았다.

참고함수

AdjustWindowRectEx : 확장 스타일까지 고려하여 윈도우 크기를 계산해 준다.

CreateWindow, MoveWindow

플렛폼 95이상
참조 10장 참조

written by http://www.winapi.co.kr