win32项目--获取、修改计算机屏幕分辨率
来源:互联网 发布:淘宝客服网上兼职 编辑:程序博客网 时间:2024/04/28 12:50
先介绍一下单词metric,作为名词的时候有“度量标准,度量”的意思。所以system metric的意思是“系统度量单位”。
接下来就要介绍一下GetSystemMetrics函数。
功能:得到被定义的系统数据或者系统配置信息。
语法:
int WINAPI GetSystemMetrics(_in int nIndex);
参数:
只有一个参数index,我们称之为索引。这个索引有75个标识符,部分如下:
SM_CXSCREEN = 0 'X Size of screenSM_CYSCREEN = 1 'Y Size of ScreenSM_CXVSCROLL = 2 'X Size of arrow in vertical scroll bar.SM_CYHSCROLL = 3 'Y Size of arrow in horizontal scroll barSM_CYCAPTION = 4 'Height of windows captionSM_CXBORDER = 5 'Width of no-sizable bordersSM_CYBORDER = 6 'Height of non-sizable bordersSM_CXDLGFRAME = 7 'Width of dialog box bordersSM_CYDLGFRAME = 8 'Height of dialog box bordersSM_CYHTHUMB = 9 'Height of scroll box on horizontal scroll barSM_CXHTHUMB = 10 ' Width of scroll box on horizontal scroll barSM_CXICON = 11 'Width of standard iconSM_CYICON = 12 'Height of standard iconSM_CXCURSOR = 13 'Width of standard cursorSM_CYCURSOR = 14 'Height of standard cursorSM_CYMENU = 15 'Height of menuSM_CXFULLSCREEN = 16 'Width of client area of maximized windowSM_CYFULLSCREEN = 17 'Height of client area of maximized windowSM_CYKANJIWINDOW = 18 'Height of Kanji windowSM_MOUSEPRESENT = 19 'True is a mouse is presentSM_CYVSCROLL = 20 'Height of arrow in vertical scroll barSM_CXHSCROLL = 21 'Width of arrow in vertical scroll barSM_DEBUG = 22 'True if deugging version of windows is runningSM_SWAPBUTTON = 23 'True if left and right buttons are swapped.SM_CXMIN = 28 'Minimum width of windowSM_CYMIN = 29 'Minimum height of windowSM_CXSIZE = 30 'Width of title bar bitmapsSM_CYSIZE = 31 'height of title bar bitmapsSM_CXMINTRACK = 34 'Minimum tracking width of windowSM_CYMINTRACK = 35 'Minimum tracking height of windowSM_CXDOUBLECLK = 36 'double click widthSM_CYDOUBLECLK = 37 'double click heightSM_CXICONSPACING = 38 'width between desktop iconsSM_CYICONSPACING = 39 'height between desktop iconsSM_MENUDROPALIGNMENT = 40 'Zero if popup menus are aligned to the left of the memu bar item. True if it is aligned to the right.SM_PENWINDOWS = 41 'The handle of the pen windows DLL if loaded.SM_DBCSENABLED = 42 'True if double byte characteds are enabledSM_CMOUSEBUTTONS = 43 'Number of mouse buttons.SM_CMETRICS = 44 'Number of system metricsSM_CLEANBOOT = 67 'Windows 95 boot mode. 0 = normal, 1 = safe, 2 = safe with networkSM_CXMAXIMIZED = 61 'default width of win95 maximised windowSM_CXMAXTRACK = 59 'maximum width when resizing win95 windowsSM_CXMENUCHECK = 71 'width of menu checkmark bitmapSM_CXMENUSIZE = 54 'width of button on menu barSM_CXMINIMIZED = 57 'width of rectangle into which minimised windows must fit.SM_CYMAXIMIZED = 62 'default height of win95 maximised windowSM_CYMAXTRACK = 60 'maximum width when resizing win95 windowsSM_CYMENUCHECK = 72 'height of menu checkmark bitmapSM_CYMENUSIZE = 55 'height of button on menu barSM_CYMINIMIZED = 58 'height of rectangle into which minimised windows must fit.SM_CYSMCAPTION = 51 'height of windows 95 small captionSM_MIDEASTENABLED = 74 'Hebrw and Arabic enabled for windows 95SM_NETWORK = 63 'bit o is set if a network is present.SM_SECURE = 44 'True if security is present on windows 95 systemSM_SLOWMACHINE = 73 'true if machine is too slow to run win95.
所以我们就可以通过下面两条代码获得计算机的屏幕分辨率:
int m_nWindwMetricsX = ::GetSystemMetrics(SM_CXSCREEN);int m_nWindwMetricsY = ::GetSystemMetrics(SM_CYSCREEN);
下面介绍一个结构体DEVMODE。
DEVMODE数据结构中包含了有关设备初始化和打印机环境的信息
DEVMODE结构具有如下形式:
typedef struct _devicemode{ /* dvmd */TCHAR dmDeviceName[32];WORD dmSpecVersion;WORD dmDriverVersion;WORD dmSize;WORD dmDriverExtra;DWORD dmFields;short dmOrientation;short dmPaperSize;short dmPaperLength;short dmPaperWidth;short dmScale;short dmCopies;short dmDefaultSource;short dmPrintQuality;short dmColor;short dmDuplex;short dmYResolution;short dmTTOption;short dmCollate;TCHAR dmFormName[32];WORD dmUnusedPadding;USHORT dmBitsPerPel;DWORD dmPelsWidth;DWORD dmPelsHeight;DWORD dmDisplayFlags;DWORD dmDisplayFrequency;} DEVMODE;
部分成员介绍:
dmDeviceName 指定了驱动程序支持的设备名称;例如,对于PCL/HP LaserJet系列,会是CL/HP激光打印机。这个字符串在设备驱动程序之间是相互不同的。
dmSpecVersion 指定了初始化数据的版本数字,这个结构就基于这些数据。
dmDriverVersion 指定了打印机驱动程序开发商分配的打印机驱动程序版本号。
dmSize 指定了DEVMODE结构的大小,以字节为单位,不包括dmDriverData(与设备有关)成员。如果应用程序仅操作数据中与驱动程序无关的部分,它就可以使用这个成员以确定该结构的长度,而并不需要有不同版本的记录。
dmDriverExtra 包含了这个结构后面的私有驱动程序数据的数目,以字节为单位。如果设备驱动程序不使用该设备独有的信息,就把这个成员设为零。
dmFields 指定了DEVMODE结构的其余成员中哪些已被初始化。第0位(定义为DM)ORIENTATION)代表dmOrientation,第1位(定义为 DM_PAPERSIZE)代表dmPaperSize等等。打印机驱动出现仅支持那些适合打印技术的成员。
dmOrientation 选择纸的方向。
dmPaperLength 重定义由dmPaperSize成员指定的纸张长度,可用于自定义纸张大小,也可以用于点阵打印机,这种打印机能打出任意长度的纸张。这些值与这个结构中其他指定物理长度的值都是以0.1毫米为单位的。
dmPaperWidth 重载由dmPaperSize成员指定的纸张宽度。
dmScale 指定了打印输出的缩放因子。实际的页面大小为物理纸张的大小乘以dmScale/100。例如,对于信纸大小的纸张,如果dmScale的值为50,它将可以容纳相当于17×22英寸页面的内容,因为输出的文本和图形的宽、高都将是原始大小的一半。
dmCopies 如果设备支持多页拷贝,则选择了要打印的拷贝数目。
dmDefaultSource 保留,必须为0。
dmPrintQuality 指定了打印机的分辨率。有四种预定义的与设备无关的值:
DMRES_HIGH
DMRES_MEDIUM
DMRES_LOW
DMRES_DRAFT
如果给定了一个正值,它就指定了每英寸打印的点数(DPI),因此是与设备有关的。
dmColor 对于彩色打印机,在彩色和单色之间切换。下面是可能的取值:
·DMCOLOR_COLOR
·DMCOLOR_MONOCHROME
dmDuplex 为支持双面打印的打印机选择双面打印方式。可能的取值如下:
·DMDUP_SIMPLEX
·DMDUP_HORIZONTAL
·DMDUP_VERTICAL
dmBitsPerPel 指定了显示设备的颜色分辨率,以像素的位数为单位。例如,16色使用4位,256色使用8位,而65536色使用16位。
dmPelsWidth 指定了可见设备表面的以像素为单位的宽度。
dmPelsHeight指定了可见设备表面的以像素为单位的高度。
dmDisplayFlags 指定了设备的显示模式。下面是有效的标志: · DM_GRAYSCALE 指定显示使用了无颜色设备。如果没有设置这个标志,就假定彩色模式。
· DM_INTERLACED 指定了隔行显示模式。如果没有设置这个标志,就假定非隔行模式。
dmDisplayFrequency 指定了显示设备的特定模式所使用的以赫兹为单位的频率(每秒的周期数)。
修改屏幕分辨率,我们需要设置的参数有dmBitsPerPel (指定了显示设备的颜色分辨率)、dmPelsWidth (指定了可见设备表面的以像素为单位的宽度)、dmPelsHeight(指定了可见设备表面的以像素为单位的高度)、dmSize (指定了DEVMODE结构的大小)、dmFields (指定了DEVMODE结构的其余成员中哪些已被初始化以字节为单位)。代码如下:
DEVMODE lpDevMode;lpDevMode.dmBitsPerPel=32;lpDevMode.dmPelsWidth=1024;lpDevMode.dmPelsHeight=768;lpDevMode.dmSize=sizeof(lpDevMode);lpDevMode.dmFields =DM_PELSWIDTH|DM_PELSHEIGHT|DM_BITSPERPEL;
下面介绍另一个函数ChangeDisplaySettings 。
msdn上是这样描述的:change the settings of the default display device to specified graphics mode.
语法:
Long ChangeDisplaySettings(_in DEVMODE *lpDevMode, _in DWORD dwflags);
参数:
lpDevMode 指向DEVMODE结构体的指针。
dwflags 表明了图形模式如何改变,具体取值可以查看msdn。
返回值:
DISP_CHANGE_SUCCESSFUL:设备改变成功。
DISP_CHANGE_RESTART:为使图形模式生效计算机必须重新启动。
DISP_CHANGE_BADFLAGS:标志的无效设置被传送。
DISP_CHANGE_NOTUPDATED:在WindowsNT中不能把设置写入注册表。
DISP_CHANGE_BADPARAM:一个无效的参数被传递。它可以包括一个无效的标志或标志的组合。
DISP_CHANGE_FAILED:指定图形模式的显示驱动失效。
DISP_CHANGE_BADMODE:不支持图形模式。
有了以上基础知识,下面开始我们的程序编写。
首先新建一个win32项目,添加一个.cpp文件,键入代码:
#include<Windows.h>int CALLBACK WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in int nShowCmd ){ //获取分辨率 int m_nWindwMetricsX = ::GetSystemMetrics(SM_CXSCREEN); int m_nWindwMetricsY = ::GetSystemMetrics(SM_CYSCREEN); char charX[20]; itoa(m_nWindwMetricsX, charX, 10); MessageBox(NULL, charX, "分辨率",MB_OK); //修改分辨率 DEVMODE lpDevMode; lpDevMode.dmBitsPerPel=32; lpDevMode.dmPelsWidth=1024; lpDevMode.dmPelsHeight=768; lpDevMode.dmSize=sizeof(lpDevMode); lpDevMode.dmFields =DM_PELSWIDTH|DM_PELSHEIGHT|DM_BITSPERPEL; LONG result; result=ChangeDisplaySettings(&lpDevMode,0); if (result==DISP_CHANGE_SUCCESSFUL) { MessageBox(NULL,"修改成功!", "修改", MB_OK); ChangeDisplaySettings(&lpDevMode,CDS_UPDATEREGISTRY); // //使用CDS_UPDATEREGISTRY表示次修改是持久的, // //并在注册表中写入了相关的数据 } else { MessageBox(NULL, "修改失败,恢复原有设置!", "修改", MB_OK); ChangeDisplaySettings(NULL,0); } return 0;}
- win32项目--获取、修改计算机屏幕分辨率
- 获取和修改计算机屏幕分辨率
- 获取和修改计算机屏幕分辨率 VC
- VC获取并修改计算机屏幕分辨率(MFC)
- VC获取并修改计算机屏幕分辨率
- VC获取并修改计算机屏幕分辨率(MFC)
- VC获取并修改计算机屏幕分辨率(MFC)
- VC 获取并修改计算机屏幕分辨率
- c++调用api实现获取修改屏幕分辨率
- 修改屏幕分辨率
- 获取屏幕分辨率
- 获取屏幕分辨率
- 屏幕分辨率获取
- 获取屏幕分辨率
- 获取屏幕分辨率
- 获取屏幕分辨率
- 获取屏幕分辨率
- 获取屏幕分辨率
- shell总结
- android捕获异常并保存到sd卡文件目录里
- 使用 VisualVM 进行性能分析及调优
- js 格式化时间日期函数小结
- facebook share 功能demo
- win32项目--获取、修改计算机屏幕分辨率
- IntelliJ IDEA 开发scala
- pdf转换成html转换工具的使用方法
- android 实现拍照的2种方法
- VS2010使用EF6连接mysql 配置
- 基于 Jenkins 快速搭建持续集成环境
- megapix-image.js使用的一个坑-ios图片裁剪之画布绘制大图片
- shell 编程记录。
- Uva11988 Broken Keyboard