前一陣有人在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