共计 12230 个字符,预计需要花费 31 分钟才能阅读完成。
'VB_纯API 打开保存对话框源码
'Call FileDialog(Me, False, "测试", "*.*", "", "", "") 'TRUE 保存 FALSE 打开
'DownLoad Code
Option Explicit
Public 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
Public 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
Public Const OFN_READONLY As Long = &H1
Public Const OFN_OVERWRITEPROMPT As Long = &H2
Public Const OFN_HIDEREADONLY As Long = &H4
Public Const OFN_NOCHANGEDIR As Long = &H8
Public Const OFN_SHOWHELP As Long = &H10
Public Const OFN_ENABLEHOOK As Long = &H20
Public Const OFN_ENABLETEMPLATE As Long = &H40
Public Const OFN_ENABLETEMPLATEHANDLE As Long = &H80
Public Const OFN_NOVALIDATE As Long = &H100
Public Const OFN_ALLOWMULTISELECT As Long = &H200
Public Const OFN_EXTENSIONDIFFERENT As Long = &H400
Public Const OFN_PATHMUSTEXIST As Long = &H800
Public Const OFN_FILEMUSTEXIST As Long = &H1000
Public Const OFN_CREATEPROMPT As Long = &H2000
Public Const OFN_SHAREAWARE As Long = &H4000
Public Const OFN_NOREADONLYRETURN As Long = &H8000
Public Const OFN_NOTESTFILECREATE As Long = &H10000
Public Const OFN_NONETWORKBUTTON As Long = &H20000
Public Const OFN_NOLONGNAMES As Long = &H40000
Public Const OFN_EXPLORER As Long = &H80000
Public Const OFN_NODEREFERENCELINKS As Long = &H100000
Public Const OFN_LONGNAMES As Long = &H200000
Public Const OFN_SHAREFALLTHROUGH As Long = 2
Public Const OFN_SHARENOWARN As Long = 1
Public Const OFN_SHAREWARN As Long = 0
Public Const BrowseForFolders As Long = &H1
Public Const BrowseForComputers As Long = &H1000
Public Const BrowseForPrinters As Long = &H2000
Public Const BrowseForEverything As Long = &H4000
Public Const CSIDL_BITBUCKET As Long = 10
Public Const CSIDL_CONTROLS As Long = 3
Public Const CSIDL_DESKTOP As Long = 0
Public Const CSIDL_DRIVES As Long = 17
Public Const CSIDL_FONTS As Long = 20
Public Const CSIDL_NETHOOD As Long = 18
Public Const CSIDL_NETWORK As Long = 19
Public Const CSIDL_PERSONAL As Long = 5
Public Const CSIDL_PRINTERS As Long = 4
Public Const CSIDL_PROGRAMS As Long = 2
Public Const CSIDL_RECENT As Long = 8
Public Const CSIDL_SENDTO As Long = 9
Public Const CSIDL_STARTMENU As Long = 11
Public Const MAX_PATH As Long = 260
Public Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Public Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long
Public Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)
Public Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Public Declare Function SHBrowseForFolder Lib "shell32" (lpBI As BrowseInfo) As Long
Public Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
Public Declare Function SHGetSpecialFolderLocation Lib "shell32" (ByVal hwndOwner As Long, ByVal nFolder As Long, ListId As Long) As Long
Public Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
Public Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
Public Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Public Declare Function GetTempFileName Lib "kernel32" Alias "GetTempFileNameA" (ByVal lpszPath As String, ByVal lpPrefixString As String, ByVal wUnique As Long, ByVal lpTempFileName As String) As Long
Public Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
Public Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameA" (ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long
Public Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
Public Declare Function GetTickCount Lib "kernel32" () As Long
Public Function FileDialog(FormObject As Form, SaveDialog As Boolean, ByVal Title As String, ByVal Filter As String, Optional ByVal FileName As String, Optional ByVal Extention As String, Optional ByVal InitDir As String) As String
Dim OFN As OPENFILENAME
Dim r As Long
If Len(FileName) > MAX_PATH Then Call MsgBox("Filename Length Overflow", vbExclamation, App.Title + " - FileDialog Function"): Exit Function
FileName = FileName + String(MAX_PATH - Len(FileName), 0)
With OFN
.lStructSize = Len(OFN)
.hwndOwner = 0
.hInstance = App.hInstance
.lpstrFilter = Replace(Filter, "|", vbNullChar)
.lpstrFile = FileName
.nMaxFile = MAX_PATH
.lpstrFileTitle = Space$(MAX_PATH - 1)
.nMaxFileTitle = MAX_PATH
.lpstrInitialDir = InitDir
.lpstrTitle = Title
.flags = OFN_HIDEREADONLY Or OFN_OVERWRITEPROMPT Or OFN_CREATEPROMPT
.lpstrDefExt = Extention
End With
Dim L As Long
L = GetTickCount
If SaveDialog Then r = GetSaveFileName(OFN) Else r = GetOpenFileName(OFN)
If GetTickCount - L < 20 Then
OFN.lpstrFile = ""
If SaveDialog Then r = GetSaveFileName(OFN) Else r = GetOpenFileName(OFN)
End If
If r = 1 Then FileDialog = Left$(OFN.lpstrFile, InStr(1, OFN.lpstrFile + vbNullChar, vbNullChar) - 1)
End Function
Public Function BrowseFolders(FormObject As Form, sMessage As String) As String
Dim B As BrowseInfo
Dim r As Long
Dim L As Long
Dim f As String
FormObject.Enabled = False
With B
.hwndOwner = FormObject.hWnd
.lpszTitle = lstrcat(sMessage, "")
.ulFlags = BrowseForFolders
End With
SHGetSpecialFolderLocation FormObject.hWnd, CSIDL_DRIVES, B.pIDLRoot
r = SHBrowseForFolder(B)
If r <> 0 Then
f = String(MAX_PATH, vbNullChar)
SHGetPathFromIDList r, f
CoTaskMemFree r
L = InStr(1, f, vbNullChar) - 1
If L < 0 Then L = 0
f = Left(f, L)
AddSlash f
End If
BrowseFolders = f
FormObject.Enabled = True
End Function
Public Property Get WindowsDirectory() As String
Static r As String
If Len(r) = 0 Then
Dim L As Long
L = MAX_PATH
r = String(L, 0)
L = GetWindowsDirectory(r, L)
If L > 0 Then
r = Left$(r, L)
AddSlash r
Else
r = ""
End If
End If
WindowsDirectory = r
End Property
Public Property Get WindowsTempDirectory() As String
Static m_WindowsTempDirectory As String
If Len(m_WindowsTempDirectory) = 0 Then
Dim Buffer As String
Dim Length As Long
Buffer = String(MAX_PATH, 0)
Length = GetTempPath(MAX_PATH, Buffer)
If Length > 0 Then
m_WindowsTempDirectory = Left$(Buffer, Length)
AddSlash m_WindowsTempDirectory
End If
End If
WindowsTempDirectory = m_WindowsTempDirectory
End Property
Public Property Get WindowsSystemDirectory() As String
Static m_WindowsSystemDirectory As String
If Len(m_WindowsSystemDirectory) = 0 Then
Dim Buffer As String
Dim Length As Long
Buffer = String(MAX_PATH, 0)
Length = GetSystemDirectory(Buffer, MAX_PATH)
If Length > 0 Then
m_WindowsSystemDirectory = Left$(Buffer, Length)
AddSlash m_WindowsSystemDirectory
End If
End If
WindowsSystemDirectory = m_WindowsSystemDirectory
End Property
Public Property Get AppPath() As String
Static m_AppPath As String 'Returns Program EXE File Name
If Len(m_AppPath) = 0 Then
Dim ret As Long
Dim Length As Long
Dim FilePath As String
Dim FileHandle As Long
FilePath = String(MAX_PATH, 0)
FileHandle = GetModuleHandle(App.EXEName)
ret = GetModuleFileName(FileHandle, FilePath, MAX_PATH)
Length = InStr(1, FilePath, vbNullChar) - 1
If Length > 0 Then m_AppPath = Left$(FilePath, Length)
End If
AppPath = m_AppPath
End Property
Public Property Get DefaultSettingsFile() As String
Static m_DefaultSettingsFile As String
If Len(m_DefaultSettingsFile) = 0 Then m_DefaultSettingsFile = FileTitleOnly(AppPath, True) & "Settings.Dat"
DefaultSettingsFile = m_DefaultSettingsFile
End Property
Public Property Get DefaultLegendFile() As String
Static m_DefaultLegendFile As String
If Len(m_DefaultLegendFile) = 0 Then m_DefaultLegendFile = FileTitleOnly(AppPath, True) & "Legends.Txt"
DefaultLegendFile = m_DefaultLegendFile
End Property
Public Function FileExists(FileName As String) As Boolean
If Len(FileName) > 0 Then FileExists = (Len(Dir(FileName, vbNormal Or vbReadOnly Or vbHidden Or vbSystem Or vbArchive)) > 0)
End Function
Public Function DirectoryExists(ByVal Directory As String) As Boolean
AddSlash Directory
DirectoryExists = Len(Directory) > 0 And Len(Dir(Directory + "*.*", vbDirectory)) > 0
End Function
Public Function FileTitleOnly(FileName As String, Optional ReturnDirectory As Boolean) As String
If ReturnDirectory Then
FileTitleOnly = Left$(FileName, InStrRev(FileName, "\"))
Else
FileTitleOnly = Right$(FileName, Len(FileName) - InStrRev(FileName, "\"))
End If
End Function
Public Sub AddSlash(Directory As String)
If InStrRev(Directory, "\") <> Len(Directory) Then Directory = Directory + "\"
End Sub
Public Sub RemoveSlash(Directory As String)
If Len(Directory) > 3 And InStrRev(Directory, "\") = Len(Directory) Then Directory = Left$(Directory, Len(Directory) - 1)
End Sub
Public Sub RidFile(FileName As String)
If FileExists(FileName) Then
SetAttr FileName, vbNormal
Kill FileName
End If
End Sub
Public Function GetShortName(ByVal FileName As String) As String
Dim Buffer As String
Dim Length As Long
Buffer = String(MAX_PATH, 0)
Length = GetShortPathName(FileName, Buffer, MAX_PATH)
If Length > 0 Then GetShortName = Left$(Buffer, Length)
End Function
Public Function CreateTempFile(Optional ByVal Prefix As String, Optional Directory As String) As String
Dim Buffer As String
Dim Length As Long
Buffer = String(MAX_PATH, 0)
If Len(Prefix) = 0 Then Prefix = Left$(App.Title + "TMP", 3)
If Not DirectoryExists(Directory) Then Directory = WindowsTempDirectory
If GetTempFileName(Directory, Prefix, 0&, Buffer) = 0 Then Exit Function
Length = InStr(1, Buffer, vbNullChar) - 1
If Length > 0 Then CreateTempFile = Left$(Buffer, Length)
End Function
Public Function CreatePath(ByVal Path As String) As Boolean
On Error GoTo Fail
Dim i As Integer
Dim s As String
AddSlash Path
Do
i = InStr(i + 1, Path, "\")
If i = 0 Then Exit Do
s = Left$(Path, i - 1)
If Not DirectoryExists(s) Then MkDir s
Loop Until i = Len(Path)
If DirectoryExists(Path) Then
CreatePath = True
Exit Function
End If
Fail:
Call MsgBox(IIf(Err.Number = 0, "", "Error " + CStr(Err.Number) + ": " + Err.Description + vbCrLf) + "Could Not Create/Access Directory:" + vbCrLf + vbCrLf + Chr$(34) + Path + Chr$(34), vbExclamation, App.Title + " - CreatePath Function")
End Function
模块下载地址:https://arvinhk.com/softdown/6BF8A2F5955506FF5A9EACA05757E640.zip
正文完