控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

VB中可以做SplitterWindow

作者:未知 出处:不详 2010年02月02日 阅读:

摘录:
在 Delphi 提供了 Splitter 控件,轻而易举就实现了窗体界面的分割视图,而在 VB 中要实现这一
功能则要编写大量代码。可参阅 VB 6 的"树状视图列表视图拆分条"控件集或"VB 应用程序向导 --> 资源管理器样式"代码,现将其加工移植为 ActiveX Dll 部件:创建ActiveX Dll(命名为:EasyViews)工程,并在类模块(命名为:SplitView)
添加如下代码:

Option Explicit
Dim mbMoving As Boolean

Const iError = 120
Const iErrorXY = 150
Const SplitterHW = 80

Dim LeftCtl As Control
Dim RightCtl As Control
Dim TopCtl As Control
Dim BottomCtl As Control

Dim WithEvents ImgSplitterH As Image
Dim WithEvents ImgSplitterV As Image

Dim PictureH As PictureBox
Dim PictureV As PictureBox

Dim WithEvents FormX As Form

Dim iMinWidth As Integer
Dim iMinHeight As Integer
Dim iLeftMargin As Integer
Dim iRightMargin As Integer
Dim iTopMargin As Integer
Dim iBottomMargin As Integer

Public Property Get LeftMargin() As Integer
      LeftMargin = iLeftMargin
End Property

Public Property Let LeftMargin(ByVal vNewValue As Integer)
      iLeftMargin = vNewValue
End Property

Public Property Get RightMargin() As Integer
      RightMargin = iRightMargin
End Property

Public Property Let RightMargin(ByVal vNewValue As Integer)
      iRightMargin = vNewValue
End Property

Public Property Get TopMargin() As Integer
      TopMargin = iTopMargin
End Property

Public Property Let TopMargin(ByVal vNewValue As Integer)
      iTopMargin = vNewValue
End Property

Public Property Get BottomMargin() As Integer
      BottomMargin = iBottomMargin
End Property
Public Property Let BottomMargin(ByVal vNewValue As Integer)
      iBottomMargin = vNewValue
End Property

Public Property Get MinWidth() As Integer
MinWidth = iMinWidth
End Property

Public Property Let MinWidth(ByVal vNewValue As Integer)
iMinWidth = vNewValue
End Property

Public Property Get MinHeight() As Integer
MinHeight = iMinHeight
End Property

Public Property Let MinHeight(ByVal vNewValue As Integer)
iMinHeight = vNewValue
End Property

Private Sub FormX_Load()
Dim temp As String

temp = "DynamicImageH"
On Error GoTo ErrorHandler
FormX.Controls.Add "VB.Image", temp, FormX
On Error GoTo 0
With FormX.Controls.Item(temp)
    .Visible = True
End With
Set ImgSplitterH = FormX.Controls.Item(temp)
ImgSplitterH.MousePointer = 7 'ccsizeEW

temp = "DynamicImageV"
On Error GoTo ErrorHandler
FormX.Controls.Add "VB.Image", temp, FormX
On Error GoTo 0
With FormX.Controls.Item(temp)
    .Visible = True
End With
Set ImgSplitterV = FormX.Controls.Item(temp)
ImgSplitterV.MousePointer = 9 'cc2sizeNS

temp = "DynamicPictureH"
On Error GoTo ErrorHandler
FormX.Controls.Add "VB.PictureBox", temp, FormX
On Error GoTo 0
Set PictureH = FormX.Controls.Item(temp)
PictureH.BorderStyle = 0
PictureH.BackColor = vbBlack

temp = "DynamicPictureV"
On Error GoTo ErrorHandler
FormX.Controls.Add "VB.PictureBox", temp, FormX
On Error GoTo 0

Set PictureV = FormX.Controls.Item(temp)

PictureV.BorderStyle = 0
PictureV.BackColor = vbBlack
LeftCtl.Move LeftMargin, TopMargin
ImgSplitterV.Move LeftCtl.Left + LeftCtl.Width, LeftCtl.Top, SplitterHW, LeftCtl.Height
RightCtl.Move ImgSplitterV.Left + SplitterHW, LeftCtl.Top
RightCtl.Height = LeftCtl.Height
ImgSplitterH.Move LeftCtl.Left, LeftCtl.Top + LeftCtl.Height, FormX.Width - LeftMargin - RightMargin, SplitterHW
BottomCtl.Move LeftCtl.Left, LeftCtl.Top + LeftCtl.Height + SplitterHW  'LeftCtl.Height

Exit Sub
ErrorHandler:
temp = temp & "X"
Resume
End Sub

Public Sub Create(LeftCtlX As Object, RightCtlX As Object, BottomCtlX As Object)
Set LeftCtl = LeftCtlX
Set RightCtl = RightCtlX
'Set TopCtl = TopCtlX
Set BottomCtl = BottomCtlX
Set FormX = LeftCtlX.Container
FormX_Load
End Sub

Private Sub FormX_Resize()
If FormX.WindowState <> vbMinimized Then
  If FormX.Width < LeftMargin + RightMargin + SplitterHW + MinWidth + LeftCtl.Width + iErrorXY Then
      FormX.Width = LeftMargin + RightMargin + SplitterHW + MinWidth + LeftCtl.Width + iErrorXY
  End If
  If FormX.Height < TopMargin + BottomMargin + SplitterHW + MinHeight + LeftCtl.Height + iErrorXY + iErrorXY + iErrorXY + 6 Then
      FormX.Height = TopMargin + BottomMargin + SplitterHW + MinHeight + LeftCtl.Height + iErrorXY + iErrorXY + iErrorXY + 6
  End If
  RightCtl.Width = FormX.Width - LeftCtl.Width - SplitterHW - LeftMargin - RightMargin - iErrorXY
  ImgSplitterH.Width = FormX.Width - LeftMargin - RightMargin - iErrorXY
  BottomCtl.Width = ImgSplitterH.Width
  BottomCtl.Height = FormX.Height - ImgSplitterH.Top - BottomMargin - SplitterHW - 405
End If
End Sub

Private Sub ImgSplitterH_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
With ImgSplitterH
    PictureH.Move .Left - 10, .Top, .Width + 30, .Height / 2
End With
PictureH.Visible = True
mbMoving = True
End Sub

Private Sub ImgSplitterH_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbLeftButton Then
  If mbMoving Then
      If Y + ImgSplitterH.Top < LeftCtl.Top + MinHeight Then
        PictureH.Top = LeftCtl.Top + MinHeight
      ElseIf Y + ImgSplitterH.Top > FormX.Height - BottomMargin - SplitterHW - MinHeight - iErrorXY - iErrorXY - iErrorXY Then
        PictureH.Top = FormX.Height - BottomMargin - SplitterHW - MinHeight - iErrorXY - iErrorXY - iErrorXY
      Else
        PictureH.Top = Y + ImgSplitterH.Top
      End If
  End If
End If
End Sub

Private Sub ImgSplitterH_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    LeftCtl.Height = PictureH.Top - LeftCtl.Top
    ImgSplitterV.Height = LeftCtl.Height
    RightCtl.Height = LeftCtl.Height
    ImgSplitterH.Top = PictureH.Top
    BottomCtl.Height = FormX.Height - ImgSplitterH.Top - BottomMargin - SplitterHW - 400 - 5
    BottomCtl.Top = PictureH.Top + SplitterHW
    PictureH.Visible = False
    mbMoving = False
End Sub

Private Sub ImgSplitterV_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
PictureV.Visible = True
With ImgSplitterV
    PictureV.Move .Left, .Top - 10, .Width \ 2, .Height
End With
mbMoving = True
End Sub

Private Sub ImgSplitterV_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbLeftButton Then
  If mbMoving Then
      If X + ImgSplitterV.Left < LeftCtl.Left + MinWidth Then
        PictureV.Left = LeftCtl.Left + MinWidth
      ElseIf X + ImgSplitterV.Left > FormX.Width - SplitterHW - RightMargin - MinWidth - iErrorXY Then
        PictureV.Left = FormX.Width - SplitterHW - RightMargin - MinWidth - iErrorXY
      Else
        PictureV.Left = X + ImgSplitterV.Left
      End If
  End If
  PictureV.Height = LeftCtl.Height
End If
End Sub

Private Sub ImgSplitterV_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
ImgSplitterV.Left = PictureV.Left
LeftCtl.Width = PictureV.Left - LeftCtl.Left
RightCtl.Width = FormX.Width - LeftCtl.Width - SplitterHW - LeftMargin - RightMargin - iErrorXY '- iError - 200
RightCtl.Left = PictureV.Left + SplitterHW
PictureV.Visible = False
mbMoving = False
End Sub

至此该部件创建完成。
    接下来创建标准工程,并在窗体上绘制任意三个控件,如: TreeView、ListView、DataGrid,并编写
如下代码测试 EasyViews 部件的类 SplitView:

Option Explicit
Dim x As New EasyViews.SplitView
Private Sub Form_Load()
'...
x.TopMargin = 500 ' Toolbar1.Height + 100
x.LeftMargin = 1000
x.RightMargin = 1000
x.BottomMargin = 500 'StatusBar1.Height
x.MinHeight = 1000
x.MinWidth = 1200
x.Create TreeView1, ListView1, DataGrid1
'...
End Sub

该方案使调用部件的主程序代码简洁明了,使实现界面控制的"代码部件"与实现其它功能的代码分离,
界限分明、一目了然。
                                                           
                                                            【注:本文由控件中国网转载】

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统