“浏览文件夹”窗口,就是在windows下升级驱动程序出现的那个。:D
解决方案 »
- vb2008引用EXcel问题
- VB 遂行读取文本 两组字段
- 晕!数据库恢复的问题!急死了..............
- 狼,近来拿分。
- VB里面有没有像Html 的Form的Reset方法?难道要自己记住初始值来实现重置吗?
- fuxc(Michael):快去非技术版领分。1000分喔!
- adodb.connection 的连接。。。。
- 哪位大侠知道installshied6.3的汉化问题怎么解决(tansm能不能来看一下)
- 怎样刷新Access数据库中的表
- AcitiveX控件函数怎么不能用?
- Dim xlApp As New Excel.Application未定义?我该引用哪个?
- 剪切板如何用自定义格式的数据?
如果是文件夹的话就“浏览文件夹”(只能显示文件夹及文件,不能指定文件类别),如果是文件的话用“打开”(可以显示指定类别的文件,如:.txt文件)楼主的意思是不是指:选择一个文件夹,然后把这个文件夹中所有指定类型的文件打开(或其它操作)?如果是这样的话,你可以先选择文件夹,然后利用FileListBox来获取这个文件夹中所有指定类别的文件。
你讲的那个方法在界面上看起来让人不舒服,还有一个active控件common dialog control,如果程序运行,需要它的ocx文件。现在想用api的办法,应该是比较好的。
我找到一个api调用common dialog control控件showsave对话框的实例,但我不知道怎么用这个api函数来实现以下需求。 如何用api调用common dialog control控件的showopen对话框,满足文件名获得的需求。 请高手和老鸟指导。 下面是我找到的那个api调用common dialog control控件showsave对话框的实例:
Private Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As LongPrivate Type OPENFILENAME lStructSize As Long hwndOwner As Long hInstance As Long lpstrFilter As String lpstrCustomFilter As String nMaxCustFilter As Long nFilterIndex As Long lpstrFile As String nMaxFile As Long lpstrFileTitle As String nMaxFileTitle As Long lpstrInitialDir As String lpstrTitle As String flags As Long nFileOffset As Integer nFileExtension As Integer lpstrDefExt As String lCustData As Long lpfnHook As Long lpTemplateName As StringEnd TypeDim OFName As OPENFILENAMEPrivate Function ShowSave() As String 'Set the structure size OFName.lStructSize = Len(OFName) 'Set the owner window OFName.hwndOwner = Me.hwnd 'Set the application's instance OFName.hInstance = App.hInstance 'Set the filet OFName.lpstrFilter = "Text Files (*.txt)" + Chr$(0) + "*.txt" + Chr$(0) + "All Files (*.*)" + Chr$(0) + "*.*" + Chr$(0) 'Create a buffer OFName.lpstrFile = Space$(254) 'Set the maximum number of chars OFName.nMaxFile = 255 'Create a buffer OFName.lpstrFileTitle = Space$(254) 'Set the maximum number of chars OFName.nMaxFileTitle = 255 'Set the initial directory OFName.lpstrInitialDir = "C:\" 'Set the dialog title OFName.lpstrTitle = "Save File - KPD-Team 1998" 'no extra flags OFName.flags = 0 'Show the 'Save File'-dialog If GetSaveFileName(OFName) Then ShowSave = Trim$(OFName.lpstrFile) Else ShowSave = "" End IfEnd Function
所有的通用对话框都可以用API实现,所以可以不用OCX控件。
我先贴一段代码,你看看是不是你想要的:
Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
Private Const BIF_BROWSEINCLUDEFILES = &H4000 '包含文件
Private Const BIF_RETURNONLYFSDIRS = 1 '返回目录
Private Const BIF_BROWSEINCLUDEURLS As Long = &H80 '包含网页
Private Const MAX_PATH = 260
Private Type BrowseInfo
hwndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lparam As Long
iImage As Long
End Type
'浏览文件夹
Private Function BrowseFolder(lhWnd As Long, sPrompt As String, Optional sIniDir As String = "") As String
Dim iNull As Integer
Dim lpIDList As Long
Dim lResult As Long
Dim sPath As String
Dim udtBI As BrowseInfo With udtBI
.hwndOwner = lhWnd
.lpszTitle = lstrcat(sPrompt, "")
.ulFlags = BIF_RETURNONLYFSDIRS Or BIF_BROWSEINCLUDEFILES Or BIF_BROWSEINCLUDEURLS
' .lpfnCallback = GetProc(AddressOf BrowseCallbackProc)
End With lpIDList = SHBrowseForFolder(udtBI)
If lpIDList Then
sPath = String$(MAX_PATH, 0)
lResult = SHGetPathFromIDList(lpIDList, sPath)
Call CoTaskMemFree(lpIDList)
iNull = InStr(sPath, vbNullChar)
If iNull Then sPath = Left$(sPath, iNull - 1)
End If BrowseFolder = Trim$(sPath)
End FunctionPrivate Sub Command1_Click()
Me.AutoRedraw = True
Print BrowseFolder(Me.hWnd, "asdf")
End Sub
'******************文件对话框用到的 API函数、常量和结构开始**********************
'显示“打开文件”对话框
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Private Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long
Private Const OFN_FILEMUSTEXIST = &H1000 '文件必须存在
Private Const OFN_HIDEREADONLY = &H4 '隐藏只读按钮
Private Const OFN_ALLOWMULTISELECT = &H200 '允许多选
Private Const OFN_EXPLORER = &H80000 '以资源管理器样子显示对话框
Private Const OFN_CREATEPROMPT = &H2000 '文件不存在时提示创建
Private Const OFN_OVERWRITEPROMPT = &H2 '当覆盖时提示
Private Const OFN_PATHMUSTEXIST = &H800 '路径必须存在Private Type OPENFILENAME
lStructSize As Long '结构大小
hwndOwner As Long '父窗口句柄
hInstance As Long '实例句柄
lpstrFilter As String '文件过滤字符串
lpstrCustomFilter As String '自定义的文件过滤字符串
nMaxCustFilter As Long '自定义的文件过滤字符串的最大长度
nFilterIndex As Long '默认的文件过滤
lpstrFile As String '返回的文件(全路径)
nMaxFile As Long '返回的文件的最大长度
lpstrFileTitle As String '返回的文件的名称
nMaxFileTitle As Long '返回的文件的名称的最大长度
lpstrInitialDir As String '初始化目录
lpstrTitle As String '对话框标题
flags As Long '
nFileOffset As Integer '
nFileExtension As Integer '返回的文件的扩展名
lpstrDefExt As String '默认的扩展名
lCustData As Long '
lpfnHook As Long '
lpTemplateName As String '
End Type
'******************文件对话框用到的 API函数、常量和结构结束**********************'文件对话框特性
Private Enum FileFlags
[ffHideReadOnly] = OFN_HIDEREADONLY '隐藏只读复选框(打开、保存)
[ffFileMustExist] = OFN_FILEMUSTEXIST '返回的文件必须存在(打开)
[ffPathMustExist] = OFN_PATHMUSTEXIST '返回的路径必须存在(保存)
[ffOverWritePrompt] = OFN_OVERWRITEPROMPT '当文件存在时提示是否覆盖(保存)
[ffExplorer] = OFN_EXPLORER '以资源管理器样子显示对话框(打开、保存)
[ffAllowMultiSelect] = OFN_ALLOWMULTISELECT '允许多选(打开)
[ffCreatePrompt] = OFN_CREATEPROMPT '文件不存在时提示创建新文件(保存)
End Enum'文件对话框的类型
Private Enum FileDlg
[fdOpen] = 0 '打开
[fdSave] = 1 '保存
End EnumPrivate Function FileDialog(lhWnd As Long, fd As FileDlg, ByVal sFilter As String, ByVal sTitle As String, Optional lMax As Long = 255, Optional sDefExt As String = "", Optional sIniDir As String = "", Optional ff As FileFlags = 0)
'*************************************************************************
'名 称:通用文件对话框函数(打开和保存)
'作 者:方耀东([email protected])
'日 期:2003-11-25
'参 数:lhWnd As Long 窗口句柄
' fd As FileDlg 对话框类型,参考 FileDlg 枚举
' sFilter As String 文件类型,形如:"MP3 (*.mp23)" & Chr$(0) & "*.mp3" & Chr$(0) "WAV (*.wav)" & Chr$(0) & "*.wav" & Chr$(0)
' sTitle As String 对话框标题
' lMax As Long 返回的文件(全路径)和文件标题的最大长度
' sDefExt As String 如果没有为文件指定扩展名的话,将使用这个默认的扩展名(用于保存对话框)
' sIniDir As String 打开对话框时的初始目录
' ff As FileFlags 对话框效果,参考 FileFlags 枚举
'返回值:对话框返回的文件(全路径,String类型)
'说 明:此函数用于显示打开(或保存,由 fd 参数决定)对话框
' 并以全路径形式返回选择的文件
'************************************************************************** Dim OFName As OPENFILENAME
With OFName
'设置结构的大小
.lStructSize = Len(OFName)
'设置父窗口
.hwndOwner = lhWnd
'设置程序的实例
.hInstance = App.hInstance
'设置过滤属性
.lpstrFilter = sFilter '"MusicBox 播放列表(*.mbp)" & Chr$(0) & "*.mbp" & Chr$(0)
'设置默认扩展名
If sDefExt <> "" Then .lpstrDefExt = sDefExt
'为文件(全路径)创建缓冲区
.lpstrFile = Space$(lMax - 1)
'设置返回的文件(全路径)的最大长度
.nMaxFile = lMax
'为文件名称创建缓冲区
.lpstrFileTitle = Space$(lMax - 1)
'设置返回的文件名称的最大长度
.nMaxFileTitle = lMax
'设置初始目录
If sIniDir <> "" Then .lpstrInitialDir = sIniDir
'设置对话框标题
.lpstrTitle = sTitle '"保存播放列表"
.flags = ff
End With
'显示对话框并获取返回的文件
If fd = fdOpen Then
If GetOpenFileName(OFName) Then
FileDialog = OFName.lpstrFile
Else
FileDialog = ""
End If
Else
If GetSaveFileName(OFName) Then
FileDialog = OFName.lpstrFile
Else
FileDialog = ""
End If
End If
End FunctionPrivate Sub Command1_Click()
Me.AutoRedraw = True
Dim strFilter As String
strFilter = "文本文档(*.txt)" & Chr$(0) & "*.txt" & Chr$(0) & "所有文件(*.*)" & Chr$(0) & "*.*" & Chr$(0)
Print FileDialog(Me.hWnd, fdOpen, strFilter, "示例 - 打开文件对话框", 255, "txt", App.Path)
End Sub
函数原型:
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
说明:
The GetOpenFileName function creates an Open common dialog box that lets the user specify the drive, directory, and the name of a file or set of files to open.
参数:
lpofn
Pointer to an OPENFILENAME structure that contains information used to initialize the dialog box. When GetOpenFileName returns, this structure contains information about the user抯 file selection.
返回值:
If the user specifies a filename and clicks the OK button, the return value is nonzero. The buffer pointed to by the lpstrFile member of the OPENFILENAME structure contains the full path and filename specified by the user. If the user cancels or closes the Open dialog box or an error occurs, the return value is zero. To get extended error information, call the CommDlgExtendedError function, which can return one of the following values:
CDERR_FINDRESFAILURE, CDERR_NOHINSTANCE, CDERR_INITIALIZATION, CDERR_NOHOOK, CDERR_LOCKRESFAILURE, CDERR_NOTEMPLATE, CDERR_LOADRESFAILURE, CDERR_STRUCTSIZE, CDERR_LOADSTRFAILURE, FNERR_BUFFERTOOSMALL, CDERR_MEMALLOCFAILURE, FNERR_INVALIDFILENAME, CDERR_MEMLOCKFAILURE, FNERR_SUBCLASSFAILURE哦,对了,上面的程序中因为使用了多选的功能,所以返回的文件名后面有Chr$(0)字符,把它去掉就可以了:
把这一句:
Print FileDialog(Me.hWnd, fdOpen, strFilter, "示例 - 打开文件对话框", 255, "txt", App.Path)
改成:
Print Replace(FileDialog(Me.hWnd, fdOpen, strFilter, "示例 - 打开文件对话框", 8192, "txt", App.Path), Chr$(0), "")
如果你要选择多个文件的话,就不要把Chr$(0)去掉,因为多个文件名之间是用Chr$(0)分隔的。
能得到你的指导,我很荣幸。
希望以后和你多多学习。我的msn是:[email protected]