api函数GetOpenFileName可以弹出一个打开对话框,通过打开对话框可以选择一个或者多个文件打开。
但是实际上并未真正打开文件,而是获取要打开文件的完整路径、文件名等信息。
它的C++语法如下:
BOOL WINAPI GetOpenFileName( _Inout_ LPOPENFILENAME lpofn );
VB语法如下:
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
"GetOpenFileNameA" (lpofn As OPENFILENAME) As Long
其中lpofn参数是一个OPENFILENAME结构,这个结构包含了选择文件后的各种信息。
它的成员如下:
typedef struct tagOFN {
DWORD lStructSize;
HWND hwndOwner;
HINSTANCE hInstance;
LPCTSTR lpstrFilter;
LPTSTR lpstrCustomFilter;
DWORD nMaxCustFilter;
DWORD nFilterIndex;
LPTSTR lpstrFile;
DWORD nMaxFile;
LPTSTR lpstrFileTitle;
DWORD nMaxFileTitle;
LPCTSTR lpstrInitialDir;
LPCTSTR lpstrTitle;
DWORD Flags;
WORD nFileOffset;
WORD nFileExtension;
LPCTSTR lpstrDefExt;
LPARAM lCustData;
LPOFNHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
#if (_WIN32_WINNT >= 0x0500)
void *pvReserved;
DWORD dwReserved;
DWORD FlagsEx;
#endif
} OPENFILENAME, *LPOPENFILENAME;
如果在弹出的对话框中选择了文件,并且单击了确定按钮,则GetOpenFileName函数返回非0,其中OPENFILENAME结构的lpstrFile元素将存储选择文件的完整路径和文件名。
如果用户没有选择文件或者取消或者关闭了对话框,则GetOpenFileName函数返回0。
以下是一个通用的返回选择文件完整路径和文件名的函数:
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
"GetOpenFileNameA" (lpofn As OPENFILENAME) As Long
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
Function GOFN() As String
Dim sOFN As OPENFILENAME
With sOFN
.lStructSize = Len(sOFN)
'设置打开文件对话框中的文件筛选字符串对
.lpstrFilter = "Excel文件(*.xl*)" & Chr(0) & "*.xl*" & Chr(0) & "Word文件(*.do*)" _
& Chr(0) & "*.do*" & Chr(0) & "PPT文件(*.pp*)" & Chr(0) & "*.pp*" & Chr(0) & "所有文件(*.*)" & Chr(0) & "*.*" _
& Chr(0) & Chr(0)
'设置文件完整路径和文件名的缓冲区
.lpstrFile = Space(1024)
'设置文件完整路径和文件名的最大字符数,一定要比lpstrFile参数指定的字符数多1,用于存储结尾Null字符。
.nMaxFile = 1025
End With
i = GetOpenFileName(sOFN)
If i <> 0 Then
With sOFN
sFileName = Trim(.lpstrFile)
GOFN = Left(sFileName, Len(sFileName) - 1)
End With
Else
GOFN = ""
End If
Debug.Print GOFN, Len(GOFN)
End Function


发表评论