因为以前很少用VC做UI方面的工作,当开始用VC做UI的时候,碰到了一些很让人费解的问题。
在对话框编辑器里,我初始以为所有的控件长度单位都是以象素为单位,后来才发现不大对劲,控件Show出来的大小明显要比相应的象素大小要大,查询资料才发现,这些长度是以DLU为单位的。
何谓DLU,DLU是Dialog Unit的缩写,字面的意思自然是对话框单位,
DLU是怎么定义的,这又关系到了另外一个单位Dialog Base Unit-对话框基本单位,这个对话框基本单位是跟对话框所选择的字体有关系的,单位 水平 Dialog Base Unit 的象素数 大概就是这个字体内所有字符的平均宽度(象素单位),单位 垂直 Dialog Base Unit 的象素数 大概就是这个字体内所有字符的平均长度(象素单位)。
单位 水平 DLU的象素数就是 单位水平 DLBU/4, 而单位 垂直 DLU的象素数就是 单位 垂直 DLBU/8。
啊哈,这真是有够复杂的,不过一般情况下水平DLU和垂直DLU都是一样的,在使用系统字体,字体大小为8号的时候,一个DLU对应 1.5 象素。至于使用其它字体和大小,有相关的API可以计算出来,不过实在够麻烦的,幸好没有什么机会用到,如果需要可以查MSDN。
为什么在对话框编辑器里面使用DLU作为单位(记录到rc资源文件里面的长度也是以DLU为单位),自然是为了当对话框字体改变的时候,程序加载对话框的时候会计算出DLU跟象素之间的关系,从而动态定义对话框和控件的大小,避免了改变字体导致的字符串超出预先设定的长度从而看不见后面的部分。