본문 바로가기
개발, IT

C++ 해상도 변경

by Nabi™ 2008. 11. 25.

말 그대로 프로그래밍 상에서 현재의 해상도를 원하는데로 변경할 수 있습니다.
전역함수로 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를 이용하시면 됩니다.

 
좋은정보가 되셨다면 아래 한번 클릭해주세요^^



댓글