程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB6 >> 實現VB中打開圖像文件時的預覽功能

實現VB中打開圖像文件時的預覽功能

編輯:VB6

前一陣有人在VB專家門診中提出一個問題,如何在VB中實現打開圖像文件的預覽,雖然給出了300分 的高分,回答著卻寥寥無幾。我在參照了DELPHI的源代碼後在VB中實現了其部分圖像預覽功能,在中文 WINDOWS98 SE下測試通過。

從MSDN中可以知道調用文件打開通用對話框需調用API 函數GetOpenFileName,原形如下:

BOOL GetOpenFileName( LPOPENFILENAME lpofn );// lpofn 為初始化數據結構的地址

其參數lpofn指向類型為OPENFILENAME變量的地址,Windows已經為我們實現自定義的 文件打開對話框留了接口。為了實現這個自定義的對話框,重點設置OPENFILENAME中的如 下幾個參數:

Flags OFN_ENABLEHOOK  使由lpfnHook成員指定的鉤子函數有效   OFN_ENABLETEMPLATE 表示由lpTemplateName指定一個對話框模板資源,這個資源存在 於由hInstance指定的模塊中   OFN_EXPLORER 如果指定了上述兩個標志則必須指定這標志 lpfnHook 指向鉤子函數的地址 lpTemplateName 對話框模板資源的字符串名,而不是ID

就是說你要在你的程序中包含一個對話框模板,Windows將以這個模板為基礎顯示通用對話框。從很 多資料上都可以知道如果要在自定義的對話框中顯示通用對話框,在您的對話框資源中必須包含一個 Static,它的ID是stc32,十進制值為1119,這個Static也就是顯示原來通用對話框的地方。當然他對對 話框也有一些要求,這裡就不廢話了,自己看MSDN吧。

我們在一個可以制作對話框資源的環境(我用的是VC)中制作出這個對話框,並將它存為res文件。 從這裡開始我們進入VB IDE中,把這個資源文件加入到你的VB應用程序中,假設它的名字是 “DLGOPENTEMP”。

接下來我們在VB工程中加入一個FORM,假設它的名字是FrmPreview,將它的BorderStyle 設定為None 。並將一個PictureBox或者Image加入到窗體中,名字就叫做Picture1吧,我們就將在它裡邊顯示預覽的 內容。下邊呢也就是最關鍵的一步,編寫Hook。

在工程中加入一個Module,名字無所謂啦。假設我們的鉤子叫wndProc,定義如下:

Public Function wndProc(ByVal hDlg As Long, ByVal uiMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
   On Error GoTo lblExit
   Select Case uiMsg
     Case WM_NOTIFY
       CopyMemory NMHeader, ByVal lParam, Len(NMHeader)
       Select Case NMHeader.code
         Case CDN_INITDONE
           GetWindowRect GetDlgItem(hDlg, 1119), staticRect
           MapWindowPoints 0, hDlg, staticRect, 2
           SetParent FrmPreview.hwnd, hDlg
           FrmPreview.Visible = True
           FrmPreview.Move (staticRect.Right - staticRect.Left + 10) * Screen.TwipsPerPixelX, 5 * Screen.TwipsPerPixelX
           FrmPreview.Refresh
           wndProc = 0
         Case CDN_SELCHANGE
           FrmPreview.LoadPic GetFilesName(hDlg)
           wndProc = 0
       End Select
     Case WM_DESTROY
       FrmPreview.Visible = False
       SetParent FrmPreview.hwnd, 0
       Unload FrmPreview
     Case Else
   End Select
   Exit Function
lblExit:
End Function

在FrmPreview 中增加一個方法LoadPic,此方法將用戶選中的可識別的圖像文件顯示在FrmPreview中 的Picture1中,如何顯示看您自己了。在得到CDN_SELCHANGE時,調用GetFilesName得到此時用戶選中的 文件,代碼如下:

Private Function GetFilesName(hWindow As Long) As String
   Dim hParent As Long
   Dim lRetValue As Long
   Dim theFileName(1024) As Byte
   For i = 0 To UBound(theFileName)
     theFileName(i) = 0
   Next
   hParent = GetParent(hWindow)
   lRetValue = SendMessage(hParent, CDM_GETFILEPATH, 1024, theFileName(0))
   GetFilesName = StrConv(theFileName, vbUnicode)
End Function

調用GetOpenFileName API的方法如下:

Public Function ShowOpenFileDlg(hParent As Long) As Long
   On Error GoTo lblExit
   Static strFilter As String
   strFilter = "All Pictures" & Chr(0) & "*.bmp;*.dib;*.jpg;*.gif;*.wmf;*.emf;*.ico;*.cur" & Chr(0) & _
   "Bitmap (*.bmp;*.dib)" & Chr(0) & "*.bmp;*.dib" & Chr (0) & _
   "JPEG (*.jpg)" & Chr(0) & "*.jpg" & Chr(0) & _
   "GIF (*.gif)" & Chr(0) & "*.gif" & Chr(0) & _
   "Metafile (*.wmf;*.emf)" & Chr(0) & "*.wmf;*.emf" & Chr(0) & _
   "Icons (*.ico;*.cur)" & Chr(0) & "*.ico;*.cur" & Chr (0) & _
   "All files (*.*)" & Chr(0) & "*.*" & Chr(0) & Chr (0)
   FrmPreview.Hide
   pointer = GetProcAddr(AddressOf wndProc)
   Dim MyID As Long
   With openfile
     .lStructSize = Len(openfile)
     .hwndOwner = hParent
     .hInstance = App.hInstance
     .lpstrFilter = strFilter
     .lpstrCustomFilter = ""
     .nMaxCustFilter = 0
     .nFilterIndex = 0
     .lpstrFile = filesname
     .nMaxFile = 1023
     .lpstrFileTitle = ""
     .nMaxFileTitle = 0
     .lpstrInitialDir = ""
     .lpstrTitle = ""
     .flags = OFN_ENABLEHOOK + OFN_HIDEREADONLY + OFN_ENABLETEMPLATE + OFN_EXPLORER
     .nFileOffset = 0
     .nFileExtension = 0
     .lpstrDefExt = ""
     .lCustData = 0
     .lpfnHook = pointer
     .lpTemplateName = "DLGOPENTEMP"
   End With
   ShowOpenFileDlg = GetOpenFileName(openfile)
lblExit:
End Function

文件就放在filesname裡,它必須預先分配好空間。Soryy,又說廢話了。

這些代碼沒有經過嚴格的測試,只是實現了簡單的功能,肯定存在很多BUG,如果哪位兄弟姐妹發現 了或者給DEBUG了,別忘了給我妹一份。我的Email地址是[email protected]

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved