class CChangeDisplay{
protected:
DEVMODE m_res_display,m_chg_display;
BOOL m_change;
BOOL GetDisplay(DWORD width,DWORD height,DWORD bpp,LPDEVMODE dm,DWORD vref){
DWORD i = 0;
while(EnumDisplaySettings(NULL,i,dm)){
if(vref == 0){
if(dm->dmPelsWidth == width && dm->dmPelsHeight == height && dm->dmBitsPerPel == bpp)return TRUE;
}else{
if(dm->dmPelsWidth == width && dm->dmPelsHeight == height && dm->dmBitsPerPel == bpp && dm->dmDisplayFrequency == vref)return TRUE;
}
i++;
}
return FALSE;
}
public:
CChangeDisplay(LONG width,LONG height):m_change(FALSE){Change(width,height);}
CChangeDisplay():m_change(FALSE){;}
~CChangeDisplay(){Restore();}
BOOL Change(DWORD width,DWORD height){
DEVMODE dm;
RECT rect;
HDC dc = GetDC(0);
LONG bpp = GetDeviceCaps(dc,BITSPIXEL);
DWORD vref = 0;
if(IsWindowsNT())vref = (DWORD)GetDeviceCaps(dc,VREFRESH);
ReleaseDC(0,dc);
GetWindowRect(GetDesktopWindow(),&rect);
if(!GetDisplay(rect.right - rect.left,rect.bottom - rect.top,bpp,&dm,vref))return FALSE;
memcpy(&m_res_display,&dm,sizeof(dm));
if(GetDisplay(width,height,bpp,&dm,vref)){
memcpy(&m_chg_display,&dm,sizeof(dm));
ChangeDisplaySettings(&dm,CDS_FULLSCREEN);
m_change = TRUE;
return TRUE;
}
return FALSE;
}
BOOL Restore(){
if(m_change){ChangeDisplaySettings(&m_res_display,0);}
m_change = FALSE;
return TRUE;
}
};
// 解像度変更の方法
CChangeDisplay display(640,480);
// 解像度復帰(省略してもかまいません)
display.Restore();