l 在设计窗体的时候需要考虑是否允许程序在不同DPI自适应窗体,不自适应的优点是在不同的DPI下看到的结果基本是一样的,缺点是可能在不同的DPI下看起来太小或者太大。
l 如果不想自适应窗体,则设置窗体的Scaled为False
l 如果需要自适应窗体,则设置窗体的Scaled为True(Delphi的窗体默认是允许Scaled的)
l 将AutoScroll属性设置为False并保存窗体,AutoScroll为True表示不在运行期改变窗体的大小,这样当窗体的字体和组件进行缩放时看起来就会很糟糕。(在Delphi 7下,如果窗体可以调整大小,则AutoScroll会自动设定为True,而我们大部分的程序都是可以改变窗体大小的,Delphi默认的窗体也是可以改变窗体大小的,所以很多时候窗体就被不小心设置为Scaled和AutoScroll都是True了)
l 将窗体的自己设置为可以自适应的TrueType字体,如Arial,Tahoma等;MS San Serif不是TrueType的,虽然大部分情况下看起来还行。(Delphi 2006调整了窗体的默认字体为Tahoma,可是之前版本的Delphi的窗体的默认字体都是MS San Serif,这个字体也是在Windows 2000等系统下看起来正常的中文字体到了Win98下却很小很丑的元凶)
l 如果使用的字体在运行的操作系统中没有,则Windows会自动在缺失字体的同一体系中选择一种替换字体,不过替换字体的大小与原来设定的字体很可能不同,这样也可能会导致问题。(可以通过向%WinDir%\Fonts添加字体,也可以通过系统消息向系统注册字体)
l 将窗体的Position属性设置为除poDesigned之外的值(Delphi 2006中的poDefaultPosOnly也不可以),因为如果设计的时候窗体被拉到Left为650的地方,那么窗体在640*480的分辨率下就会看不到了。
l 不要将窗体上的各个控件挤在一起,起码要给各个控件之间留4个像素的位置,这样当Border属性等导致控件变化的时候不会导致控件重叠在一起。
l 给单行的Align属性不是alCenter的Label设置AutoSize为True。(多行的Label不要设置AutoSize为True)
l 给Label/CheckBox等等控件足够的空白范围以便当字体宽度变化时变化。预留当前长度的25%是比较好的(如果要进行多语翻译则需要更多留白,至少30%)。如果Label的AutoSize为False,则要Label的Width就要足够大。对于多行的Label,在Label的底部起码多留一行的空间。
l 不要在不同的DPI下在IDE中打开并保存窗体(和包含窗体的代码文件)。(对于SCM,推荐使用小字体-96DPI,Windows经典主题)
l 无论是在运行期还是在设计期都不要多次ReScale窗体,因为每次Scale都会带来浮点精度的舍去;也不要修改一个窗体的PixelsPerInch属性(IDE会阻止该属性的修改,但是却不能阻止手工修改),此外也不要直接修改dfm中的窗体大小等等信息,TextHeight属性也不能修改。
l 设计窗体的时候要考虑窗体的大小不要超过程序能运行的最小分辨率。
l 设计窗体时,要合理设置控件的Anchors/Align等属性。
l 此外如TComboBox/TDBLookupCombo等等组件也需要尽量给足宽度,否则可能会看不到完整的信息。
l 在程序中不要使用固定的控件位置和大小,因为这些都可能在运行时变化。(如Button.Top := 50等)
l 设置了AutoResize的TImage的图片不会自动放大或缩小,所以不可以采用利用设计期的图片的大小来只显示部分图像的方法。
l 如果窗体可以记忆上一次运行的大小、位置、WindowsState等,在Load的时候需要注意要确保窗体在屏幕上可见,以及不要调整不能调整大小的窗体的大小。
l TFrame是为了在设计期复用窗体而引入的,如果要将运行期的窗体嵌入到别的窗体,则需要使用TForm。(DBStudio就不恰当的使用了TFrame)
l 在多语程序中可能会涉及到字体的修改,这时也应该考虑多DPI设定的情况。
l 如果一个电脑在多DPI间切换,则注册表保存的窗体大小和位置等信息也需要被小心处理。Author:
Passion Time: 2007-8-8 16:10