澳门金沙30064在线网站VB中处理长列表框项的两种方法

By admin in 计算机教程 on 2019年11月16日

我们在编程的时候有时会需要得到系统中逻辑磁盘的一些信息,如磁盘卷标、磁盘序列号、空间大小、剩余空间等,这些信息直接使用VB提供的函数显然是无法得到的。但是,借助于VB对WINDOWS
API函数的支持,使用GetVolumeInformation和
GetDiskFreeSpace这两个API函数,我们就可以很容易的得到磁盘的相关信息。


  先来谈谈这两个函数。GetVolumeInformation函数用于获取与一个磁盘卷有关的信息,包括磁盘卷标、磁盘的序列号、文件的全路径名中“”与“\”之间部分的长度、文件系统的名称以及文件系统的某些特性。GetDiskFreeSpace函数用于获取与一个磁盘组织有关的信息,以及了解剩余空间的容量,包括磁盘上的总簇数、剩余簇数、一个簇内的扇区数和一个扇区内的字节数。

 

  接下来看看具体的例子。

在使用列表框(LISTBOX)中经常碰到的问题是,
用户使用时在其中添加的条目(Item)长短不一,由于界面所限,只能将列表框调整到能满足显示大部分条目的宽度。如果其中有比较长的条目则不能完全显示,而LISTBOX没有水平滚动条,这给用户的使用造成一些不便,可以通过为列表框加上一个水平滚动条的方法来解决,但这需要使用API函数,比较麻烦。使用VB的用户可能发现一个有趣的现象:在联机手册的使用中,如果条目过长,当鼠标指针移到其上时,将自动弹出包含完整信息的提示框,类似于流行的按钮提示信息。笔者经过分析,找到了实现这个功能的两种方法。

  进入VB中,在窗体上加入一个驱动器列表框(DriveListBox)和一个列表框(ListBox),然后加入以下的脚本:

 

Option Explicit
Private Declare Function GetVolumeInformation
Lib “kernel32” Alias
“GetVolumeInformationA” (ByVal lpRootPathName As
String, ByVal lpVolumeNameBuffer As
String, ByVal nVolumeNameSize As Long,
lpVolumeSerialNumber As Long,
lpMaximumComponentLength As Long,
lpFileSystemFlags As Long, ByVal
lpFileSystemNameBuffer As String,
ByVal nFileSystemNameSize As Long) As Long
Private Declare Function GetDiskFreeSpace
Lib “kernel32” Alias “GetDiskFreeSpaceA”
(ByVal lpRootPathName As String, lpSectorsPerCluster
As Long, lpBytesPerSector As Long,
lpNumberOfFreeClusters As Long,
lpTotalNumberOfClusters As Long) As Long
Private Const FS_CASE_IS_PRESERVED = &H2
Private Const FS_CASE_SENSITIVE = &H1
Private Const FS_UNICODE_STORED_ON_
DISK = &H4
Private Const FS_PERSISTENT_ACLS = &H8
Private Const FS_FILE_COMPRESSION = &H10
Private Const FS_VOL_IS_COMPRESSED =
&H8000

 
第一种方法的思路是:监视列表框中的鼠标移动事件,当鼠标移动到列表框的条目上时,利用SendMessage函数的LB_ITEMFROMPOINT参数获得条目的索引号,然后再判断条目的长度是否比列表框的宽度长,如果大于列表框宽度则将此索引号的条目内容赋予列表框的.ToolTipText属性。下面是一个例子,将演示此具有智能的列表框。

Private Sub Drive1_Change()
Dim Volume As String, SysName As String
Dim SerialNum As Long, SysFlags As Long,
ComponentLength As Long, Res As Long
Dim SectorsPerCluster As Long, BytesPerSector
As Long, NumberOfFreeClustors As
Long, TotalNumberOfClustors As Long
Dim FreeBytes As Long, TotalBytes As Long,
PercentFree As Long, Dl As Long
Dim DrvName As String
    List1.Clear
    Volume = String(256, 0)
    SysName = String(256, 0)
    DrvName = Left(Drive1.Drive, 2) & “”
Res = GetVolumeInformation(DrvName,
Volume, 255, SerialNum, _
    ComponentLength, SysFlags, SysName, 255)
    If Res = 0 Then
        List1.AddItem “不能得到磁盘信息”
    Else
        List1.AddItem “卷标: ” & Trim(Volume)
List1.AddItem “序列号: ” & SerialNum
List1.AddItem “成分长度: ” & ComponentLength
List1.AddItem “文件系统: ” & Trim(SysName)
Dl = GetDiskFreeSpace(DrvName,
SectorsPerCluster, BytesPerSector,
NumberOfFreeClustors, TotalNumberOfClustors)
        List1.AddItem “每簇中扇区数: “
      & Format(SectorsPerCluster, “#,0”)
        List1.AddItem “每扇区中字节数: “
      & Format(BytesPerSector, “#,0”)
        List1.AddItem “总簇数: “
        & Format(TotalNumberOfClustors, “#,0”)
        List1.AddItem “剩余簇数: “
        & Format(NumberOfFreeClustors, “#,0”)
        TotalBytes = TotalNumberOfClustors *
    SectorsPerCluster * BytesPerSector
        List1.AddItem “总字节数:
      ” & Format(TotalBytes, “#,0”)
        FreeBytes = NumberOfFreeClustors
* SectorsPerCluster * BytesPerSector
        List1.AddItem “剩余字节数: “
& Format(FreeBytes, “#,0”)
If SysFlags And FS_CASE_IS_PRESERVED Then
List1.AddItem “文件名的大小写记录于文件系统”
        End If
        If SysFlags And FS_CASE_SENSITIVE Then
            List1.AddItem “文件名要区分大小写”
        End If
        If SysFlags And FS_UNICODE_STORED_
ON_DISK Then
            List1.AddItem “文件名保存为 Unicode 格式”
        End If
        If SysFlags And FS_PERSISTENT_ACLS Then
            List1.AddItem “文件系统支持文件的访问
      控制列表(ACL)安全机制”
        End If
        If SysFlags And FS_FILE_COMPRESSION Then
      List1.AddItem “文件系统支持逐文件地进行文件压缩”
        End If
        If SysFlags And FS_VOL_IS_COMPRESSED Then
            List1.AddItem “整个磁盘卷都是压缩的”
        End If
    End If
End Sub

 

Private Sub Form_Load()
    Call Drive1_Change
End Sub

  在窗体中添加一个列表框List1,在总体声明部分声明API函数如下:

  运行后,选择驱动器列表框中的不同驱动器,列表框中就会显示出该驱动器的相应信息。以上程序在VB5.0、VB6.0及WINDOWS
98中运行通过。

 

Option Explicit

 

Private Declare Function SendMessag

Lib “user32” Alias “SendMessageA” _

(ByVal hwnd As Long, ByVal wMsg

As Long, ByVal wParam As Long, _

lParam As Any) As Long

 

Private Const LB_ITEMFROMPOINT = &H1A9

 

编写列表框的鼠标移动事件代码如下:

Private Sub List1_MouseMove(Button As
Integer,

Shift As Integer, _X As Single, Y As Single)

 

Dim lXPoint As Long

Dim lYPoint As Long

Dim lIndex As Long

If Button = 0 Then

lXPoint = CLng(X / Screen.TwipsPerPixelX)

lYPoint = CLng(Y / Screen.TwipsPerPixelY)

 

With List1

获得当前条目的索引号

lIndex = SendMessage(.hwnd, LB_ITEMFROMPOINT, 0,
_

ByVal ((lYPoint * 65536) + lXPoint))

If (lIndex >= 0) And (lIndex < = .ListCount)
Then

判断条目的长度是否大于列表框宽度

If TextWidth(.List(lIndex)) > .Width Then

.ToolTipText = .List(lIndex)

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 澳门金沙30064在线网站 版权所有