VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - VB问题全功略(43)
发表评论(0)作者:不详, 平台:VB6.0+Win98, 阅读:10243, 日期:2002-02-02
VB问题全功略(43)

211、如何将短文件名格式转成长文件名?
212、如何将桌面上的图标排列整齐?
213、VB 的 SDI / MDI 开发环境切换
214、Combo的自动查询技术
215、如何改变 TreeView 的背景
211、如何将短文件名格式转成长文件名?

虽然在 Windows95/98 中已经都可以使用长文件名/目录 (最长可以到255个字节),但是在您将长文件名的文件或目录存文件时,系统同时给了它一个可以相容于以前 MS-DOS 时代的 8.3 格式的文件名称!

到目前为止,还是有些软件会使用 8.3 格式的文件名称,在安装这些软件时,它们写到注册文件中的资料,仍然采用 8.3 格式的文件名称,所以有时候,您在维护系统时,必须知道目前这些已经转成 8.3 格式的文件名称,原来的长文件名是什么。

在 问题:如何将长文件名转成短文件名格式 (MS-DOS 8.3) ,我们已经讲过长文件名转成短文件名,当时是使用 API 来做,过程上还蛮麻烦的,但是相反的,要从短文件名转成长文件名,过程却比较简单,也不需要用到 API,只要使用 Dir( ) 就可以了!

注释:请将以下的模组放到声明区中:

Public Function GetLongFilename(ByVal sShortName As String) As String
Dim sLongName As String
Dim sTemp As String
Dim iSlashPos As Integer

注释:在短文件名之后加上倒斜线 "\",避免 Instr 造成错误
sShortName = sShortName & "\"
注释:略过磁盘代号,从第四码开始
iSlashPos = InStr(4, sShortName, "\")

注释:从文件名之第四码之后,一段一段处理在二个倒斜线 "\"之间的字串转换
While iSlashPos
sTemp = Dir(Left$(sShortName, iSlashPos - 1), vbNormal + vbHidden + vbSystem + vbDirectory)
If sTemp = "" Then 注释:Error 52 - Bad File Name or Number
GetLongFilename = ""
Exit Function
End If
sLongName = sLongName & "\" & sTemp
iSlashPos = InStr(iSlashPos + 1, sShortName, "\")
Wend
注释:将转换后的文件名加上原先略过的磁盘代号,变成完整的全路径文件名
GetLongFilename = Left$(sShortName, 2) & sLongName
End Function

注释:实际使用范例如下:

Private Sub Command1_Click()
注释:假设 C:\Program Files\Common Files 是一个正确的全路径文件名或目录
Print GetLongFilename("C:\PROGRA~1\COMMON~1")
End Sub

注释:结果就是 C:\Program Files\Common Files。

212、如何将桌面上的图标排列整齐?

您的或您的使用者的桌面是否有一大堆乱乱的图标,您可以使用 VB 来将这些图标排列整 !

程序码如下:

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long

Private Const GW_CHILD = 5
Private Const LVA_ALIGNLEFT = &H1
Private Const LVM_ARRANGE = &H1016

Private Sub Command1_Click()
Dim hWnd1 As Long
Dim hWnd2 As Long
Dim Ret As Long

hWnd1 = FindWindow("Progman", vbNullString)
hWnd2 = GetWindow(hWnd1, GW_CHILD)
hWnd1 = GetWindow(hWnd2, GW_CHILD)
Ret = SendMessage(hWnd1, LVM_ARRANGE, 0, 0)
End Sub

执行完以上的程序码后,桌面上的所有图标便会自动的靠左对齐!

213、VB 的 SDI / MDI 开发环境切换

如果您使用过 Windows 应用程序,也许已经注意到并不是每个程序的使用者介面看上去都一样,也不见得同样的介面做的事就一样。使用者介面样式主要有两种:单一文件介面 (SDI) 和多重文件介面 (MDI)。SDI 介面的一个典型就是 Microsoft Windows 中的 WordPad 程序 (图 6.1)。在WordPad 中,使用者一次只能开启一个文件 (文件),想要开启另一个文件时,就必须先关上已开启的文件。

像 Microsoft Excel 和 Microsoft Word for Windows 这样的应用程序,就是 MDI 介面;它们允许同时显示多个文件,每个文件都显示在自己的视窗中 (图 6.2)。从程序的「视窗」功能表 ,可以看出它是否为一个 MDI 应用程序。如果「视窗」功能表中含有已开启的文件清单,可以让使用者藉此来切换要显示或编辑的文件,这个程序就是一个 MDI 应用程序。

Visual Basic IDE 也有这两种不同的型态:单一文件介面 (SDI) 或多重文件介面 (MDI)。对 SDI 选项来说,只要 Visual Basic 是目前作用中的应用程序,则所有 IDE 视窗都可在屏幕上的任何地方自由移动,并且会保持在其它的应用程序之上;而对 MDI 选项来说,所有 IDE 视窗则都包含在一个可调整大小的父视窗内。

在 VB5 或 VB6 刚安装好时,预设的开发环境是多重文件介面 (MDI),它最麻烦的地方是,当您的表单大小比较大时,或者您的表单是最大化时,您必须在 MDI 开发环境中使用卷动杆来移动表单,对设计者来说,不能一次看到表单的全貌,是相当不方便的,所以您需要将开发环境改成 SDI,但是要如何改呢?有的人找来找去,就是找不到从那里改,其实很简单,方法如下:

SDI 和 MDI 模式的切换 :

1、在「工具」功能表中选取「选项」。 此时会显示「选项」对话方块。
2、再选取「进阶」页签。
3、核取或取消核取「SDI 开发环境」核取方块。

-或-

1、在指令行使用 /sdi 或 /mdi 参数来执行 Visual Basic。

设定好之后,不会马上生效!但是当您下次启动 Visual Basic 时,IDE 将以您选取的模式启动。

214、Combo的自动查询技术

Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Public Const CB_FINDSTRING = &H14C

Private Sub Combo1_Change()
Dim iStart As Integer
Dim sString As String
Static iLeftOff As Integer

iStart = 1
iStart = Combo1.SelStart

If iLeftOff <> 0 Then
Combo1.SelStart = iLeftOff
iStart = iLeftOff
End If

sString = CStr(Left(Combo1.Text, iStart))
Combo1.ListIndex = SendMessage(Combo1.hwnd, B_FINDSTRING, -1, ByVal CStr(Left(ombo1.Text, iStart)))

If Combo1.ListIndex = -1 Then
iLeftOff = Len(sString)
combo1.Text = sString
End If

Combo1.SelStart = iStart
iLeftOff = 0
End Sub

静态变量 iLeftOff 指定了字符长度。

215、如何改变 TreeView 的背景

Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
Private Declare Function GetWindowLong Lib "User32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "User32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Private Const GWL_STYLE = -16&
Private Const TVM_SETBKCOLOR = 4381&
Private Const TVM_GETBKCOLOR = 4383&
Private Const TVS_HASLINES = 2&

Dim frmlastForm As Form

Private Sub Form_Load()
Dim nodX As Node
Set nodX = TreeView1.Nodes.Add(, , "R", "Root")
Set nodX = TreeView1.Nodes.Add("R", tvwChild, "C1", "Child 1")
Set nodX = TreeView1.Nodes.Add("R", tvwChild, "C2", "Child 2")
Set nodX = TreeView1.Nodes.Add("R", tvwChild, "C3", "Child 3")
Set nodX = TreeView1.Nodes.Add("R", tvwChild, "C4", "Child 4")
nodX.EnsureVisible
TreeView1.style = tvwTreelinesText 注释: Style 4.
TreeView1.BorderStyle = vbFixedSingle
End Sub

Private Sub Command1_Click()
Dim lngStyle As Long
Call SendMessage(TreeView1.hWnd, TVM_SETBKCOLOR, 0, ByVal RGB(255, 0, 0))
注释:改变背景到红色

lngStyle = GetWindowLong(TreeView1.hWnd, GWL_STYLE)
Call SetWindowLong(TreeView1.hWnd, GWL_STYLE, lngStyle - TVS_HASLINES)
Call SetWindowLong(TreeView1.hWnd, GWL_STYLE, lngStyle)
End Sub