말 그대로 프로그래밍 상에서 현재의 해상도를 원하는데로 변경할 수 있습니다.
전역함수로 ChangeDisplaySettings 라는 함수가 있더군요.
암데서나 불러 쓸수 있죠.
이전 해상도를 보관했다가 다시 복귀할 수 있도록 해보겠습니다.
현재의 해상도를 얻어오는 함수는 GetSystemMetrics 입니다.
먼저 현재의 해상도를 저장할 변수를 선언합니다.
class CMainFrame : public CMDIFrameWnd
{
/// 생략
// Attributes
public:
int screenY;
int screenX;
/// 생략
}
초기화는 요렇게..
// 현재 해상도 보관
screenX = GetSystemMetrics(SM_CXSCREEN) ;
screenY = GetSystemMetrics(SM_CYSCREEN) ;
인자로 받은 해상도로 변경하는 함수를 만듭니다.
void CMainFrame::ChangeDisplay(int Width, int Height)
{
DEVMODE mode ;
mode.dmBitsPerPel = 16; // 16비트 칼라로 변경
mode.dmPelsWidth = Width;
mode.dmPelsHeight = Height;
mode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
ChangeDisplaySettings(&mode, CDS_FULLSCREEN );
ShowWindow( SW_SHOWMAXIMIZED );
}
전 16비트 칼라로만 변경하도록 했는데, 저것두 인자로 받아서 처리하면 원하는 칼라로 바꿀수 있겠죠??? 그리구 원하는 곳에서 함수를 호출~~~
// 1024 x 768 로 변경
((CMainFrame*)AfxGetMainWnd())->ChangeDisplay(1024, 768) ;
프로그램이 종료할때 이전 해상도로 복귀하도록 해야 겠죠? 이건 DestroyWindow() 에서 처리하면 됩니다.
BOOL CMainFrame::DestroyWindow()
{
if(screenX != GetSystemMetrics(SM_CXSCREEN) ||
screenY != GetSystemMetrics(SM_CYSCREEN))
ChangeDisplay(screenX, screenY) ;
return CFrameWnd::DestroyWindow();
}
이전 해상도를 저장해뒀으니까 그걸로 다시 복귀한거죠.
암튼, 위에서처럼 작업하면 원하는 해상도로 변경시켜서 작업할 수 있죠.
참, 도움말을 뒤져보니깐 윈도우 메시지중에 WM_DISPLAYCHANGE 라는게 있더군요.
근데 이 메시지는 클래스위저드에 들어있질 않네요.
99999999WM_DISPLAYCHANGE 메세지는 직접 호출할 수는 없을 겁니다.
다만 OS가 화면 해상도가 변경되었을 때 모든 Window에게로 보내주는 Message일 겁니다.
해상도 복원시에 변수로 해상도를 가지고 있다가 복원할 필요 없이 그냥
ChangeDisplaySettings(NULL, 0);
이라고만 하면 화면 복원 됩니다. 이 함수는 해상도 변경만 하지 디스플레이 등록정보 자체를 바꾸진 않기 때문에 위 방식대로 함수를 호출하면 디스플레이 등록정보에 있는 해상도로 그대로 바꿔주기 때문에 더 안정적입니다.
원하는 해상도를 모니터가 받아줄수 있는지 테스트 하시고 바꿔야죠.
그 부분이 빠졌군요.
EnumDisplaySettings를 이용하시면 됩니다.
좋은정보가 되셨다면 아래 한번 클릭해주세요^^ |
댓글