实现VB中打开图像文件时的预览功能2010-01-02wjxcn前一阵有人在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