Windowsコード集 上のページ

#0008 解像度切り替え

解像度切り替えをクラスで書いてみました。
このようにすると、切り替え解除が要らないので便利です。
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();



上のページ