每次打开Commondialog控件的另存为对话框都是让我指定到文件,可是另存为时我是要指定一个文件夹,要怎么办?
解决方案 »
- 关于监视 ie 输入网址
- 赚分,马上结...
- VB程序如何编写流程图?
- 高手帮忙,请问VB如何修复access 97 或者access 2000或更高版本的数据库,压缩数据库又怎样处理?
- 哪个朋友知道能发音的控件!
- 如何隐藏窗体的问题
- DB开发
- 关于MSComm1的问题,我在两个窗体form1和form2中用到了MSComm1控件,如果我在关闭form1后马上打开form2的时候,会出现端口已打开的错误报
- 关于LISTVIEW的排序问题!
- 我用vb跟access2000连接的问题???急啊!!!!!!!11
- debug.Assert与Debug.Print的区别.
- 强烈寻求一种禁止在虚拟机里运行的代码
Option ExplicitPrivate Sub Form_Load()
With CommonDialog1
.InitDir = "D:\" '你要设置的路径
.ShowSave
End With
End Sub
我不是想设置初始路径,我是想让ShowSave得到的Filename是一个文件夹而不是文件,巫师能明白么
'不支持win98
'增强版文件夹选择框
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_USER = &H400
Private Const BFFM_SETSELECTIONA As Long = (WM_USER + 102)
Private Const BFFM_INITIALIZED As Long = 1Public Declare Function SHBrowseForFolder Lib "Shell32.dll" Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
'很明显它需要一个 BROWSEINFO 结构的指针,如下:
Public Type BROWSEINFO
hOwner As Long '注释:父窗口的句柄
pidlRoot As Long '注释:指向希望浏览的最上层的文件夹的标识符列表,可设为0
pszDisplayName As String '注释:返回你所选择的文件夹(带一个NULL字符)
lpszTitle As String '注释:对话框标题(要以vbNullChar结尾)
ulFlags As Long '注释:浏览标志(见下面)
lpfn As Long '注释:回调函数的地址,可设为NULL
lParam As Long '注释:若有回调函数,此项设置它的值
iImage As Long '注释:保存所选文件夹映像索引的缓冲区
End TypePublic Const BIF_BROWSEFORCOMPUTER = &H1000 '注释:允许浏览计算机
Public Const BIF_BROWSEFORPRINTER = &H2000 '注释:允许浏览打印机文件夹
Public Const BIF_BROWSEINCLUDEFILES = &H4000 '注释:允许同时浏览文件(需IE4)
Public Const BIF_DONTGOBELOWDOMAIN = &H2 '注释:强制用户停留在网上邻居中
Public Const BIF_EDITBOX = &H10 '注释:可在输入框中直接输入文件夹名(需IE4)
Public Const BIF_RETURNFSANCESTORS = &H8 '注释:返回文件系统祖先?
Public Const BIF_RETURNONLYFSDIRS = &H1 '注释:仅允许浏览文件系统
Public Const BIF_STATUSTEXT = &H4 '注释:显示状态栏
Public Const BIF_USENEWUI = &H40 '注释:使用新界面(仅支持Win2000、WinME)
Public Const BIF_VALIDATE = &H20 '注释:若输入一个非法文件夹名,就返回
'BFFM_VALIDATEFAILED 给回调函数
Public lastfolder As String
Dim nowdir As String
'有了这些还不够,因为 SHBrowseForFolder 返回的是文件夹的标识符列表(pidl),还需要用另一个函数将标识符列表转换成系统文件夹,这就是 SHGetPathFromIDList:
Public Declare Function SHGetPathFromIDList Lib "Shell32.dll" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long
'Dim i As Integer
'*******************************************
'下面我就来演示怎么将这些 API 放在一起,协同工作:
Public Function showdir(Optional defaultselectfolder As String, Optional editmode As Boolean, Optional issave As Boolean, Optional title As String = "选择文件夹", Optional hwnd As Long) As String
On Error Resume Next
If hwnd = 0 Then hwnd = Screen.ActiveForm.hwnd
'<start>弹出打开文件夹对话框
Dim bi As BROWSEINFO
Dim pidl As Long
Dim folder As String
Dim ret As Long
nowdir = defaultselectfolder
If issave And (title = "选择文件夹" Or title = "") Then
title = "保存到目录:"
Else
If title = "" Then title = "请选择一个文件夹"
End If
If nowdir = "" Then
nowdir = lastfolder
End If
folder = String(255, vbNullChar)
With bi
.hOwner = hwnd
If editmode Then '可新增
.ulFlags = BIF_RETURNONLYFSDIRS Or BIF_USENEWUI Or BIF_EDITBOX
End If
.pidlRoot = 0
.lpszTitle = title
.lpfn = MyAddressOf(AddressOf BrowseForFolders_CallbackProc)
End With
pidl = SHBrowseForFolder(bi)
If SHGetPathFromIDList(ByVal pidl, ByVal folder) Then
lastfolder = Left(folder, Len(nowdir))
lastfolder = Left(folder, InStr(folder, vbNullChar) - 1)
If Right(lastfolder, 1) <> "\" Then lastfolder = lastfolder & "\"
showdir = lastfolder
Else
showdir = ""
End If
End Function
Private Function BrowseForFolders_CallbackProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal lParam As Long, ByVal lpData As Long) As Long
If uMsg = BFFM_INITIALIZED Then
SendMessage hwnd, BFFM_SETSELECTIONA, True, ByVal nowdir
End If
End Function
Private Function MyAddressOf(AddressOfX As Long) As Long
MyAddressOf = AddressOfX
End Function