splitter为picturebox
listLeft为listbox
textright 为textOption Explicit
Private Const SPLT_WDTH As Integer = 3Private currSplitPosX As LongDim CTRL_OFFSET As IntegerDim SPLT_COLOUR As Long
Private Sub Form_Load()
CTRL_OFFSET = 300 '定义控件到窗口顶部的距离
ListLeft.AddItem "VB俱乐部"
ListLeft.AddItem "VB动画篇"
ListLeft.AddItem "VB网络篇"
ListLeft.AddItem "VB控件类"
ListLeft.AddItem "VB界面类"
textright = "在一些流行的应用程序中,经常见到窗体上有二个相邻的列表框,可以用鼠标任意拉动中间分割条,改变列表框大小。"
End Sub
Private Sub Form_Resize()Dim x1 As Integer
Dim x2 As Integer
Dim height1 As Integer
Dim width1 As Integer
Dim width2 As IntegerOn Error Resume Nextheight1 = ScaleHeight - (CTRL_OFFSET * 2)
x1 = CTRL_OFFSET
width1 = ListLeft.Widthx2 = x1 + ListLeft.Width + SPLT_WDTH - 1
width2 = ScaleWidth - x2 - CTRL_OFFSETListLeft.Move x1% - 1, CTRL_OFFSET, width1, height1textright.Move x2, CTRL_OFFSET, width2 + 1, height1splitter.Move x1 + ListLeft.Width - 1, CTRL_OFFSET, SPLT_WDTH, height1End SubPrivate Sub splitter_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)If Button = vbLeftButton Thensplitter.BackColor = SPLT_COLOURcurrSplitPosX = CLng(X)
ElseIf currSplitPosX <> &H7FFFFFFF Then splitter_MouseUp Button, Shift, X, YcurrSplitPosX = &H7FFFFFFF
End IfEnd Sub
Private Sub splitter_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)If currSplitPosX& <> &H7FFFFFFF ThenIf CLng(X) <> currSplitPosX Then
splitter.Move splitter.Left + X, CTRL_OFFSET, SPLT_WDTH, ScaleHeight - (CTRL_OFFSET * 2)
currSplitPosX = CLng(X)End IfEnd IfEnd SubPrivate Sub splitter_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)If currSplitPosX <> &H7FFFFFFF ThenIf CLng(X) <> currSplitPosX Then
splitter.Move splitter.Left + X, CTRL_OFFSET, SPLT_WDTH, ScaleHeight - (CTRL_OFFSET * 2)
End IfcurrSplitPosX = &H7FFFFFFFsplitter.BackColor = &H8000000FIf splitter.Left > 60 And splitter.Left < (ScaleWidth - 60) ThenListLeft.Width = splitter.Left - ListLeft.LeftElseIf splitter.Left < 60 Then
ListLeft.Width = 60
Else
ListLeft.Width = ScaleWidth - 60
End If
Form_Resize
End IfEnd Sub
问题1:
height1 = ScaleHeight - (CTRL_OFFSET * 2)
CTRL_OFFSET为何要*2?问题2:
x2 = x1 + ListLeft.Width + SPLT_WDTH - 1
为何结尾处-1?问题3:
ListLeft.Move x1% - 1, CTRL_OFFSET, width1, height1
X1%-1何解?%什么意义?一题5分,抢答开始

解决方案 »

  1.   

    1、上下都要有间隔。
    2、调用Move时x1减了1而x2在计算时减1,这段代码只能说结果是一致的但是风格不一致。
    3、%为类型声明字符,指明前面的x1是Integer类型,主要兼容早期的VB,VB6应该用Dim语句进行声明。
      

  2.   

    还是不太懂,请教下
    2、减1感觉可有可无,不减1运行后看不出变化,作者这样设计是什么道理
    3、x1后面的%既然是为了兼容早期vb,那么在其他地方如x2,height1,width1,width2等处是否都应该添加%呢,还是作者虎头蛇尾代码不严谨,统一?发现网上很多源代码,多少都有些问题,copy得网站都不验证下,研究时头都大了!
      

  3.   

    窗体坐标以(0,0)为起点,所以减1是正确的。但是通常坐标单位是Twips(一般1/15像素),减不减表现都一样。
    象Basic、C/C++之类的语言由于生命期比较长,不同的人写的代码风格各异,只能用来参考。