블로그는 나의 힘!
[ Programing ]/MFC2013. 5. 22. 00:44
콩순이 블로그
http://blog.naver.com/yckshj/130013747224
 




말 그대로 프로그래밍 상에서 현재의 해상도를 원하는데로 변경할 수 있습니다. 

전역함수로 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를 이용하시면 됩니다.



갑자기 누군가 물어 봐서 찾아 본건데;; 이런것도 필요 하겠구나 싶더라.
 
 
DX 함수
HRESULT GetDeviceCaps( D3DCAPS9 * pCaps );
 
 
 

Posted by Mister_Q