如何改变屏幕的分辩率?
我只能得到屏幕的分辩率:
m_iSysWidth = GetSystemMetrics( SM_CXSCREEN );
m_iSysHeight = GetSystemMetrics( SM_CYSCREEN );
但是我想改变屏幕的分辩率,用哪个函数?
用SystemParametersInfo来改变分辩率没有效果啊
问题点数:60、回复次数:8Top
1 楼wangk(倒之)回复于 2006-02-07 16:02:10 得分 35
ChangeDisplaySettings函数Top
2 楼lzzqqq(Jonersen)回复于 2006-02-07 16:03:47 得分 2
同意,混分.Top
3 楼bobob(静思)回复于 2006-02-07 16:08:24 得分 13
#include <AFX.H>
#include <SHELLAPI.H>
#include <STRING.H>
void ChangeSystemMetrics(int Width, int Height)
{
int nFullWidth = GetSystemMetrics(SM_CXSCREEN);
int nFullHeight = GetSystemMetrics(SM_CYSCREEN);
bool bChanged = 0;
if(nFullWidth < Width || nFullHeight < Height) //change to 1024*768;
{
DEVMODE lpDevMode;
memset(&lpDevMode, 0 ,sizeof(lpDevMode));
lpDevMode.dmBitsPerPel = 16;//Change from 24 to 16
lpDevMode.dmPelsWidth = Width;
lpDevMode.dmPelsHeight = Height;
lpDevMode.dmDisplayFrequency = 85;
lpDevMode.dmSize = sizeof(DEVMODE);
lpDevMode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY;
LONG result;
result = ChangeDisplaySettingsEx(NULL,&lpDevMode,NULL,0,NULL);
if (result == DISP_CHANGE_SUCCESSFUL)
{
result=ChangeDisplaySettingsEx(NULL,&lpDevMode,NULL,CDS_UPDATEREGISTRY,NULL);
bChanged=1;
}
else
{
result=ChangeDisplaySettingsEx(NULL,&lpDevMode,NULL,0,NULL);
}
}
}
void main()
{
ChangeSystemMetrics(1024, 768);
exit(0);
}
Top
4 楼jszj(老板说mis部不是赚钱的部门...)回复于 2006-02-07 16:47:38 得分 0
如何获得刷新率?Top
5 楼wangk(倒之)回复于 2006-02-07 16:51:23 得分 10
EnumDisplaySettings函数,用法见MSDN。Top
6 楼jszj(老板说mis部不是赚钱的部门...)回复于 2006-02-07 17:07:42 得分 0
刚才看了,知道 了, 谢谢!Top
7 楼jszj(老板说mis部不是赚钱的部门...)回复于 2006-02-07 17:15:34 得分 0
以下为本人最后的结果:
调整到想要的分辩率,如果不支持60MHZ以上的刷新率,则也不做调整,同时保存原来的分辩率和刷新率,在程序退出时还原
调整分辩率:
// 调整分辩率
m_iSysWidth = GetSystemMetrics( SM_CXSCREEN );
m_iSysHeight = GetSystemMetrics( SM_CYSCREEN );
if ( m_iSysWidth != SYSCR_WIDTH || m_iSysHeight != SYSCR_HEIGHT )
{
DEVMODE dm;
long lRet;
memset( &dm, 0, sizeof(DEVMODE) );
dm.dmSize = sizeof(DEVMODE);
dm.dmFields = DM_PELSHEIGHT | DM_PELSWIDTH | DM_DISPLAYFREQUENCY;
EnumDisplaySettings( NULL, ENUM_CURRENT_SETTINGS, &dm );
m_iFrequency = dm.dmDisplayFrequency;
dm.dmPelsHeight = SYSCR_HEIGHT;
dm.dmPelsWidth = SYSCR_WIDTH;
lRet = ChangeDisplaySettings( &dm, CDS_TEST );
if ( lRet != DISP_CHANGE_SUCCESSFUL )
{
if ( dm.dmDisplayFrequency <= 60 )
AfxMessageBox( IDS_DMINCORRECT, MB_ICONSTOP );
else
{
dm.dmDisplayFrequency = 60;
lRet = ChangeDisplaySettings( &dm, CDS_TEST );
if ( lRet != DISP_CHANGE_SUCCESSFUL )
AfxMessageBox( IDS_DMINCORRECT, MB_ICONSTOP );
else
{
lRet = ChangeDisplaySettings( &dm, CDS_UPDATEREGISTRY );
if ( lRet != DISP_CHANGE_SUCCESSFUL )
AfxMessageBox( IDS_DMINCORRECT, MB_ICONSTOP );
else
m_bChangeDisplay = true;
}
}
}
else
{
lRet = ChangeDisplaySettings( &dm, CDS_UPDATEREGISTRY );
if ( lRet != DISP_CHANGE_SUCCESSFUL )
AfxMessageBox( IDS_DMINCORRECT, MB_ICONSTOP );
else
m_bChangeDisplay = true;
}
}
在程序退出时,调整到原来的分辩率和刷新率:
if ( m_bChangeDisplay )
{
DEVMODE dm;
memset( &dm, 0, sizeof(DEVMODE) );
dm.dmSize = sizeof(DEVMODE);
dm.dmFields = DM_PELSHEIGHT | DM_PELSWIDTH | DM_DISPLAYFREQUENCY;
dm.dmPelsHeight = m_iSysHeight;
dm.dmPelsWidth = m_iSysWidth;
dm.dmDisplayFrequency = m_iFrequency;
ChangeDisplaySettings( &dm, CDS_UPDATEREGISTRY );
}
Top
8 楼jszj(老板说mis部不是赚钱的部门...)回复于 2006-02-07 17:17:30 得分 0
非常感谢以上朋友的帮助!Top




