202上位机VC MFC桌面显示模式的设置与获取
202上位机VC MFC桌面显示模式的设置与获取 功能展示 桌面的显示模式可以通过鼠标进行手工设置也可通过电脑进行设置,比如屏幕录像软件就可以将屏幕设置为640*480这样录制的视频体积会很小我们当前例程也实现当前系统显示设置与获取,获取的显示模式会罗列在列表框中,效果如图; 要点提示 一.当前使用的显示模式可以用函数GetSystemMetrics()获取;函数只有一个参数,参数不同,返回的值的意义就不同,参数为SM_CXSCREEN表示返回屏幕的宽, 为SM_CYSCREEN表示返回屏幕的高,更多参数可参考MSDN手册; 二.GetDeviceCaps()可获得显示的颜色位数; 函数原型:intGetDeviceCaps(HDC hdc, int nlndex); 参数定义:1、hdc:设备上下文环境的句柄。 2、nIndex:指定返回项,该参数取值众多, BITSPIXEL:像素相连颜色位数;PLANES:颜色位面数;NUMBRUSHES:设备指定画刷数; HORZSIZE:物理屏幕的宽度(毫米);VERTSIZE:物理屏幕的高度(毫米);HORZRES:屏幕的宽度(像素); VERTRES:屏幕的高度(光栅线);更多的取值可以参考MSDN手册; 三。ChangeDisplaySettings()可以用来设置显示模式; 函数原型:LONGChangeDisplaySettings (LPDEVMODE lpDevMode, DWORD dwflags); 参数编辑 1.lpDevMode:指向一个描述转变图表的DEVMODE的指针。DEVMODE的dmSize参数必须依DEVMODE结构的大小、字节进行初始化,dmDriveExtra参数必须初始化来显示DEVMODE随后的驱动数据的字节数,另外还可以选用以下参数: dmBitsPerPel每个像素的位数,dmPelsWidth像素宽度,dmPelsHeight像度高度,dmDisplayFlage模式标志。 dmDisplayFrequency模式频率。 dmposition在多显示配置中设备的位置 2.dwflags:表明了图形模式如何改变,它也有众多取值: 0:表明当前屏幕的图形模式要动态地改变。其他的取值可以参考MSDN手册; 四.全部显示的迭代获取可以用函数EnumDisplaySettings()函数原型:BOOL EnumDisplaySettings(LPCTSTR lpszDeviceName, DWORDiModeNum, LPDEVMODE lpDevMode); 参数定义: 1.lpszDeviceName:指向一个以null的结尾的字符串,该字符串指定了显示设备。此函数将获得该显示设备的图形模式信息。该参数可以为NULL。NULL值表明调用线程正运行在计算机的当前显示设备上。如果lpszDeviceName为NULL,该字符串的形式为\\.\displayx,其中x的值可以为1、2或3。 2.iModeNum:表明要检索的信息类型,该值可以是一个图形模式索引,也可以是下列一值: ENUM_CURRENT_SETTINGS:检索显示设备的当前设置。 ENUM_REGISTRY_SETTINGS:检索当前存储在注册表中的显示设备的设置。 图形模式索引值从零开始,要得到一个显示设备的所有图形模式信息,可以一系列地调用EnumDisplaySettings函数,并且iModeNum显为一个非零值时,则函数返回的信息是最近一次使用iModeNum置为零调用该函数时存储的信息。 3.lpDevMode:DEVMODE结构的指针,该结构存储指定图形模式的信息,在调用EnumDisplaySettings之前,设置dmSize为sizeof(DEVMODE),并且以字节为单位,设置dmDriveExtra元素为接收专用驱动数据可用的附加空间。 返回值:如果成功,返回非零值;如果失败,返回零。 实现功能 1.新建基于对话框的应用程序 2.拖拽一列表控件ID为IDC_LIST1用于显示获得的数据;依次添加按钮<获取系统显示元素颜色><获取系统当前显示模式><获取系统全部显示模式><显示模式设1024*768>叛逆函数,实现按钮对应的功能: - void CGkbc8Dlg::OnSyscolor()
- {
- CListBox* pListBox = (CListBox*)GetDlgItem(IDC_LIST1);//获取列表框指针
- pListBox->ResetContent();//清空内容
- CString sInfo;
- COLORREF CaptionColor=GetSysColor(COLOR_ACTIVECAPTION);
- sInfo.Format("活动标题栏的颜色为:RGB(%d,%d,%d)",GetRValue(CaptionColor),GetGValue(CaptionColor),GetBValue(CaptionColor));
- pListBox->InsertString(0,sInfo);
- }
- void CGkbc8Dlg::OnSysmode()
- {
- CListBox* pListBox = (CListBox*)GetDlgItem(IDC_LIST1);//获取列表框指针
- pListBox->ResetContent();//清空内容
- //<>
- CString StrDisplayMode;
- HWND hwndDesktop=::GetDesktopWindow();
- HDC hdc=::GetDC(hwndDesktop);
- StrDisplayMode.Format("当前显示模式为: %d*%d*%d",GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN),
- GetDeviceCaps(hdc,BITSPIXEL));
- pListBox->InsertString(0,StrDisplayMode);
- //<>
- ::ReleaseDC(hwndDesktop,hdc);
- }
复制代码- void CGkbc8Dlg::OnAllsysmode()
- {CListBox* pListBox = (CListBox*)GetDlgItem(IDC_LIST1);//获取列表框指针
- pListBox->ResetContent();//清空内容
- DEVMODE *lpDevMode;
- lpDevMode=new DEVMODE;
- int i=0;
- BOOL Result=EnumDisplaySettings(NULL,i,lpDevMode);
- while(Result)
- {CString sText;
- sText.Format("%d*%d*%d ",lpDevMode->dmPelsWidth,lpDevMode->dmPelsHeight,lpDevMode->dmBitsPerPel);
- pListBox->InsertString(0,sText);//向列表框添加数据
- delete lpDevMode;
- lpDevMode=new DEVMODE;
- Result=EnumDisplaySettings(NULL,++i,lpDevMode);
- }
- delete lpDevMode;
- }
- void CGkbc8Dlg::OnSetsysmode()
- { DEVMODE *lpDevMode;
- lpDevMode=new DEVMODE;
- int i=0;
- BOOL Result=EnumDisplaySettings(NULL,i,lpDevMode);
- while(Result)
- {
- if(lpDevMode->dmPelsWidth==1024&&lpDevMode->dmPelsHeight==768&&lpDevMode->dmBitsPerPel==32)
- {
- lpDevMode->dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
- LONG lResult=ChangeDisplaySettings(lpDevMode,0);
- if(lResult!=DISP_CHANGE_SUCCESSFUL&&lResult!=DISP_CHANGE_RESTART)
- MessageBox("设置显示模式失败","信息提示",MB_OK);
- break;
- }
- delete lpDevMode;
- lpDevMode=new DEVMODE;
- Result=EnumDisplaySettings(NULL,++i,lpDevMode);
- } delete lpDevMode;
- }
复制代码我们来演示下功能实现的整个过程
|