其实多敲敲code后自然会有什么方式的代码最快最安全,其实设置居中真的很简单,但是差异还是很大的,如果你有兴趣可以点击阅读全文。
这个也是偶尔在网上看东西发现的小问题,其实也不算问题,不过如果目标机器资源紧张的时候,会出现窗口的一闪而过(改变位置。) Move方法和这个是一样的,所以就忽略了。[通用的] 我们常常看到的设置窗体居中的方式有:
Me.Left = (Screen.Width - Me.Width) / 2
Me.Top = (Screen.Height - Me.Height) / 2
为了简单一点,我们或许会写成
With Me
.Left = (Screen.Width - .Width) / 2
.Top = (Screen.Height - .Height) / 2
End With
如果要通用我们或许会写作
Public Sub PutCenter(frm As Form)
With frm
.Left = (Screen.Width - .Width) / 2
.Top = (Screen.Height - .Height) / 2
End With
End Sub
然后可以在任意事件中调用 call putcenter(窗体Name) 但是这些都太复杂了,而且不安全,因为除法要考虑除数不为零,在一些情况下,或许的Screen会为零的哦~ 于是我们继续改,为了直观,我先不优化到底,保留着代数式的非最简结果吧。
Public Sub PutCenter(frm As Form)
With frm
.Left = (Screen.Width - .Width) * (1/2)
.Top = (Screen.Height - .Height) * (1/2)
End With
End Sub
这样的话,就把除数为零的隐患解决了,贯彻防御性编程的策略,我们还得考虑Screen返回数值为0的情况, 那么我们继续改~
Public Sub PutCenter(frm As Form)
Dim lngRet As Long
With frm
lngRet = Abs(Screen.Width - .Width) * 0.5
.Left = lngRet
lngRet = Abs(Screen.Height - .Height) * 0.5
.Top = lngRet
End With
End Sub
这段代码比起上面的好在于可以解决如果获取窗口本身Width和Height或者Screen的Width和Height为零后的问题。 而且帮助计算机归纳了1/2这步。
或许你说我的考虑没必要,但是请想想,是不是所有可能出错的事情终究都会出错呢?为了安全,还是谨慎点好~
如果你非要说设置窗口属性的StartUpPosition也可以实现居中,我只能对转牛角尖的您说:StartUpPosition只能在窗口初始化时使用,这个是只读属性,不能再次调用。除非你重新载入窗口,但是重载的代价是不是太大了呢?