|
|
![]() |
|
||
|
|
|||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Visual Basic Animation Routines AVIGetFileInfo: Obtain AVI File Information |
|
| Posted: | Tuesday February 22, 2000 |
| Updated: | Monday December 26, 2011 |
| Applies to: | VB4-32, VB5, VB6 |
| Developed with: | VB6, Windows NT4 |
| OS restrictions: | None |
| Author: | Mattias Sjögren, msnews |
|
Related: |
AVIGetFileInfo: Obtain AVI File Information Windows AVI File Collection |
| Prerequisites | |
| AVI files (downloadable from the Animation(AVI) File Collection | |
|
|
|
This
routine shows a couple of things. First and foremost, it details how to retrieve AVI file information from the AVI file using the AVIFileOpen
the AVIGetFileInfo APIs. It also shows how to populate a ListView with this information, how to determine the Time Scale for the AVI, and how
to use this information to resize a picturebox to accommodate the AVI.
Tiling a bitmap, metafile (and with VB5, a gif or jpeg) is easy using the PaintPicture method. The code below shows two routines you can place into a form's Paint event to either tile an image across the entire form, or to create a image running along the edge. Both methods need only one hidden image control each (preloaded in this example with the images to tile). A PictureBox could also be used for the image(s) to tile, but the added resources used by a PictureBox aren't warranted in this example. The AVI AVIGetFileInfo code was provided to the msnews group by Mattias Sjögren. The illustration below shows the format design time with the MS Common Controls 2 AVI control inside a picture box. The AVI and pixbox backcolors were changed to show the effects of using the resize code (IOW, if the resize is correct, you should never see the picture box backcolor during runtime. You can comment out the "With Picture1" code in the ListView1_ItemClick event to see the effect of the resizing.
|
|
| BAS Module Code | |
| None. | |
|
|
|
| Form Code | |
|
|
|
| Add to a form a ListView in report view with 7 columns as shown above, as well as a text box (Text1), two command buttons (Command1, Command2), and a Common Controls 2 AVI control (Animation1) inside a picture box (Picture1). Set the picturebox and animation BackColor to something other than the default BackColor, and add the following code to the form: | |
|
|
|
Option Explicit
Private Const ERROR_SUCCESS As Long = 0
Private Const OF_SHARE_DENY_WRITE As Long = &H20
Private Const MAXDWORD As Long = &HFFFFFFFF
Private Const MAX_PATH As Long = 260
Private Const INVALID_HANDLE_VALUE As Long = -1
'Flags for AVIFILEINFO dwFlags
Private Const AVIFILEINFO_HASINDEX As Long = &H10
Private Const AVIFILEINFO_MUSTUSEINDEX As Long = &H20
Private Const AVIFILEINFO_ISINTERLEAVED As Long = &H100
Private Const AVIFILEINFO_WASCAPTUREFILE As Long = &H10000
Private Const AVIFILEINFO_COPYRIGHTED As Long = &H20000
'Flags for AVIFILEINFO dwCaps
Private Const AVIFILECAPS_CANREAD As Long = &H1
Private Const AVIFILECAPS_CANWRITE As Long = &H2
Private Const AVIFILECAPS_ALLKEYFRAMES As Long = &H10
Private Const AVIFILECAPS_NOCOMPRESSION As Long = &H20
'for BROWSEINFO
Private Const BIF_RETURNONLYFSDIRS As Long = &H1
Private Type AVIFILEINFO
dwMaxBytesPerSec As Long
dwFlags As Long
dwCaps As Long
dwStreams As Long
dwSuggestedBufferSize As Long
dwWidth As Long
dwHeight As Long
dwScale As Long
dwRate As Long
dwLength As Long
dwEditCount As Long
szFileType As String * 64
End Type
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Private Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * MAX_PATH
cAlternate As String * 14
End Type
Private Type BROWSEINFO
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type
'my type for passing file
'info to the search routines
Private Type FILE_PARAMS
bRecurse As Boolean
bList As Boolean
fAttributes As Long
sFileRoot As String
sFileNameExt As String
nFileCount As Long
nFileSize As Double
End Type
Private Declare Function AVIFileOpen Lib "avifil32" _
Alias "AVIFileOpenA" _
(ppfile As Long, _
ByVal szFile As String, _
ByVal mode As Long, _
pclsidHandler As Any) As Long
Private Declare Function AVIFileRelease Lib "avifil32" _
(ByVal pfile As Long) As Long
Private Declare Function AVIGetFileInfo Lib "avifil32" _
Alias "AVIFileInfoA" _
(ByVal pfile As Long, _
pfi As AVIFILEINFO, _
ByVal lSize As Long) As Long
Private Declare Sub AVIFileInit Lib "avifil32" ()
Private Declare Sub AVIFileExit Lib "avifil32" ()
Private Declare Function FindClose Lib "kernel32" _
(ByVal hFindFile As Long) As Long
Private Declare Function FindFirstFile Lib "kernel32" _
Alias "FindFirstFileA" _
(ByVal lpFileName As String, _
lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib "kernel32" _
Alias "FindNextFileA" _
(ByVal hFindFile As Long, _
lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function SHBrowseForFolder Lib "shell32" _
Alias "SHBrowseForFolderA" _
(lpBrowseInfo As BROWSEINFO) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" _
Alias "SHGetPathFromIDListA" _
(ByVal pidl As Long, _
ByVal pszPath As String) As Long
Private Declare Sub CoTaskMemFree Lib "ole32" _
(ByVal pv As Long)
Private Function Browse() As String
'show the Browse for Folders Dialog
Dim pidl As Long
Dim BI As BROWSEINFO
Dim sPath As String
Dim pos As Integer
'Fill BROWSEINFO structure data
With BI
.hOwner = Me.hWnd
.pidlRoot = 0&
.lpszTitle = "Select a folder containing AVI files."
.ulFlags = BIF_RETURNONLYFSDIRS
End With
'show dialog returning pidl to selected item
pidl = SHBrowseForFolder(BI)
'if pidl is valid, parse & return the user's selection
sPath = Space$(MAX_PATH)
If SHGetPathFromIDList(ByVal pidl, ByVal sPath) Then
'SHGetPathFromIDList returns the absolute
'path to the selected item. No path is
'returned for virtual folders.
pos = InStr(sPath, Chr$(0))
If pos Then Browse = Left(sPath, pos - 1)
'free the pidl
Call CoTaskMemFree(pidl)
End If
End Function
Private Function GetAVIFileInfo(sAVIFile As String) As AVIFILEINFO
'if a valid file, return the
'AVIFILEINFO structure
Dim hAvi As Long
Dim AFI As AVIFILEINFO
AVIFileInit
If AVIFileOpen(hAvi, _
sAVIFile, _
OF_SHARE_DENY_WRITE, _
ByVal 0&) = ERROR_SUCCESS Then
If AVIGetFileInfo(hAvi, AFI, Len(AFI)) = ERROR_SUCCESS Then
GetAVIFileInfo = AFI
Call AVIFileRelease(hAvi)
Else 'error occurred
End If
Else 'error occurred
End If
AVIFileExit
End Function
Private Function GetFileSizeStr(fsize As Long) As String
'return the file size passed as a formatted string
GetFileSizeStr = Format$((fsize), "###,###,###") '& " kb"
End Function
Private Sub Command1_Click()
Dim sPath As String
'get the user's selection
sPath = Browse()
'add the fully qualified path to
'the chosen folder to Text1
If Len(sPath) > 0 Then
Text1.Text = QualifyPath(sPath)
End If
'check if the selected folder
'contains AVI files. If it does,
'enable the Get Info button.
Command2.Enabled = FileExists(Text1.Text & "*.avi")
End Sub
Public Function FileExists(sSource As String) As Boolean
Dim WFD As WIN32_FIND_DATA
Dim hFile As Long
hFile = FindFirstFile(sSource, WFD)
FileExists = hFile <> INVALID_HANDLE_VALUE
Call FindClose(hFile)
End Function
Private Sub Command2_Click()
Dim FP As FILE_PARAMS
'populate the file params UDT and
'call the file search routine
If Len(Text1.Text) > 0 Then
With FP
.sFileRoot = Text1.Text 'path to files
.sFileNameExt = "*.avi" 'the AVI extension
End With
Call GoodGetFilesInfo(FP)
End If
End Sub
Public Function TrimNull(startstr As String) As String
'strip any trailing null from the string passed
Dim pos As Integer
pos = InStr(startstr, Chr$(0))
If pos Then
TrimNull = Left$(startstr, pos - 1)
Exit Function
End If
'if this far there was no null,
'so return the original string
TrimNull = startstr
End Function
Private Function GoodGetFilesInfo(FP As FILE_PARAMS) As Long
'local working variables
Dim WFD As WIN32_FIND_DATA
Dim AVI As AVIFILEINFO
Dim itmX As ListItem
Dim hFile As Long
Dim sPath As String
Dim sRoot As String
Dim sTmp As String
'set up working vars, used below
sRoot = QualifyPath(FP.sFileRoot)
sPath = sRoot & FP.sFileNameExt
'get handle to first file matching the filespec
hFile = FindFirstFile(sPath, WFD)
If hFile <> INVALID_HANDLE_VALUE Then
Do
'the file name
sTmp = TrimNull(WFD.cFileName)
'get the file info
AVI = GetAVIFileInfo(sRoot & sTmp)
'add to the listview
Set itmX = ListView1.ListItems.Add(, , sTmp)
itmX.SubItems(1) = GetFileSizeStr((WFD.nFileSizeHigh * (MAXDWORD + 1)) + WFD.nFileSizeLow)
itmX.SubItems(2) = AVI.dwHeight
itmX.SubItems(3) = AVI.dwWidth
itmX.SubItems(4) = AVI.dwRate \ AVI.dwScale
itmX.SubItems(5) = IIf(AVI.dwFlags And AVIFILEINFO_ISINTERLEAVED, "Yes", "No")
itmX.SubItems(6) = IIf(AVI.dwFlags And AVIFILEINFO_COPYRIGHTED, "Yes", "No")
Loop While FindNextFile(hFile, WFD)
hFile = FindClose(hFile)
End If
End Function
Private Function QualifyPath(sPath As String) As String
'return a fully-qualified path
If Right$(sPath, 1) <> "\" Then
QualifyPath = sPath & "\"
Else
QualifyPath = sPath
End If
End Function
Private Sub Form_DblClick()
'for debugging - shows the area obscured
'by the picture box border. This toggles
'between a borderstyle of 0 and 1.
Picture1.BorderStyle = Abs(Picture1.BorderStyle = 0)
End Sub
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
'toggle the sort order based on the column clicked
ListView1.SortKey = ColumnHeader.Index - 1
ListView1.SortOrder = Abs(ListView1.SortOrder = 0)
ListView1.Sorted = True
End Sub
Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
If Len(Item.Text) <> 0 Then
'adjust the animation control
'and size the pixbox to accommodate
'the animation size. In the expression
'below, 4 is added to each dimension
'of the pixbox to accommodate the space
'taken by the pixbox border.
With Animation1
.Close
.Left = 0
.Top = 0
.AutoPlay = True
.Open Text1.Text & Item.Text
With Picture1
.Width = CLng((Item.SubItems(3) + 4) * Screen.TwipsPerPixelX)
.Height = CLng((Item.SubItems(2) + 4) * Screen.TwipsPerPixelY)
End With
End With
End If
End Sub
|
|
| Comments | |
|
|
|
|
|
|
|||||
|
|||||
|
|
|||||
|
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |
![]() |