GetOpenFileName或GetSaveFileName的扩展名的一个蛋疼问题
如题,这两个家伙返回的路径不给俺扩展名,而是用户输入什么,返回的就是什么。如,扩展名筛选器中,有jpg、又有bmp的话,我怎么知道它的扩展名是jpg还是bmp呢? --------------------编程问答-------------------- 继续在线 --------------------编程问答-------------------- 同求问,保存为TXT格式后。在硬盘上不显示出TXT的样子。。用TXT打开的话~可以看到输入的内容。怎么样才能另存为之后直接就显示成TXT的样子呢? --------------------编程问答-------------------- GetOpenFileName的例子
'------------------------------------------------------------------------------
'
' Form Code
'
'------------------------------------------------------------------------------
Option Explicit
Private Sub Form_Load()
Command1.Caption = "Get File Open"
Command2.Caption = "Get File Save"
End Sub
Private Function StripDelimitedItem(startStrg As String, _
delimiter As String) As String
'take a string separated by nulls,
'split off 1 item, and shorten the string
'so the next item is ready for removal.
Dim pos As Long
pos = InStr(1, startStrg, delimiter)
If pos Then
StripDelimitedItem = Mid$(startStrg, 1, pos)
startStrg = Mid$(startStrg, pos + 1, Len(startStrg))
End If
End Function
Private Function TrimNull(item As String) As String
Dim pos As Integer
pos = InStr(item, Chr$(0))
If pos Then
TrimNull = Left$(item, pos - 1)
Else: TrimNull = item
End If
End Function
Private Sub Command1_Click()
Dim sFilters As String
Dim pos As Long
Dim buff As String
Dim sLongname As String
Dim sShortname As String
'filters for the dialog
sFilters = "Visual Basic Forms" & vbNullChar & "*.frm" & vbNullChar & _
"Visual Basic Modules" & vbNullChar & "*.bas" & vbNullChar & _
"Visual Basic Projects" & vbNullChar & "*.vbp" & vbNullChar & _
"Text Files" & vbNullChar & "*.txt" & vbNullChar & _
"All Files" & vbNullChar & "*.*" & vbNullChar & vbNullChar
'populate the structure
With OFN
.nStructSize = Len(OFN)
.hWndOwner = Form1.hwnd
.sFilter = sFilters
.nFilterIndex = 2
.sFile = "Untitled.bas" & Space$(1024) & vbNullChar & vbNullChar
.nMaxFile = Len(.sFile)
.sDefFileExt = "bas" & vbNullChar & vbNullChar
.sFileTitle = vbNullChar & Space$(512) & vbNullChar & vbNullChar
.nMaxTitle = Len(OFN.sFileTitle)
.sInitialDir = "d:\vb5" & vbNullChar & vbNullChar
.sDialogTitle = "VBnet GetOpenFileName Demo"
.flags = OFS_FILE_OPEN_FLAGS Or _
OFN_ALLOWMULTISELECT Or _
OFN_EXPLORER Or _
OFN_ENABLEHOOK
.fnHook = FARPROC(AddressOf OFNHookProc)
End With
'call the API
If GetOpenFileName(OFN) Then
buff = Trim$(Left$(OFN.sFile, Len(OFN.sFile) - 2))
Do While Len(buff) > 3
List1.AddItem StripDelimitedItem(buff, vbNullChar)
Loop
Text1.Text = OFN.sFile
Text2.Text = Left$(OFN.sFile, OFN.nFileOffset)
Text3.Text = Mid$(OFN.sFile, OFN.nFileOffset + 1, Len(OFN.sFile) - OFN.nFileOffset - 1)
Text4.Text = Mid$(OFN.sFile, OFN.nFileExtension + 1, Len(OFN.sFile) - OFN.nFileExtension)
Text5.Text = OFN.sFileTitle
sLongname = OFN.sFileTitle
sShortname = Space$(128)
pos = GetShortPathName(sLongname, sShortname, Len(sShortname))
Text6.Text = LCase$(Left$(sShortname, pos))
sLongname = OFN.sFile
sShortname = Space$(128)
pos = GetShortPathName(sLongname, sShortname, Len(sShortname))
Text7.Text = LCase$(Left$(sShortname, pos))
Check1.Value = Abs((OFN.flags And OFN_READONLY))
End If
End Sub
Private Sub Command2_Click()
Dim sFilters As String
Dim pos As Long
Dim buff As String
Dim sLongname As String
Dim sShortname As String
'filters for the dialog
sFilters = "Visual Basic Forms" & vbNullChar & "*.frm" & vbNullChar & _
"Visual Basic Modules" & vbNullChar & "*.bas" & vbNullChar & _
"Visual Basic Projects" & vbNullChar & "*.vbp" & vbNullChar & _
"Text Files" & vbNullChar & "*.txt" & vbNullChar & _
"All Files" & vbNullChar & "*.*" & vbNullChar & vbNullChar
With OFN
.nStructSize = Len(OFN)
.hWndOwner = Form1.hwnd
.sFilter = sFilters
.nFilterIndex = 2
.sFile = "Untitled.bas" & Space$(1024) & vbNullChar & vbNullChar
.nMaxFile = Len(.sFile)
.sDefFileExt = "bas" & vbNullChar & vbNullChar
.sFileTitle = vbNullChar & Space$(512) & vbNullChar & vbNullChar
.nMaxTitle = Len(OFN.sFileTitle)
.sInitialDir = "d:\vb5" & vbNullChar & vbNullChar
.sDialogTitle = "VBnet GetSaveFileName Demo"
.flags = OFS_FILE_SAVE_FLAGS Or _
OFN_ENABLEHOOK
.fnHook = FARPROC(AddressOf OFNHookProc)
End With
'call the API
If GetSaveFileName(OFN) Then
buff = Trim$(Left$(OFN.sFile, Len(OFN.sFile) - 2))
Do While Len(buff) > 3
List1.AddItem StripDelimitedItem(buff, vbNullChar)
Loop
Text1.Text = OFN.sFile
Text2.Text = Left$(OFN.sFile, OFN.nFileOffset)
Text3.Text = Mid$(OFN.sFile, OFN.nFileOffset + 1, Len(OFN.sFile) - OFN.nFileOffset - 1)
Text4.Text = Mid$(OFN.sFile, OFN.nFileExtension + 1, Len(OFN.sFile) - OFN.nFileExtension)
Text5.Text = OFN.sFileTitle
sLongname = OFN.sFileTitle
sShortname = Space$(128)
pos = GetShortPathName(sLongname, sShortname, Len(sShortname))
Text6.Text = LCase$(Left$(sShortname, pos))
sLongname = OFN.sFile
sShortname = Space$(128)
pos = GetShortPathName(sLongname, sShortname, Len(sShortname))
Text7.Text = LCase$(Left$(sShortname, pos))
Check1.Value = Abs((OFN.flags And OFN_READONLY))
End If
End Sub
--------------------编程问答--------------------
'Example Name: Centering the Open & Save Common Dialogs Using Callbacks
'------------------------------------------------------------------------------
'
' BAS Moduel Code
'
'------------------------------------------------------------------------------
Option Explicit
Public Const OFN_ALLOWMULTISELECT As Long = &H200
Public Const OFN_CREATEPROMPT As Long = &H2000
Public Const OFN_ENABLEHOOK As Long = &H20
Public Const OFN_ENABLETEMPLATE As Long = &H40
Public Const OFN_ENABLETEMPLATEHANDLE As Long = &H80
Public Const OFN_EXPLORER As Long = &H80000
Public Const OFN_EXTENSIONDIFFERENT As Long = &H400
Public Const OFN_FILEMUSTEXIST As Long = &H1000
Public Const OFN_HIDEREADONLY As Long = &H4
Public Const OFN_LONGNAMES As Long = &H200000
Public Const OFN_NOCHANGEDIR As Long = &H8
Public Const OFN_NODEREFERENCELINKS As Long = &H100000
Public Const OFN_NOLONGNAMES As Long = &H40000
Public Const OFN_NONETWORKBUTTON As Long = &H20000
Public Const OFN_NOREADONLYRETURN As Long = &H8000& '*see comments
Public Const OFN_NOTESTFILECREATE As Long = &H10000
Public Const OFN_NOVALIDATE As Long = &H100
Public Const OFN_OVERWRITEPROMPT As Long = &H2
Public Const OFN_PATHMUSTEXIST As Long = &H800
Public Const OFN_READONLY As Long = &H1
Public Const OFN_SHAREAWARE As Long = &H4000
Public Const OFN_SHAREFALLTHROUGH As Long = 2
Public Const OFN_SHAREWARN As Long = 0
Public Const OFN_SHARENOWARN As Long = 1
Public Const OFN_SHOWHELP As Long = &H10
Public Const OFS_MAXPATHNAME As Long = 260
'OFS_FILE_OPEN_FLAGS and OFS_FILE_SAVE_FLAGS below
'are mine to save long statements; they're not
'a standard Win32 type.
Public Const OFS_FILE_OPEN_FLAGS = OFN_EXPLORER _
Or OFN_LONGNAMES _
Or OFN_CREATEPROMPT _
Or OFN_NODEREFERENCELINKS
Public Const OFS_FILE_SAVE_FLAGS = OFN_EXPLORER _
Or OFN_LONGNAMES _
Or OFN_OVERWRITEPROMPT _
Or OFN_HIDEREADONLY
Public Type OPENFILENAME
nStructSize As Long
hWndOwner As Long
hInstance As Long
sFilter As String
sCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
sFile As String
nMaxFile As Long
sFileTitle As String
nMaxTitle As Long
sInitialDir As String
sDialogTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
sDefFileExt As String
nCustData As Long
fnHook As Long
sTemplateName As String
End Type
Public OFN As OPENFILENAME
Public Declare Function GetOpenFileName Lib "comdlg32" _
Alias "GetOpenFileNameA" _
(pOpenfilename As OPENFILENAME) As Long
Public Declare Function GetSaveFileName Lib "comdlg32" _
Alias "GetSaveFileNameA" _
(pOpenfilename As OPENFILENAME) As Long
Public Declare Function GetShortPathName Lib "kernel32" _
Alias "GetShortPathNameA" _
(ByVal lpszLongPath As String, _
ByVal lpszShortPath As String, _
ByVal cchBuffer As Long) As Long
'new additions to original code
'supporting the Hook method
Public Const WM_INITDIALOG = &H110
Private Const SW_SHOWNORMAL = 1
Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Public Declare Function GetParent Lib "user32" _
(ByVal hwnd As Long) As Long
Public Declare Function SetWindowText Lib "user32" _
Alias "SetWindowTextA" _
(ByVal hwnd As Long, _
ByVal lpString As String) As Long
Public Declare Function MoveWindow Lib "user32" _
(ByVal hwnd As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal bRepaint As Long) As Long
Public Declare Function GetWindowRect Lib "user32" _
(ByVal hwnd As Long, _
lpRect As RECT) As Long
Public Function FARPROC(ByVal pfn As Long) As Long
'Dummy procedure that receives and returns
'the return value of the AddressOf operator.
'Obtain and set the address of the callback
'This workaround is needed as you can't assign
'AddressOf directly to a member of a user-
'defined type, but you can assign it to another
'long and use that (as returned here)
FARPROC = pfn
End Function
Public Function OFNHookProc(ByVal hwnd As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
'On initialization, set aspects of the
'dialog that are not obtainable through
'manipulating the OPENFILENAME structure members.
Dim hwndParent As Long
Dim rc As RECT
'temporary vars for demo
Dim newLeft As Long
Dim newTop As Long
Dim dlgWidth As Long
Dim dlgHeight As Long
Dim scrWidth As Long
Dim scrHeight As Long
Select Case uMsg
Case WM_INITDIALOG
'obtain the handle to the parent dialog
hwndParent = GetParent(hwnd)
If hwndParent <> 0 Then
'Just to prove the handle was obtained,
'change the dialog's caption.
Call SetWindowText(hwndParent, "I'm Hooked on Hooked Dialogs!")
'Position the dialog in the centre of
'the screen. First get the current dialog size.
Call GetWindowRect(hwndParent, rc)
'(To show the calculations involved, I've
'used variables instead of creating a
'one-line MoveWindow call.)
dlgWidth = rc.Right - rc.Left
dlgHeight = rc.Bottom - rc.Top
scrWidth = Screen.Width \ Screen.TwipsPerPixelX
scrHeight = Screen.Height \ Screen.TwipsPerPixelY
newLeft = (scrWidth - dlgWidth) \ 2
newTop = (scrHeight - dlgHeight) \ 2
'..and set the new dialog position.
Call MoveWindow(hwndParent, newLeft, newTop, dlgWidth, dlgHeight, True)
OFNHookProc = 1
End If
Case Else:
End Select
End Function
'--end block--'
补充:VB , API