如何用VB6.0制作Windows资源管理器

用VB6.0实现Windows资源管理器的树形结构,要有代码,高手请帮个忙,小弟在此多谢了。。。。... 用VB6.0实现Windows资源管理器的树形结构,要有代码,高手请帮个忙,小弟在此多谢了。。。。 展开
 我来答
美迅科技
2008-02-07 · TA获得超过256个赞
知道小有建树答主
回答量:341
采纳率:0%
帮助的人:243万
展开全部
用1个lisview 1个TREEVIEW 1个IMAGELIST 就可以了,TREEVIEW是显示树形结构的,IMAGELIST是存图标的,LISTVIEW可以有4种图标显示方法,可以做出资源管理器的效果,
listview用法:

通过此控件,可将项目组成带有或不带有列标头的列,并显示伴随的图标和文本。ListView控件是由ColumnHeader和ListItem对象所组成的,其中ColumnHeader对象的个数决定了控件的列数,而ListItem对象的个数则决定了控件的行数。(图7)
ColumnHeader对象是ListView控件中包含标头文字的项目。利用ColumnHeader对象,用户可以:
▲单击对象触发ColumnClick事件并根据数据项目将项目排序。
▲拖动对象的右边框来调整列宽度。
▲在报表视图中隐藏ColumnHeader对象。
ColumnHeader对象的数目决定每个ListItem对象可包含的子项目数目。删除ColumnHeader对象后所有与列关联的子项目也将被删除,并且每个ListItem对象的子项目数组将平移以更新ColumnHeader的索引,而这将导致剩余的列标头SubItemIndex属性的改变。

ColumnHeader对象的SubItemIndex属性
该属性返回与ListView控件中ColumnHeader对象关联的子项目的索引。子项目是字符串数组,代表显示在报表视图中的ListItem对象的数据。第一列的列标头SubItemIndex属性设置为0,这是因为小图标和ListItem对象的文字总出现在第一列中,而且它们被当作ListItem对象而不是子项目。列标头数目取决于子项目数目。列标头数目总是比子项目数目多1。
在设计时可以利用属性页的“列首”选项卡将ColumnHeader对象添加到ListView控件中,在运行时则用Add方法添加。

ColumnHeader对象的Add方法
该方法的使用与前面那些控件基本相似,就不再介绍了。
ListView1.ColumnHeader.Add(index,key,text,width,alignment)
ListItem对象是指控件中的一行(不包含标头行)的所有内容。它也可包含文本和图片,但是要使用图片则必须通过Icons和SmallIcons属性引用ImageList控件。

ListItem对象的SubItems属性
返回或设置一个字符串(子项目)数组,它代表ListView控件中ListItem对象的数据。
ListItem对象可包含任意多个的关联项目数据字符串(子项目),但每个ListItem对象子项目数目必须相同。每个子项目都对应于相关的列标头,无法直接向子项目数组添加元素,只有通过ColumnHeaders的Add方法添加列标头的方法来添加子项目。

ListItem对象的Add方法
该方法添加ListItem对象到ListView控件的ListItems集合中并返回对新创建对象的引用。
它的语法如下:

ListItem1.Add(index,key,text,icon,smallIcon)

ListView控件的View属性
ListView控件可使用四种不同视图显示项目,这可以用View属性来确定。该属性返回或设置ListView控件中ListItem对象的外观。
ListView控件的SortOrder,SortKey和Sorted属性
控件中的ListItem对象可以按要求进行排序,与排序有关的属性是SortOrder,Sorted和SortKey属性。
SortOrder属性返回或设置一个值,此值决定ListView控件中的ListItem对象以升序或降序排序。
SortKey属性返回或设置一个值,此值决定ListView控件中的ListItem对象如何排序。
Sorted属性返回或设置确定ListView控件中的ListItem对象是否排序的值。
下面的代码说明了如何创建ColumnHeaders和ListItem对象,SubItemIndex和SubItem属性的使用方法以及如何排序。

Private Sub Form_load()
'确保ListView控件的view属性为报表视图。
ListView1.View=lvwReport
'添加三列。
ListView1.ColumnHeaders.Add,"Name","姓名"
ListView1.ColumnHeaders.Add,"Sex","性别"
ListView1.ColumnHeaders.Add,"Age","年龄"
'向控件添加ListItem对象。
Dim itmX As ListItem
'添加column1的名称。
Set itmX=ListView1.ListItems.Add(1,"ZL","张力")
'使用SubItemIndex将SubItem与正确的ColumnHeader关联。使用关键字("Sex")指定正确的ColumnHeader。
itmX.SubItems(ListView1.ColumnHeaders("Sex").SubItemIndex)="男"
'使用ColumnHeader关键字将SubItems字符串与
'正确的ColumnHeader关联。
itmX.SubItems(ListView1.ColumnHeaders("Age").SubItemIndex)="19"
Set itmX=ListView1.ListItems.Add(1,"LF","李芳")
itmX.SubItems(ListView1.ColumnHeaders("Sex").SubItemIndex)="男"
itmX.SubItems(ListView1.ColumnHeaders("Age").SubItemIndex)="22"
Set itmX=ListView1.ListItems.Add(1,"WW","王伟")
itmX.SubItems(ListView1.ColumnHeaders("Sex").SubItemIndex)="男"
itmX.SubItems(ListView1.ColumnHeaders("Age").SubItemIndex)="24"
End Sub

Private Sub ListView1_ColumnClick(ByVal ColumnHeader As ComctlLib.ColumnHeader)
Select Case ColumnHeader.Key
Case "Sex":ListView1.SortKey=1
ListView1.SortOrder=lvwAscending
ListView1.Sorted=True
Case "Age":ListView1.SortKey=2
ListView1.SortOrder=lvwAscending
ListView1.Sorted=True
End Select
End Sub

七、带刻度滑块---Slider

Slider控件是一个包含滑块和可选择性刻度标记的窗口,可以通过拖动滑块,用鼠标单击滑块的任意一侧或者使用键盘移动滑块来选择一个值。
在选择离散数值或某个范围内的一组连续数值时,Slider控件十分有用。例如,无需键入数字,通过将滑块移动到刻度标记处,可以用Slider控件来输入数值。
Silder控件的大多数基本属性比较简单,我们这里重点介绍一些较有用而又常易忽略的属性。
TickStyle属性
该属性返回或设置Slider控件上显示的刻度标记的样式。
SelectRange,SelStart和SelLength属性
Slider控件可以选择某个范围内的数值,这就要用到SelectRange,SelStart和SelLength属性。
SelectRange属性决定Slider控件是否可以选择一个范围。如果SelectRange属性为True,SelStart为选定范围的起始值,SelLength为选定范围的长度。
如果SelectRange属性为False,则SelStart属性的设置值与&#118alue属性的设置值相同,SelLength属性无效。
下列代码允许在按住SHIFT键时,用鼠标拖动或单击Slider控件以选择一个范围。
Private Sub Form_Load()
'设置slider控件的设置值
Slider1.Max=20
End Sub

Private Sub Slider1_MouseDown(Button As Integer,Shift As Integer,x As Single,y As Single)
If Shift=1 Then '如果按住Shift键,则Slider1.SelectRange=True '打开SelectRange。
Slider1.SelStart=Slider1.&#118alue'设置SelStart数值
Slider1.SelLength=0'设置先前的SelLength(如存在)为0。
End If
End Sub

Private Sub Slider1_MouseUp(Button As Integer,Shift As Integer,x As Single,y As Single)
if Shift=1 Then
'如果在一点决定返回上一步,将发生错误。
On Error Resume Next
'否则使用SelStart和当前数值设置SelLength。
Slider1.SelLength=Slider1.&#118alue-Slider1.SelStart
Else
Slider1.SelectRange=False'如果松开SHIFT键。
End If
End Sub
在程序中,常用Slider控件来代替键盘输入数字,如下面的例子。
该例通过Slider控件来显示不同的长度。
Private Sub Form_Load()
Slider1.Min=0
Slider1.Max=50
Slider1.SmallChange=1
Slider1.LargeChange=10
Slider1.TickFrequency=5
End Sub
Private Sub Slider1_Change()
Label1.Caption="长度是"&Format(Slider1.&#118alue/5,"#.00")&"厘米"
End Sub
==================

一、ListView使用简介
ListView控件是VB开发者非常喜爱的控件之一。作 为Windows95公共控件组(COMCTL32.OCX)的成员,它经常与经常与TreeView、ImageList等控 件联合使用。即用TreeView显示一个的树型结构,而用ListView显示选中的节点(Node)对 象的记录集。
这是笔者在开发财务软件项目中的<<凭证管理>> 模块的一个用户界面。屏幕左边是一个TreeView控件,用来显示会计凭证的类别;右边是一 个ListView,用来显示对应类别的凭证目录;上方是一个菜单条控件(MenuBar)和一个工具 条控件(ToolBar);下方是一个状态栏控件(StatusBar),用来显示凭证数个当前日期。

大家可以看到图中所示的界面非常类似于Window95/98 的资源浏览器,Windows的界面风格做为一种标准已为广大用户所接受。而Windows操作系 统的主要的优点就是为所有的应用程序提供了公用的界面。知道如何使用基于Windows的 应用程序的用户,很容易学会使用其他应用程序。

这种使用Windows95公共控件组合的方法能够达 到与Windows界面的一致性,所以在目前VB5.0应用程序的开发中经常使用。

二、填充大量结果集所遇到的问题
在实际应用开发中,经常用ListView填充一个数据库 结果集(Record set)的内容。即先写一段SQL查询语句,产生一个结果集,然后将结果集的每一 条记录用DO...LOOP循环语句中填到ListView中。
但是当结果集很大时(例如有5000条以上的记录) ,填充所需要的时间会很长。用户不得不等很长时间完成一个查询。所以在查询的过程中 必须允许用户按Escape键退出。具体做法是在DO...LOOP循环体中加一条DoEvents函数,并 写一段中断退出程序代码。

DoEvents函数的功能是:转让控制权,以便让操 作系统处理其它的事件。这样在长时间的查询过程中,如果用户按了Escape键,将退出循环 体,结束查询过程。

但是这样又会引发另外一个问题:由于DoEvents 可以让操作系统响应别的事件,循环体中填充每一条ListView项目(ListItem)的过程也会 显示出来,所以在填充的过程中屏幕会不停的闪动,这种现象当然不能被用户所接受。如何 解决这个问题呢?

三、解决方案
用WindowsAPI函数可以解决这个问题。首先对几个 用到的API函数做一解释和说明。
1.GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long

此函数的功能是获得一个指定对象窗口(Window) 的矩型框区域(rectangle)。

Hwnd为指定对象或窗体的句柄。LpRect为返回矩 型框的结构(必须定义为结构类型的变量)。

2.ValidateRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long

此函数的功能是使指定的矩型区域生效。这样会 通知Windows不必对指定的区域进行重画(Redraw)。

3.InvalidateRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT, ByVal bErase As Long) As Long

此函数的功能是使指定的矩型区域无效。这样会 通知Windows要对指定的区域进行重画。

具体实现的步骤如下:

1.在填充结果集之前先用GetClientRect函数获 得ListView的显示区域。

2.在增加完一个显示项目(ListItem)后用ValidateRect 函数置这一区域为有效。这样Windows就不会显示每一条ListItem,屏幕闪动的现象就会消 失。

3.在填充结果集之后,用InvalidateRect函数置 这一区域为无效。这样Windows就会重画ListView的内容,结果集被完整的显示出来。

下面是笔者在项目开发中的一个程序实例。程序 名为FillListView。该程序将填写一个Access数据库(FISCAL.MDB)的凭证表(Table)的内 容到ListView中。

首先进入VB5.0,新建一个窗体(Form),名为Form1。

然后在Form中增加下列控件。

控 件 名 Name

ListView Lvw

Imagelist imlList

Command Button。 Command1

将ImageList控件中充填一个名为“item”的图象后 与ListView控件关联。

在<<工程>>菜单命令条中进入“引用”对话框,选 择“MicrosoftDAOObjectLibrary”

在Form的通用模块(Modle)中定义以下变量。

Private Type RECT ' 用 来 定 义 一 个 区 域 的 坐 标。

Left As Long

Top As Long

Right As Long

Bottom As Long

End Type

' - -

' Windows API 函 数 的 声 明。

Private Declare Function InvalidateRect Lib "user32"

(ByVal hwnd As Long, lpRect As RECT, ByVal bErase As Long) As Long

Private Declare Function ValidateRect Lib "user32"

(ByVal hwnd As Long, lpRect As RECT) As Long

Private Declare Function GetClientRect Lib "user32"

(ByVal hwnd As Long, lpRect As RECT) As Long

Dim mbSearchCancel As Boolean

' 用 来 定 义 查 询 中 断 的 标 志。

' True 表 示 中 止 查 询;False 表 示 正 在 查 询。

将 该Form 的KeyPreview 属 性 设 为True, 以 控 制 窗 体 接 收 键 盘 事 件。

然 后 在Form 的KeyPress 事 件 中 写 下 列 代 码:

If KeyAscii = vbKeyEscape Then

mbSearchCancel = True

' 当 用 户 按Escape 键 时, 置mbSearchCancel 变 量 为True。

End If

' 表 示 结 束 查 询。

在Command Button 的 Click 事 件 中 调 用 填 充 子 程 序:Call FillListView。

子 程 序 的 代 码 为:

Private Sub FillListView()

'

Dim itmX As ListItem ' 定 义 一 个ListView 的 显 示 项 目。

Dim sSQL As String ' 查 询 字 串 变 量 。

'

Dim rc As RECT ' ListView 的 显 示 区 域。

Dim wrkJet As Workspace ' 数 据 库 工 作 空 间。

Dim dbFISCAL As Database ' 数 据 库 对 象。

Dim RS As Recordset ' 数 据 结 果 集。

On Error GoTo ErrFillListView

Screen.MousePointer = vbHourglass

lvw.ListItems.Clear: ' 清 除ListView 的 内 容。

'

' 定 义ListView 的 列 头 的 名 称。

With lvw.ColumnHeaders

.Add , , " 凭 证 编 号", 800

.Add , , " 凭 证 日 期", 1000

.Add , , " 凭 证 字 号", 1000

.Add , , " 凭 证 类 别", 800

.Add , , " 首 行 摘 要", 1440

.Add , , " 借 方 金 额 合 计", 1000, lvwColumnRight

End With

' - - -

' 产 生 查 询 语 句。

sSQL = "select voucher_id,voucher_number,voucher_date,voucher_type_shortname,"

sSQL=sSQL&"voucher_type_name,voucher_memo,voucher_amount from VOUCHER"

sSQL = sSQL & "order by voucher_number"

' ' - - -

' 打 开 一 个 数 据 库 结 果 集。

Set wrkJet = CreateWorkspace("NewJetWorkspace", "admin", "", dbUseJet)

Set dbFISCAL = wrkJet.OpenDatabase("FISCAL.mdb")

Set RS=. dbFISCAL .Open sSQL,dbOpenForwardOnly

'

' 获 得listview 的 显 示 区 域。

Call GetClientRect(lvw.hwnd, rc)

Do While Not RS.EOF()

DoEvents

If mbSearchCancel Then

' 中 断 退 出

RS.Close: Set RS = Nothing ' 关 闭、 清 除 结 果 集。

mbSearchCancel = False

Screen.MousePointer = vbDefault

' - -

' 刷 新ListView 的 内 容, 显 示 已 经 查 出 的 记 录 数。

Call InvalidateRect(lvw.hwnd, rc, True)

Exit Sub

End If

' - - -

' 增 加 一 个 显 示 项 目ListItem。

With lvw.ListItems

Set itmX = .Add(, , "" & RS!voucher_number, "item", "item")

' 凭 证 编 号

itmX.SubItems(1) = Format$("" & RS!voucher_date, "yyyy/mm/dd")

' 凭 证 日 期

itmX.SubItems(2) = "" & RS!voucher_type_shortname & "-" —

' 凭 证 字 号

& "" & RS!voucher_number

itmX.SubItems(3)="" & RS!voucher_type_name

' 凭 证 类 别

itmX.SubItems(4)=""&RS!voucher_memo

' 首 行 摘 要

itmX.SubItems(5)= Format$("" & RS!voucher_amount, "#,###.00")

' 借 方 合 计 金 额

itmX.Tag = "" & RS!voucher_id

End With

' - -

' 避 免 显 示 区 域 的 闪 动 现 象。

Call ValidateRect(lvw.hwnd, rc)

RS.MoveNext

Loop

'

'- 刷 新ListView 的 内 容。 显 示 所 有 查 出 的 记 录 数。

Call InvalidateRect(lvw.hwnd, rc, True)

' -

' 关 闭、 清 除 结 果 集。

RS.Close: Set RS = Nothing

creen.MousePointer = vbDefault

Exit Sub

ErrFillListView:

Screen.MousePointer = vbDefault

MsgBox Err & ":" & Error, vbInformation, Me.Caption

Exit Sub

End Sub

listview 是VB中经常用到的控件。下面说一下其使用。代码如下:

ListView1.ColumnHeaders.Add , "name", "Name", 2000 '定义列头
ListView1.ColumnHeaders.Add , "age", "Age", 1000
ListView1.ColumnHeaders.Add , "position", "Position", 3000
ListView1.ColumnHeaders.Add , "addr", "Home addr", 5000
ListView1.ColumnHeaders.Add , "other", "Other", 3000

Set itmX = ListView1.ListItems.Add(, "a", "abcd") '添加一列并设置对象itmX为listitem.
itmX.SubItems(1) = "32" '在单元格里添加内容.
itmX.SubItems(2) = "32"

双击事件

Private Sub ListView1_DblClick()
If Me.ListView1.SelectedItem Is Nothing Then
Exit Sub
End If
Dim Item As ListItem
Set Item = Me.ListView1.SelectedItem
MsgBox Item.Text '显示被双击的条目的text
End Sub

treeview用法:

Treeview 控件:名称 Treeview1;

Imagelist 控件:名称 Imagelist1,并在该控件中放置三张个性图片(32×32),建立索引1、2、3;(方法:在Imagelist 控件上单击鼠标右键选择属性)

Label 控件:名称分别为Lab(0)、Lab(1),Caption分别为“父节点:”、“子节点:”;

Textbox 控件:名称分别为Txt(0)、Txt(1),text都为“”;

commandbutton 控件:名称为系统默认,Caption分别为“添加”、“展开”、“收起”、“排序”、“删除”、“退出”;

将下列代码加入到代码框:

Option Explicit

Dim I As Integer
Dim J As Integer
Dim nodx As Node
Dim CunZai As Boolean '定义变量

Private Sub Command1_Click()
If Txt(0).Text <> "" And Txt(1).Text <> "" Then '不允许建立零字节的父节点和子节点
CunZai = False
J = TreeView1.Nodes.Count
For I = 1 To TreeView1.Nodes.Count '检查新输入的父节点名称是否存在
If TreeView1.SelectedItem.Children > 0 Then
If Txt(0).Text = TreeView1.Nodes(I).Text Then CunZai = True
End If
Next I
If CunZai = True Then '若存在, 则在父节点下建立子节点
Set nodx = TreeView1.Nodes.Add(Txt(0).Text, tvwChild, "child" & J,
Txt(1).Text, 3)
Else ,若不存在,则建立父节点和子节点
Set nodx = TreeView1.Nodes.Add(, , Txt(0).Text, Txt(0).Text, 1)
Set nodx = TreeView1.Nodes.Add(Txt(0).Text, tvwChild, "child" & J,_
Txt(1).Text, 3)
End If
TreeView1.Refresh
ElseIf Txt(0).Text = "" Then MsgBox "请输入父节点名称!", vbInformation, "警告!"
'系统提示
ElseIf Txt(1).Text = "" Then MsgBox "请输入子节点名称!", vbInformation, "警告!"
End If
End Sub

Private Sub Command2_Click()
For I = 1 To TreeView1.Nodes.Count
TreeView1.Nodes(I).Expanded = True '展开所有节点
Next I
End Sub

Private Sub Command3_Click()
For I = 1 To TreeView1.Nodes.Count
TreeView1.Nodes(I).Expanded = False '收起所有节点
Next I
End Sub

Private Sub Command4_Click()
TreeView1.Sorted = True '排列顺序
End Sub

Private Sub Command5_Click()
If TreeView1.SelectedItem.Index <> 1 Then
TreeView1.Nodes.Remove TreeView1.SelectedItem.Index '删除选定的节点
End If
End Sub

Private Sub Command6_Click()
End '退出程序
End Sub

Private Sub Form_Load()
TreeView1.LineStyle =TvwTreeLines '在兄弟节点和父节点之间显示线
TreeView1.ImageList = ImageList1 '链接图像列
TreeView1.Style = tvwTreelinesPlusMinusPictureText
'树状外观包含全部元素
Set nodx = TreeView1.Nodes.Add(, , "蒲子明", "蒲子明", 1)
'建立名称为"蒲子明"的父节点,选择索引为1的图像
Set nodx = TreeView1.Nodes.Add("蒲子明", tvwChild, "child01", "收件箱", 3)
'在"蒲子明"父节点下建立"收件箱"子节点,选择索引为3的图像
Set nodx = TreeView1.Nodes.Add("蒲子明", tvwChild, "child02", "发件箱", 3)
'在"蒲子明"父节点下建立"发件箱"子节点,选择索引为3的图像
CunZai = False
End Sub

Private Sub TreeView1_Expand(ByVal Node As MSComctlLib.Node)
Node.ExpandedImage = 2 '节点被展开时,选择索引为2的图像
End Sub

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
If TreeView1.SelectedItem.Children = 0 Then '检查是否有子节点,0为无
For I = 1 To TreeView1.Nodes.Count
If TreeView1.Nodes(I).Selected Then
MsgBox "您选择的是:“" & TreeView1.Nodes(I).FullPath & "”子节点!"
'系统提示
End If
Next I
End If

告诉你用法你得自己写代码才有编程的乐趣不是吗???
operauser
2008-02-07 · TA获得超过496个赞
知道小有建树答主
回答量:876
采纳率:0%
帮助的人:0
展开全部
TreeView 控件
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式