NSIS对话框单位造成的控件移位问题

Posted 国立秀才

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NSIS对话框单位造成的控件移位问题相关的知识,希望对你有一定的参考价值。

在使用NSIS脚本开发安装卸载程序,使用自定义的nsdialog控件。发现在小部分系统上安装时,一些控件会消失,或者挪位。于是排除问题,看看这些控件的为位置和坐标,发现基本上是使用了对话框单位的控件,才会出现这种问题。

 

 

 

看来在这些出问题的系统里,1对话框单位对应更多的像素。下边插讲下NSIS的nsdialog库里的三种单位。

 

========================================================================================

nsDialogs.nsh 中的宏 ${NSD_Create*}。这些宏,每个都带有 5 个参数 - x, y, width, height 和 text. 每个宏也都会返回一个值到堆栈,那就是新控件的 HWND。如同对话框的 HWND,它必须从堆栈中被弹出并保存下来。

宏使用的所有尺寸单位均可使用以下三种单位类型中的任一种:像素、对话框单位或对话框尺寸的百分比。你可以指定负值,这表示距离是从右端或底部算起。要使用对话框单位,数值后面必须加上后缀符 u。要使用百分比单位,数值后面必须加上百分符 - %。此外,有无其它的后缀符均表示像素。

如下所示:

Var Text

${NSD_CreateText} 0 13u 100% -13u "Type something here..."

Pop $Text

===========================================================================================

 

我猜测可能跟系统的分辨率或者字体有关系。但是在不同分辨率电脑上测试,发现分辨率对这个没有影响。那就测试字体,发现系统字体以及字体大小的更改对这个影响也不大。

不管了,先把所有的对话框单位“u”,经过大概的换算,算成像素单位算了。然后去出现问题的电脑上测试,发现还是字的大小不对,在是正常电脑上没问题。如果按照出问题的电脑去算像素的话,那么正常电脑上肯定会对不上了。是个难题。

那就干脆比较两个电脑系统里的显示属性。发现可能是ClearType设置造成的影响。于是在正常的电脑上,更改ClearType,然后运行安装包。问题重现了。这样就好办了。

 

 

如果ClearType不是系统默认的100%,那么NSIS里显示字体就会有问题。会根据ClearType的百分率大小而变化。定位到了问题就可以找到解决办法了。

方案:y轴用像素单位,保证控件能显示出来,窗体底部的控件在ClearType大于100%时,不会跑到窗体下边去。x轴和控件大小采用对话框单位,保证字体能一行显示。

${NSD_Createcheckbox} 98u 360 80u 16u  "开始菜单快捷方式" 

${NSD_CreateText} 20u 360 100% -13u "Type something here..."

===================================================================

附:NSIS nsDialog插件(中文简体翻译)http://www.xuebuyuan.com/865271.html

以上是关于NSIS对话框单位造成的控件移位问题的主要内容,如果未能解决你的问题,请参考以下文章

NSIS - 使用命令行参数跳过某些对话框?

Android 开发 -- 开发第一个安卓程序Android UI开发(布局的创建:相对布局和线性布局控件单位:px pt dp sp常用控件 常见对话框ListView)

nsis error解决方法

stretchblt为啥会造成图片失真

NSIS安装包脚本

加载 twitter 引导模式对话框时,如何防止正文滚动条和移位?