在Windows7中的DPI与主题的问题
测试环境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与主题的问题的更多相关文章
- Windows7 中常用的一些DOS命令总结
Windows7 中常用的一些DOS命令总结... ----------------------- -------------------------------------------- dos,是 ...
- [转载]windows7中没用boot.ini文件而是改用BCDEDIT来配置了
原文地址:windows7中没用boot.ini文件而是改用BCDEDIT来配置了作者:开心骝哥 本人安装的Win7,因为机上有两个系统,一个dos系统,一个win7系统,开机时总是会在系统选择的界面 ...
- 在 windows7 中使用 vs2003 时,“在文件中查找”导致无响应的问题
解决 Win7 32bit/64bit环境下,在使用VS2003的查找功能时,会导致VS2003无响应. 解决方法:找到VS2003的安装目录,修改"...\Microsoft Visual ...
- 批量删除Windows7中隧道适配器的方法
批量删除Windows7中隧道适配器的方法 1.在网卡属性的"网络"中,将"Internet协议版本(TCP/IPv6)"前面的勾去掉. 2.在CMD下分别执行 ...
- Windows7中启动Mysql服务时提示:拒绝访问的一种解决方式
场景 在Windows7中打开任务管理器--服务下 找到mysql的服务点击启动时提示: 拒绝访问 这是因为权限不够导致的不能启动sql服务. 点击 任务管理器右下角的服务 在这里就可以正常启动服务
- 在Windows7中的各种显示模式中桌面图标的尺寸
在Windows7中的各种显示模式中,图标的尺寸 window7 桌面icon设计尺寸大小桌面图标设计尺寸一般是多少超大图标:256X256大图标:128X128中图标:32X32平铺:32X32列表 ...
- 在Windows7中打开照片,提示“Windows 照片查看器无法显示此图片,因为计算机上的可用内存可能不足。....”
在Windows7中打开照片,提示"Windows 照片查看器无法显示此图片,因为计算机上的可用内存可能不足.请关闭一些目前没有使用的程序或者释放部分硬盘空间(如果硬盘几乎已满),然后重试. ...
- Windows7中IIS简单安装与配置(详细图解)
最近工作需要IIS,自己的电脑又是Windows7系统,找了下安装的方法,已经安装成功.在博客里记录一下,给需要的朋友,也是给自己留个备份,毕竟我脑子不是很好使. 一.首先是安装IIS.打开控制面板, ...
- windows7 中开启无线热点
我用的是移动的 CMCC-EDU 上网,但是这个只能在一个设备上登陆,那么问题就来了,当我电脑需要用网,手机也想要用网(不用 2/3/4G)该怎么办? 电脑操作系统:windows7 接下来是开启 w ...
随机推荐
- Android-----Intent中通过startActivity(Intent intent )显式启动新的Activity
Intent:即意图,一般是用来启动新的Activity,按照启动方式分为两类:显式Intent 和 隐式Intent 显示Intent就是直接以“类名称”来指定要启动哪一个Activity:Inte ...
- Nginx反向代理解决iframe跨域问题
前言 这几天有个需求:做个表单页面,要求后台人员能自定义发布表单,用户来填写表单.我一想,这不麦克表单有现成的吗,拿来就用!发布表单后,可以选择使用iframe方式嵌入网站,一切顺利. 当时的网站是h ...
- 分布式之 BASE理论
------------------------------珍惜眼前的学习机会,当你现在有机会学习各种经验时,一定要倍加珍惜.靠混日子是混不了一辈子的,许多过程都是不能省略的,至少学会这些经验可以让你 ...
- 过程 sp_addextendedproperty, 对象无效。不允许有扩展属性,或对象不存在。
过程 sp_addextendedproperty, 对象无效.不允许有扩展属性,或对象不存在. 首先这个是创建数据表的SQL,有Power Designer创建模型,直接生成的创建SQL会出现的问题 ...
- PermissionDialog【权限申请提示对话框】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 随着Android6.0的普及,权限申请也变成了我们开发中必写的一段代码.比如sd卡权限.定位权限.拍照权限,这些几乎都是每个app ...
- 【Python3爬虫】斗鱼弹幕爬虫
在网上找到了一份斗鱼弹幕服务器第三方接入协议v1.6.2,有了第三方接口,做起来就容易多了. 一.协议分析 斗鱼后台协议头设计如下: 这里的消息长度是我们发送的数据部分的长度和头部的长度之和,两个消息 ...
- Mac下安装多版本python
1.安装Homebrew 将命令行复制至终端,进行安装. /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/H ...
- 浅析关于java的一些基础问题(上篇)
要想让一个问题变难,最基本有两种方式,即极度细化和高度抽象.对于任何语言的研究,良好的基础至关重要,本篇文章,将从极度细化的角度 来解析一些java中的基础问题,这些问题也是大部分编程人员的软肋或易混 ...
- 【转载】java 中变量的存储位置
原文链接点这里,感谢博主分享 * 寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. * 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出 ...
- Springboot 系列(十)使用 Spring data jpa 访问数据库
前言 Springboot data jpa 和 Spring jdbc 同属于 Spring开源组织,在 Spring jdbc 之后又开发了持久层框架,很明显 Spring data jpa 相对 ...