测试环境Windows7x64,vb6.0

测试在XP系统下,DPI计算似乎没问题

Screen.TwipsPerPixelX=1440/DPI=1440/96=15
Screen.TwipsPerPixelX=1440/DPI=1440/120=12
Screen.TwipsPerPixelX=1440/DPI=1440/144=10

测试在Windows7下(x64,SP1),DPI为96或120时,各种主题下获取似乎都正确.
当DPI为100%(96),三种主题下,获取的值为15
当DPI为125%(120),三种主题下,获取的值为12
当DPI为150%(144),主题为Windows7(Aero)时,获取的值为15(不正确)
当DPI为150%(144),主题为经典或Basic时,获取的值为10

简单来说如果主题为Windows7默认,DPI为150%时,获取的Screen.TwipsPerPixelX和Screen.TwipsPerPixelY将不准确.
用Screen.Width / Screen.TwipsPerPixelX计算分辨率也就不正确了


上图是在Basic主题下截图


上图是在经典主题下截图


上图是在Windows7下截图


从Windows7主题切换到其他主题时,可以看到最后一个窗口的实际显示比例和另外两个不同

图片未做任何处理,使用的Print截屏(PS.水印请忽略,先注册的CSDN然后发现广告太多,重注册了博客园)
发现Screen.Width和Screen.Height两个值在Windows7主题下也有5点误差,不知道是否显示器的问题,不知道是否与显示器有关.

因为在Windows7主题下打开的窗体切换之后和其他窗体不一样大,但在125%DPI时没有这个问题,推测很可能是Windows7本身的问题.

Private Sub Command1_Click()
屏幕宽度 = Screen.Width / Screen.TwipsPerPixelX
屏幕高度 = Screen.Height / Screen.TwipsPerPixelY 窗体宽度 = Me.Width / Screen.TwipsPerPixelX
窗体高度 = Me.Height / Screen.TwipsPerPixelY 窗体工作区宽度 = Me.ScaleWidth / Screen.TwipsPerPixelX
窗体工作区高度 = Me.ScaleHeight / Screen.TwipsPerPixelY 屏幕宽度比 = Screen.TwipsPerPixelX
屏幕高度比 = Screen.TwipsPerPixelY 窗体两侧边框 = 窗体宽度 - 窗体工作区宽度
框体上下边框 = 窗体高度 - 窗体工作区高度 Text1 = ""
Text1 = Text1 & "屏幕宽度" & 屏幕宽度 & vbCrLf
Text1 = Text1 & "屏幕高度" & 屏幕高度 & vbCrLf
Text1 = Text1 & "窗体宽度" & 窗体宽度 & vbCrLf
Text1 = Text1 & "窗体高度" & 窗体高度 & vbCrLf
Text1 = Text1 & "窗体工作区宽度" & 窗体工作区宽度 & vbCrLf
Text1 = Text1 & "窗体工作区高度" & 窗体工作区高度 & vbCrLf
Text1 = Text1 & "屏幕宽度比" & 屏幕宽度比 & vbCrLf
Text1 = Text1 & "屏幕高度比" & 屏幕高度比 & vbCrLf
Text1 = Text1 & "窗体两侧边框" & 窗体两侧边框 & vbCrLf
Text1 = Text1 & "框体上下边框" & 框体上下边框 & vbCrLf Text1 = Text1 & "Screen.Width" & Screen.Width & vbCrLf
Text1 = Text1 & "Screen.Height" & Screen.Height & vbCrLf Text1 = Text1 & "Me.Width" & Me.Width & vbCrLf
Text1 = Text1 & "Me.Height" & Me.Height & vbCrLf Text1 = Text1 & "Me.ScaleWidth" & Me.ScaleWidth & vbCrLf
Text1 = Text1 & "Me.ScaleHeight" & Me.ScaleHeight & vbCrLf Text1 = Text1 & "Me.Left" & Me.Left & vbCrLf
Text1 = Text1 & "Me.Top" & Me.Top & vbCrLf
End Sub

补充测试:
ScaleX方法测试结果也不准确
API函数GetSystemMetrics获取的分辨率也不准确
API函数GetDeviceCaps获取的分辨率也不准确

Me.ScaleX(1, 3, 1)等同于Screen.TwipsPerPixelX
GetSystemMetrics(0)等同于Screen.Width / Screen.TwipsPerPixelX
GetSystemMetrics(1)等同于Screen.Height / Screen.TwipsPerPixelY

Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long

Private Sub Command2_Click()
Dim dpi_x As Single, dpi_y As Single, px_twip As Single
dpi_x = Me.ScaleX(Screen.Width, , ) / Me.ScaleX(Screen.Width, , )
dpi_y = Me.ScaleY(Screen.Height, , ) / Me.ScaleY(Screen.Height, , )
px_twip = Me.ScaleX(, , ) Text1 = Text1 & "1像素 = " & Me.ScaleX(, , ) & " 缇" & vbCrLf
Text1 = Text1 & "1像素 = " & Me.ScaleY(, , ) & " 缇" & vbCrLf
Text1 = Text1 & "DPI_X = " & dpi_x & " " & vbCrLf
Text1 = Text1 & "DPI_Y = " & dpi_y & " " & vbCrLf
Text1 = Text1 & "API获取分辨率:" & GetSystemMetrics(0) & "x" & GetSystemMetrics(1) & vbCrLf
    hdc = CreateDC("display", 0, 0, 0)
Text1 = Text1 & "API获取Pixel:" & GetDeviceCaps(hdc, 8) & "x" & GetDeviceCaps(hdc, 10)
Text1 = Text1 & "API获取DPI:" & GetDeviceCaps(hdc, 88) & "x" & GetDeviceCaps(hdc, 90)
End Sub

在Windows7中的DPI与主题的问题的更多相关文章

  1. Windows7 中常用的一些DOS命令总结

    Windows7 中常用的一些DOS命令总结... ----------------------- -------------------------------------------- dos,是 ...

  2. [转载]windows7中没用boot.ini文件而是改用BCDEDIT来配置了

    原文地址:windows7中没用boot.ini文件而是改用BCDEDIT来配置了作者:开心骝哥 本人安装的Win7,因为机上有两个系统,一个dos系统,一个win7系统,开机时总是会在系统选择的界面 ...

  3. 在 windows7 中使用 vs2003 时,“在文件中查找”导致无响应的问题

    解决 Win7 32bit/64bit环境下,在使用VS2003的查找功能时,会导致VS2003无响应. 解决方法:找到VS2003的安装目录,修改"...\Microsoft Visual ...

  4. 批量删除Windows7中隧道适配器的方法

    批量删除Windows7中隧道适配器的方法 1.在网卡属性的"网络"中,将"Internet协议版本(TCP/IPv6)"前面的勾去掉. 2.在CMD下分别执行 ...

  5. Windows7中启动Mysql服务时提示:拒绝访问的一种解决方式

    场景 在Windows7中打开任务管理器--服务下 找到mysql的服务点击启动时提示: 拒绝访问 这是因为权限不够导致的不能启动sql服务. 点击 任务管理器右下角的服务 在这里就可以正常启动服务

  6. 在Windows7中的各种显示模式中桌面图标的尺寸

    在Windows7中的各种显示模式中,图标的尺寸 window7 桌面icon设计尺寸大小桌面图标设计尺寸一般是多少超大图标:256X256大图标:128X128中图标:32X32平铺:32X32列表 ...

  7. 在Windows7中打开照片,提示“Windows 照片查看器无法显示此图片,因为计算机上的可用内存可能不足。....”

    在Windows7中打开照片,提示"Windows 照片查看器无法显示此图片,因为计算机上的可用内存可能不足.请关闭一些目前没有使用的程序或者释放部分硬盘空间(如果硬盘几乎已满),然后重试. ...

  8. Windows7中IIS简单安装与配置(详细图解)

    最近工作需要IIS,自己的电脑又是Windows7系统,找了下安装的方法,已经安装成功.在博客里记录一下,给需要的朋友,也是给自己留个备份,毕竟我脑子不是很好使. 一.首先是安装IIS.打开控制面板, ...

  9. windows7 中开启无线热点

    我用的是移动的 CMCC-EDU 上网,但是这个只能在一个设备上登陆,那么问题就来了,当我电脑需要用网,手机也想要用网(不用 2/3/4G)该怎么办? 电脑操作系统:windows7 接下来是开启 w ...

随机推荐

  1. 一款Android图文识别与扫描软件

    OCR图文识别App 是一款准确高效的 OCR文字识别与扫描软件,识别准确度高,速度快,扫描文件清晰,可导出TXT.Excel. 免费使用. 技术 基于百度在业界领先的人工智能与深度学习技术,提供对身 ...

  2. MARKY一下。

    答:其实RUP整个流程都在讲SQA.业界常见的模型,譬如CMM/CMMI,六西格玛,ISO9000,RUP,它们做的基本上是同一件事情--都是在做流程改进,都在做质量控制,但是各自的侧重点不一样.像R ...

  3. MongoDB 4.0 开发环境搭建集群

    环境准备 Liunx 服务器一台 以下示例为单机版安装集群, 没有分片 MongoDB 安装 1.下载 MongoDB tgz 安装包: 可以从下载中心下载: https://www.mongodb. ...

  4. Dubbo的@Reference和@Service说明

    前言 @Reference 用在消费端,表明使用的是服务端的什么服务 @RestController public class RemoteUserController { @Reference(ve ...

  5. ansible基础-优化

    简介 当管理集群达到一定规模时,ansible达到性能瓶颈是难以避免的,此时我们可以通过一定手段提高ansible的执行效率和性能. 笔者虽未管理过超大规模服务器,但也通过查找资料和咨询大神了解了一些 ...

  6. ansible基础-变量

    一 变量的命名规范 变量的命名应该符如下合两个规范: 变量应该由字母.数字.下划线组成 变量应该以字母开头 例如:host_port.HOST_PORT.var5是符合命名规范的,foo-port. ...

  7. decorator(修饰器)的业务应用

    decrator(修饰器)的业务应用 ES6问世的时间也不短了,而且很多时候对ES6所谓的"熟练应用"基本还停留在下面的几种api应用: const/let 箭头函数 Promis ...

  8. javaScript设计模式之面向对象编程(object-oriented programming,OOP)--寄生组合式继承

    组合式继承:将类式继承同构造函数继承组合使用,但是存在一个问题,子类不是父类的实例,而子类的原型式父类的实例,所以才有了寄生组合式继承. 意思就是说,寄生就是寄生式继承,寄生式继承就是依托于原型继承, ...

  9. 干货|一文读懂 Spring Data Jpa!

    有很多读者留言希望松哥能好好聊聊 Spring Data Jpa!其实这个话题松哥以前零零散散的介绍过,在我的书里也有介绍过,但是在公众号中还没和大伙聊过,因此本文就和大家来仔细聊聊 Spring D ...

  10. DotNetCore跨平台~EFCore2.0连接Mysql的烦恼-已解决

    回到目录 对于传统的nuget包,我们习惯上用官方或者大型组织的,因为它们比较考靠谱,但就在前两天.net core2.0发布后,我把efcore也升级到2.0了,mysql.EfCore也升级到支持 ...