高DPI下界面错乱的解决方法和原理

来源: http://bbs.csdn.net/topics/370177760

我在win32 + c写的界面中解决办法,就是把字体的字号给固定了,这样做的结果就是,不管dpi是否有改变,界面中控件的文字的字号不变,就不会出现文字换行的情况。

但像菜单文字的字号就变大了,combobox(右三角),checkbox(选择框)变大一点点,显的有点不协调。

但至少不影响使用。

下面是判断当前系统的dpi,然后重置字体的字号。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

//高DPI下界面错乱的解决方法

        HWND hwnd_desktop = GetDesktopWindow();

        HDC hdc = GetWindowDC(hwnd_desktop);

        int dpi = GetDeviceCaps(hdc, LOGPIXELSX);

        //printf("hwnd_desktop:%ld, dpi:%d\n", hwnd_desktop, dpi);

        ReleaseDC(hwnd_desktop, hdc);

        int dpi_diff = dpi - 96; //开发平台默认的dpi: 96

        if(dpi_diff > 0)

        {           

            float zoom = dpi_diff * 1.041666 / 100 + 1;

            

            lgf.lfWidth =  lgf.lfWidth / zoom;

            lgf.lfHeight = lgf.lfHeight / zoom;

            //printf("width:%ld, height:%ld\n", lgf.lfWidth, lgf.lfHeight);

        }

一般很少或者不开发产品的朋友可能不会发现。你可以在标准96DPI(一般情况下都是)下,新建一个窗体,载入一个小图片,窗体大小调整为刚好能容纳下图片。生成EXE文件。修改DPI值为120(即125%缩放,XP下桌面-属性-高级里面找,WIN7>屏幕分辨率->放大或缩小其他项目->中等)。系统会要求注销,注销后再进入系统运行EXE程序。马上会看到恶心的结果:窗体被扩大,而图片大小依旧,造成多出来的窗体部分空白。丑陋。如果在加上几个其他空间,丑陋效果更明显:

【普及个知识:】

屏幕坐标计量单位,分为逻辑和物理坐标(单位),物理坐标为像素点、厘米等;逻辑坐标为缇、DPI等DPI是指单位面积内像素的多少。例如,在96默认DPI下1英寸屏幕有96点像素,如果在120DPI下1英寸有120个像素点。缇是VB6中默认的计量单位,96DPI下15缇等于1像素,120DPI下12缇等于1像素。因此,就造成了不同DPI下窗体控件大小会随着DPI值增加而放大,原本设计时就比较大的窗体在高DPI下甚至会超出屏幕边界,还有其他更多问题。

我在 DPI:120下,测试用vb写的界面,发现会窗口和控件会自动放大尺寸,展示效果没有受到DPI的影响,估计与使用的逻辑坐标(单位)有关。

【解决思路】

断断续续想了很久,经过研究,终于发现导致界面错乱的所有原理原因和解决办法。

1.原理原因:界面错乱的关键在于DPI变化后,系统会将程序可视化界面和控件按比例放大。那么使用逻辑坐标(计量单位)就变得不可靠,因为他们都是通过物理单位换算而成,均会受到DPI变化影响,特别是VB6计量单位--缇。完全就是于DPI有着直接的换算关系(96DPI下15缇等于1像素,120DPI下12缇等于1像素)。那么什么单位才可靠呢?答案是--像素、厘米、毫米!锁住界面大小不让缩放的最终就是要锁定三个东西:高度像素值、宽度像素值、控件所位于窗体内的坐标像素值

2.以上这三者被锁定固定大小,界面就将“稳定”不再受到系统DPI干扰。那么:缇(逻辑单位)--像素(物理单位)--DPI(逻辑单位) 这三者间又是怎么换算的?公式还是:96DPI下15缇等于1像素,120DPI下12缇等于1像素;DPI每增加1,就放大1.041666倍。(1440/DPI值=X,X缇=1像素;1.041666是1.014666666666667的约值,如何计算活动省略,知道即可)

3.不仅仅界面和控件放大了,连字体都给放大了!96DPI下的9磅(默认)字体,同比120DPI下的9磅字体小了很多很多。要固定到96DPI 9磅字体的大小,就要使用到这上面这句“DPI每增加1,就放大1.041666倍”。判断当前客户机DPI,减去标准的96,所得值乘以1.041666,所得值为倍数,单位(%)。如120DPI-96=24,24X1.041666%约等于25%,再加上1就是125%。即120DPI比96DPI放大了125%

【总结】

96DPI下获得窗体、控件高度宽度和坐标(left,top)的缇数。除以15便是其物理单位---像素值。之后到客户机上,立即获得其DPI值,获得值为X,将1440除以X获得一个值。这时,窗体、控件高度宽度坐标(LEFT,TOP)缇数就应该为:(原缇数/15)*(1440/现DPI值);(解释:)这样所得到的就是设计时窗体、控件高宽和所在坐标的物理值(像素),之后再根据客户机DPI将这个物理值计算成合适的新缇数。

2014-08-11

时间: 2024-07-30 13:35:47

高DPI下界面错乱的解决方法和原理的相关文章

android设计的布局在阿拉伯语下界面错乱的解决方法

(1)正在AndroidManifest.xml声明文件的application元素中,增加" android:supportsRtl=true" (2)建] androidの设计的布局在阿拉伯语下界面错乱的解决方法 (1)在AndroidManifest.xml声明文件的元素中,添加" android:supportsRtl=true" (2)修改应用程序中layout的"left/right"布局属性,改为对应的"start/end

img标签下多余空白BUG解决方法

在进行页面的DIV CSS排版时,遇到IE6(当然有时Firefox下也会偶遇)浏览器中的图片元素img下出现多余空白的问题绝对是常见的 对于该问题的解决方法也是“见机行事”. 1.将图片转换为块级对象 即,设置img为“display:block;”.在本例中添加一组CSS代码:“#sub img {display:block;}”. 2.设置图片的垂直对齐方式 即设置图片的vertical-align属性为“top,text-top,bottom,text-bottom”也可以解决.如本例中

IE6下fixed失效的解决方法

在网上找了好久,终于找到一种亲测有效的解决方法. <!--[if IE 6]> <script type="text/javascript"> (function($) { jQuery.fn.Fixed = function(options) { var defaults = { x:0, y:0 }; var o = jQuery.extend(defaults, options); var isIe6 = !window.XMLHttpRequest; v

linux安装Navicat,界面出现乱码解决方法 (转发)

环境:Centos7 下载Navicat:navicat112_mariadb_cs_x64.tar.gz 点击" ./start_navicat"安装出现界面便面为乱码 解决办法:打开start_navicat文件, export LANG="en_US.UTF-8" 改为 export LANG="zh_CN.UTF-8". 源文章:Ubuntu 安装Navicat,界面出现乱码解决方法:http://blog.csdn.net/u01085

CentOS7 下linux不能上网解决方法?,centos7 eth0 没有ip,IP突然丢失

CentOS7 下linux不能上网解决方法? 在CentOS VMware下安装好linux后,发现有时不能直接联网,特分享下总结出来的经验,希望对新手有用 工具/原料 XP系统 VMware.Workstation.v7.0以上 CentOS-5.5-i386-bin-DVD.iso 其他不同版本应该差不多 方法/步骤 虚拟机安装就不说了,从安装linux后测试发现不能联网,可以先终端重启下网卡 失败如图:   找到点击选择setting   在network Adapter选中,右侧是否是

【Vegas原创】安装rhel6.2,不能进图形化界面的终极解决方法

安装的时候,千万不要一路下一步,you should know,linux不是windows那么的傻瓜.   方法一: 在倒数最后一步,选择Desktop,而千万不要下一步,默认选择Basic Server,否则,安装后,是木有图形化界面滴. 方法二: 还有一种方法,就是如果选择基本服务器,记得选择现在定制,desktop的选项卡里,全部select all,否则还是进不到图形化界面.   其他的选项,可以按照需要,进行选择. [Vegas原创]安装rhel6.2,不能进图形化界面的终极解决方法

无法录制下拉菜单的解决方法

QTP默认录制方式无法录制下拉菜单,需修改设置后再录制 修改设置如下: 1.Record-> web event recording configuration -----custom settings... 展开Web objects 2.选中webelement,点击event -> add -> .并确定在record栏内,状态是enabled 3.重新录制你的脚本 4.录制完成后,执行脚本,若回放失败,是因为脚本只录制了鼠标的 事件,却没有录制click事件,所以脚本录制完后要手

VS2017无法进入安装界面问题的解决方法

VS2017无法进入安装界面问题的解决方法 打开C:\Program Files (x86)\Microsoft Visual Studio\Installer\vs_installer.exe也没有反应, 猜测可能是vs_installer.exe这里有问题,右键->属性->兼容性,勾选禁用视觉主题, 勾选禁用桌面元素,vs_installer.exe就可以运行了,Visual Studio2017Community也就可以安装了 原文地址:https://www.cnblogs.com/w

ubuntu下QT输出程序控制台界面难看的解决方法

这几天在ubuntu下装了QT5,但输出程序界面后,简直无法入目 于是,随便乱找后,终于找到解决方法 打开选项 在终端那行改下就行