GetDeviceCaps WinAPI

来源:互联网 发布:snmp开源软件 编辑:程序博客网 时间:2024/06/07 00:20

函数原型:int GetDeviceCaps(int nIndex);
常用的参数有(参考MSDN):


这个函数可以访问使用设备描述表的设备数据,应用程序指定相应设备描述表的句柄和说明该函数访问数据类型的索引来访问这些数据。
根据指定设备场景代表的设备的功能返回信息  



 
VC++参数


  1、hdc:设备上下文环境的句柄。


 
  2、nIndex:指定返回项,该参数取下列一值。(C++)


 
  DRIVERVERSION:设备驱动程序版本。


 
  TECHNOLOGY:设备技术,它可以是下列一值:


 
  DT_PLOTTER:矢量绘图仪;DT_RASDISPLAY:光栅显示器;


 
  DT_RASPRINTER:光栅打印机;DT_RASCAMERA:光栅照相机;


 
  DT_CHARSTREAM:字符流;DT_METAFILE:图元文件;


 
  DT_DISPFILE:显示器文件。


 
  如果hdc参数指定图元文件的设备上下文环境,则设备技术就是给CreateEnhMetaFile函数的引用设备,使用GetObjectType函数可以确定它是否是一增强元文件设备上下文环境。


 
  HORZSIZE:物理屏幕的宽度(毫米);VERTSIZE:物理屏幕的高度(毫米);HORZRES:屏幕的宽度(像素);


 
  VERTRES:屏幕的高度(光栅线);


 
  LOGPIXELSX:沿屏幕宽度每逻辑英寸的像素数,在多显示器系统中,该值对所显示器相同;


 
  LOGPIXELSY:沿屏幕高度每逻辑英寸的像素数,在多显示器系统中,该值对所显示器相同;


 
  BITSPIXEL:像素相连颜色位数;PLANES:颜色位面数;NUMBRUSHES:设备指定同画笔数;


 
  NUMPENS:设备指定笔数;NUMFONTS:设备指定字体数;


 
  NUMCOLORS:设备颜色表的入口数,如果设备的色深不超过8位像素。对于超过色深的设备返回-1;


 
  ASPECTX:用于画线的设备像素的相对宽度;ASPECTY:用于画线的设备像素的相对高度;


 
  ASPECTXY:用于画线的设备像素的对角线宽度;PDEVLCESIZE:保留;


 
  CLIDCAPS:显示设备支持剪切性能的标志。如果设备可剪切为一个长方形,则为1,否则为0;


 
  SIZEPALETTE:系统调色板中的入口数目,只有在设备驱动器在RASTERCAPS索引中设置RC PALETFE位时该索引值才是有效的。且该索引值只能用于16位Windows的驱动器;


 
  NUMRESERVED:系统调色板中保留的入口数目,只有在设备驱动器在RASTERLAP索引中设置RC PALETFE位时,该索引值才是有效的且该索引值只有能于16位的Windows驱动器;


 
  COLORRES:实际位像的实际设备颜色,只有设备驱动器在RASTERLAP索引中设置RCPALETFE位时,该索引值才是有效的且该索引值只能用于16位的Windows驱动器;


 
  PHYSICALWIDTH:对于打印设备,为以设备单位的物理页面宽度。例如一个在8.5*11纸上设置为600dpi的打印机的设备物理单位宽度值为5100,注意物理页面总是大于可打印的页面面积,且从不小于;


 
  PHPSICALHEIGHT:为以设备单位的物理页面宽度。例如一个在8.5*11纸上设置为600dpi的打印机的设备物理单位高度值为6600;


 
  PHYSICALOFFSETX:对于打印设备,从物理页面左边到打印页面左边的距离,例如,一个在8.5*11纸上设置为600dpi的打印机,不能在超出左边0.25处打印,且有一个150备单位的水平物理位移;


 
  PHYSICALOFFSETY;对于打印设备。从物理页面上面到打印页面上边的距离。例如一个在8.5*11打印纸上设置为的打印机,不能在超出上边的地方打处,且有一个设备单位的物理位移;


 
  VREFRESH:Windows NT:对于显示设备。设备的当前垂直刷新率以每秒中的循环次数为单位0或1刷新率代表显示硬件的缺省刷新率,此缺省刷新率通常通过设置显卡或主板的跳线来改变,或通过一个不使用Win32显示函数比如ChangeDisplay Setting的一个配置程序来设置;


 
  DESKTOPHORZRES:Windows NT:可视桌面的以像素为单位的宽度。如果设备支持一个可视桌面或双重显示则此值可能大于VERTRES;


 
  SCALINGFACTORX:打印机x轴的比例系数;SCALINGFACTORY:打印机y轴的比例系数。


 
  BLTALIGNMENT:在Windows NT中作为像素倍数的水平绘图调整,对于最好的绘图操作,窗口绘图应该是水平调整到此值的倍数。0显示设备为加速的,且可用任何调整。


 
  SHADEBLENDCAPS:在Windows 98、Windows NT 5.0和以后版本中此值显示设备的阴影和混合特性。


 
  SB_CONST_ALPHA:处理BLENDFUNCTION结构中的Source constantAlpha元素,并通过AlphaBlend数中的blendFunction参数来指定;


 
  SB_GRAD_RECT:进行Gradientfill矩形填充的能力。SB_GRAD_TRI;进行Gradientfill三角形填充的能力;


 
  SB_NONE:设备不支持这些特性中的任何一个。SB_PIXEL_ALPHA:处理AlphaBlond中每一个像素Alphx;


 
  SB_PREMULT_ALPHA:在Alphablend中对alpha进行预乘;


 
  RASTERCAPS:设备所支持的光栅性能,可以是下列值的某种组合;


 
  RC_BANDING:需要联合支持。RC_BITBLT:支持传送位图。


 
  RC_BITMAP64:支持大于64K的位图。RC_DI_BITMAP:支持SetDIBits和GetDIBits函数。


 
  RC_DIBTODEV:支持SetDIBits To Device函数;RC_FLOODFILL:支持连续填充


 
  RC_GDI20_OUTPUT:支持16位Windows 2.0特征;RC_PALETTE:指定一个基于调色板的设备。


 
  RC_SCALING:支持缩放;RC_STRETCHBLT:支持StretchBlt函数。


 
  RC_STRETCHDIB:stretchDIBits函数。


 
  CURVECAPS:显示设备所支持的曲线性能,可以是下列值的某种组合。


 
  CC_NONE:不支持绘制曲线;CC_CHORD:支持绘制弦;CC_CIRCLES:支持绘制圆。


 
  CC_ELLIPSES:支持绘制椭圆;CC_INTERIORS:支持内部填充;CC_PIE:支持绘制扇形图。


 
  CC_ROUNDRECT:支持绘制圆角矩形;CC_STYLED:支持绘制带风格的边界。


 
  CC_WIDE:支持绘制宽的边界;CC_WIDESTYLED:支持绘制宽的、带风格的边界。


 
  LINECAPS设备所支持的画线性能,可以是下列值的某种组合:


 
  LC_NONE:不支持绘制线段;LC_INTERIORS:支持内部填充;LC_MARKER:支持绘制标记符。


 
  LC_POLYLINE:支持折线;LC_POLYMARKER:支持多种标记符;LC_STYLED:带风格的线段。


 
  LC_WIDE:支持画宽线;LC_WIDESTYLED:支持宽的带风格的线段。


 
  POLYGONALCAPS设有所支持的多边形性能。可以是下列值的某种组合。


 
  PC_NONE:不支持绘制多边形;PC_INTERIORS:支持内部填充;PC_POLYGON:支持绘制间隔式填充多边形。


 
  PC_RECTANGLE:支持绘制矩形;PC_SCANLINE:支持绘制扫描线;PC_STYLED:支持绘制带风格的边界。


 
  PC_WIDE:支持绘制宽边界;PC_WIDESTYLED:支持绘制宽的带风格的边界。


 
  PC_WINDPOLYGON:支持绘制折线式填充多边形。


 
  TEXTCAPS设备所支持的文字性能,可以是下列值的某种组合:


 
  TC_OP_CHARACTER:支持字符输出精度;TC_OP_STROKE:支持笔画输出精度。


 
  TC_CP_STROKE:支持笔画剪切精度;TC_CR_90:支持字符作90度旋转;


 
  TC_CR_ANY:支持字符作任意角度旋转;TC_SF_X_YINDEP:支持x和y方向的独立缩放。


 
  TC_SA_DOUBLE:支持把字符放大一倍;TC_SA_INTEGER:支持整数倍缩放。


 
  TC_SA_CONTIN:支持以任何倍数的严格缩放;TC_EA_DOUBLE:支持字符加重。


 
  TC_IA_ABLE:支持斜字体;TC_UA_ABLE:支持下划线;TC_SO_ABLE:支持删除线。


 
  TC_RA_ABLE:支持光栅字体;TC_VA_ABLE:支持矢量字体;TC_RESERVED:保留、必须为零。


 
  TC_SCROLLBLT:不支持用位快传递来滚动,注意这可能事与愿违。


 

C#参数

 

  所有类型均声明为Int或者INT32即可


 
  DRIVERVERSION = 0


 
  TECHNOLOGY = 2


 
  HORZSIZE = 4


 
  VERTSIZE = 6


 
  HORZRES = 8


 
  VERTRES = 10


 
  BITSPIXEL = 12


 
  PLANES = 14


 
  NUMBRUSHES = 16


 
  NUMPENS = 18


 
  NUMMARKERS = 20


 
  NUMFONTS = 22


 
  NUMCOLORS = 24


 
  PDEVICESIZE = 26


 
  CURVECAPS = 28


 
  LINECAPS = 30


 
  POLYGONALCAPS = 32


 
  TEXTCAPS = 34


 
  CLIPCAPS = 36


 
  RASTERCAPS = 38


 
  ASPECTX = 40


 
  ASPECTY = 42


 
  ASPECTXY = 44


 
  SHADEBLENDCAPS = 45


 
  LOGPIXELSX = 88


 
  LOGPIXELSY = 90


 
  SIZEPALETTE = 104


 
  NUMRESERVED = 106


 
  COLORRES = 108


 
  PHYSICALWIDTH = 110


 
  PHYSICALHEIGHT = 111


 
  PHYSICALOFFSETX = 112


 
  PHYSICALOFFSETY = 113


 
  SCALINGFACTORX = 114


 
  SCALINGFACTORY = 115


 
  VREFRESH = 116


 
  DESKTOPVERTRES = 117


 
  DESKTOPHORZRES = 118


 
  BLTALIGNMENT = 119


 
  返回值:返回值指定所需项目的值。 



  GetDeviceCaps提供下列六个索引以代替打印机消失。


 
  PHYSICALWIDTH GETPHYSPAGESIZE; PHYSICALHEIGHT GETPHYSPAGESIZE


 
  PHYSICALOFFSETX GETPRINTINGOFFSET;


 
  PHYSICALOFFSETY GETPHYSICALOFFSET;


 
  SCALINGFACTORX GETSCALINGFACTOR;


 
  SCALINGFACTORY GETSCALINGFACTOR;


 
  Windows CE:Windows CE不支持nIndex参数取下列值:


 
  VREFRESH; DESKTOPHORZRES; DESKTOPVERTRES;BLTALIGNMENT


 
  Windows CE 1.0不支持nIndex参数取下列值:


 
  PHYSICALWIDTH; PHYSICALHEIGHT; PHYSICALOFFSETX; PHYSICALOFFSETY


 
  速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:wingdi.h;库文件:gdi32.lib。


 


  GetDeviceCaps(HORZSIZE)


 
  HORZSIZE 以毫米为单位的显示宽度


 
  VERTSIZE 以毫米为单位的显示高度


 
  HORZRES 以像素为单位的显示宽度 0~65535


 
  VERTRES 以像素为单位的显示高度 0~65535


 
  LOGPIXELSX 像素/逻辑英寸(水平)


 

  LOGPIXELSY 像素/逻辑英寸(垂直)




int iHORZSIZE=pDC->GetDeviceCaps(HORZSIZE); // 得到当前显示设备的水平大小(毫米)
int iVERTSIZE=pDC->GetDeviceCaps(VERTSIZE); // 得到当前显示设备的垂直大小(毫米)
int iHORZRES=pDC->GetDeviceCaps(HORZRES); // 得到当前显示设备的水平像素数
int iVERTRES=pDC->GetDeviceCaps(VERTRES); // 得到当前显示设备的垂直像素数
int iLOGPIXELSX=pDC->GetDeviceCaps(LOGPIXELSX); // 得到当前显示设备的水平单位英寸像素数
int iLOGPIXELSY=pDC->GetDeviceCaps(LOGPIXELSY); // 得到当前显示设备的垂直单位英寸像素数
int iPHYSICALWIDTH=pDC->GetDeviceCaps(PHYSICALWIDTH); // 得到当前打印设备的水平大小(毫米)
int iPHYSICALHEIGHT=pDC->GetDeviceCaps(PHYSICALHEIGHT); // 得到当前打印设备的水平大小(毫米)

验证结果:
1.对于打印设备来说完全正确,可以利用上述参数在打印时得到与实际尺寸一致的结果。
2.对于打印设备来说上面的三组参数存在运算关系
iHORZSIZE=iHORZRES*25.4/iLOGPIXELSX;
iVERTSIZE=iVERTRES*25.4/iLOGPIXELSY;
3.对于显示设备来说,LOGPIXELSX和LOGPIXELSY得到的结果和Windows设置的字体有关,100%时为96dpi,150%时为144dpi。
4.至少对我目前的笔记本显示器来说,上述函数调用得到结果只有iHORZRES和iVERTRES是准确的,LOGPIXELSX和LOGPIXELSY为96(我设置的是正常字体),而iHORZSIZE和iVERTSIZE似乎是用72dpi计算出来的:
iHORZSIZE=iHORZRES*25.4/72;
iVERTSIZE=iVERTRES*25.4/72;
不知这个72dpi从何而来
5.对我的笔记本显示器,经验证,改变分辨率和windows字体大小时,3和4的结论都正确,72dpi不变
6.PHYSICALWIDTH和PHYSICALHEIGHT这组参数,只对打印设备有效,得到是当前打印机纸张的全部像素数,而iHORZRES和iVERTRES得到的都是可打印范围的像素数,对显示设备这组参数返回值为0
7.Google结果显示可用读注册表中显示器的EDID信息得到显示器的物理尺寸,比较复杂,研究中

0 0