大家都知道,VC界面编辑器中使用的尺寸不是像素,具体是怎么来的我也不知道,总之界面编程器中的1个单位不等于1像素,他们之间有个比例,这个比例还不是整数,是个浮点数,而且精度还很高!我不知道VC为什么要这样做,但既然别人已经这样做了,我们只有想办法解决问题,出现的问题如下,举几个例子:
只说垂直上面的问题,水平上面的一样。
一:两个控件,如group box,如果他们顶边不对齐,那么可能他们的底边无法对齐,比如他们底边相差1像素的话,就是这样的,因为不管你移动控件也好,增减控件高度也好,他们的步长是编辑器的1单位,这个1单位大于1像素。
二:两个列表框(report),如果某一个列表框最后一项刚好完全显示出来,那么另一个列表框(如果他们高度不相等的话)要想也使最后一项刚好完全显示出来是非常困难的。
当然,我上面说的不是绝对无法解决,例如可以使两控件的高度差增大,当高度差大到一定程度的时候,
这种比例造成的误差自然会拆回到起点,这样就行了,比如说目前我正在使用的两个列表框(report),一个高111,一个高172(都是编辑器单位,9号宋体),他们的最后一项宽度刚好一样。
上面的办法当然非常的不理想,由于不知道比例是多少,所以只有穷举来找拆回点,而且既然是界面编程,拿上面的例子来说,如果界面要求第一个列表框高111,而第二个要大于111而小172的话,就没有办法使最后一项所占高相等了!
既然不能通过界面编程器来达到绝对对齐,那么只有用别的方法了,好在MFC提供了MoveWindow,这也可能是VC界面编辑器中使用相对粗糙的位置定位方法吧。具体方法就是在初始化函数,如对话框的OnInitDialog函数中,先取得要移动的控件的窗口位置数据,再计算移动后的窗口位置,最后是调用MoveWindow,如下:
CRect rect;
GetDlgItem(IDC_XXXX)->GetWindowRect(rect);
rect.OffsetRect(0, +/-1); //这里一般是正负1,大于正负1的时候可以通过界面编程器移动,不用在这里麻烦
ScreenToClient(rect);
GetDlgItem(IDC_XXXX)->MoveWindow(rect);