2024年2月21日发(作者:)

VB中利用API获取屏幕DPI值

在屏幕上放置三个label控件,分别为label1 , label2 , label3

******************************************************

Private Declare Function GetDC Lib "" (ByVal hwnd As Long) As Long

Private Declare Function GetDeviceCaps Lib "" (ByVal hdc As Long, ByVal nIndex As

Long) As Long

Private Const LOGPIXELSX As Long = 88

Private Const LOGPIXELSY As Long = 90

Private Sub Form_Load()

Dim dpi_x As Long

Dim dpi_y As Long

Dim hdc0 As Long

hdc0 = GetDC(0)

dpi_x = GetDeviceCaps(hdc0, LOGPIXELSX)

dpi_y = GetDeviceCaps(hdc0, LOGPIXELSY)

Label1 = "DPI_X=" & dpi_x

Label2 = "DPI_Y=" & dpi_y

Label3 = "1 像素 = " & 1440 / dpi_x & " 缇"

End Sub

****************************************************************

以下为API函数说明

GetDeviceCaps

VB声明

Declare Function GetDeviceCaps Lib "gdi32" Alias "GetDeviceCaps" (ByVal hdc As Long, ByVal nIndex

As Long) As Long

说明

根据指定设备场景代表的设备的功能返回信息

返回值

Long,参见GetDeviceCaps索引表

参数表

参数

hdc

nIndex

类型及说明

Long,要查询其设备的信息的设备场景

Long,根据GetDeviceCaps索引表所示常数确定返回信息的类型

Top

GetDC

VB声明

Declare Function GetDC Lib "user32" Alias "GetDC" (ByVal hwnd As Long) As Long

说明

获取指定窗口的设备场景

返回值

Long,指定窗口的设备场景句柄,出错则为0

参数表

参数

hwnd

注解

若窗口所属类具有CS_OWNDC, CS_CLASSDC 或 CS_PARENTDC样式,则获取的设备场景属窗口或类专有。vb的窗体和图片框控件也是这种情况,它用该函数取得的结果和控件的hdc属性相同(在autoredraw为FALSE时)。您无须考虑取回的窗体或图片框控件设备场景的默认状态,特别是绘图对象。另外,默认状态随着窗体和控件autoredraw属性的设置而不同。在设备场景释放前您必须回复其状态为初始值。对于没有CS_OWNDC, CS_CLASSDC 或 CS_PARENTDC样式的窗口的设备场景,可从通用windows缓存中获取,其状态为默认值。缓存中可用设备场景数量是有限的,因此只要可能就释放设备场景

用本函数获取的设备场景一定要用ReleaseDC函数释放,不能用DeleteDC

Top

GetDeviceCaps索引表

常数

DRIVERVERSION

返回信息

设备驱动程序版本

下列常数之一:

TECHNOLOGY

DT_PLOTTER:绘图仪。DT_RASDISPLAY:光栅显示器。DT_RASPRINTER:光栅打印机。DT_RASCAMERA:光栅照相机。DT_CHARSTREAM:字符流。DT_METAFILE:图元文件。DT_DISPFILE:显示文件

HORZSIZE

VERTSIZE

HORZRES

VERTRES

LOGPIXELSX

以毫米为单位的显示宽度

以毫米为单位的显示高度

以像素为单位的显示宽度

以像素为单位的显示高度

像素/逻辑英寸(水平)

类型及说明

Long,将获取其设备场景的窗口的句柄。若为0,则要获取整个屏幕的DC

LOGPIXELSY

BITSPIXEL

PLANES

NUMBRUSHES

NUMPENS

NUMMARKERS

NUMFONTS

NUMCOLORS

ASPECTX

ASPECTY

ASPECTXY

PDEVICESIZE

像素/逻辑英寸(垂直)

位/像素(每个调色板)

调色板个数

设备内建刷子个数

设备内建画笔个数

设备内建标记数

设备内建字体数

设备颜色表入口

设备像素宽度(见ASPECTXY)

设备像素高度(见ASPECTXY)

设备像素对角尺寸。这些值是互相对应的,比如((ASPECTX^2)+(ASPECTY^2))^.5

= ASPECTXY

PDEVICE内部结构的大小

下列常数之一:

CLIPCAPS

CP_NONE:设备没有内建剪切

CP_RECTANGLE:设备可剪切矩形

CP_REGION:设备可剪切区域

SIZEPALETTE

NUMRESERVED

BLTALIGNMENT

COLORRES

DESKTOPHORIZRES

DESKTOPVERTRES

PHYSICALOFFSETX

系统调色板入口(见RASTERCAPS RC_PALETTE标志)

系统调色板保留入口

有的显示设备在图象对齐本常数值指定的地址范围时可更快的完成图象运算。若没有区别则为0

颜色分辨率(以位/像素位单位,见RASTERCAPS RC_PALETTE标志)

桌面水平和垂直分辨率(仅适用于NT)。某些设备支持虚拟桌面可比物理显示尺寸大

打印机的可打印区的水平/垂直偏移

PHYSICALOFFSETY

PHYSICALHEIGHT

以设备单元表示的打印页面物理高/宽度

PHYSICALWIDTH

SCALINGFACTORX

打印机水平和垂直缩放系数

SCALINGFACTORY

VREFRESH 显示垂直刷新(只适用于NT)

由下列值组成的标志:

R_BANDING:设备支持频带。RC_BIGFONT:字体可大于64K。RC_BITBLT:支持BitBlt。RC_BITMAP64K:位图可大于64K。RC_DI_BITMAP:支持SetDIBits和RASTERCAPS GetDIBits函数。RC_DIBTODEV:支持SetDIBitsToDevice函数。RC_FLOODFILL:支持FloodFill API。RC_NONE:不支持光栅操作。RC_PALETTE:设备基于调色板。 RC_SAVEBITMAP:可存储位图。RC_SCALING:内建缩放。RC_STRETCHBLT:支持 StretchBlt 。RC_STRETCHDIB:支持StretchDIBits

CURVECAPS 描述内部曲线生成功能的标志。见api32。txt文件中关于CC_xxx的完整列表

LINECAPS

POLYGONCAPS

描述内部直线生成功能的标志。见api32。txt文件中关于LC_xxx的完整列表

描述内部多边形生成功能的标志。见api32。txt文件中关于PC_xxx的完整列表

由下列值组成的标志:

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_SCROLLBLT:支持光栅字体。TC_VA_ABLE: 支持矢量字体

TEXTCAPS