如何实现VB中打开图像文件时的预览功能

本文介绍了在VB中实现打开图像文件预览功能的方法。参照DELPHI源代码,在中文WINDOWS98 SE下测试通过。详细说明了调用API函数GetOpenFileName、设置对话框参数、制作对话框资源、编写Hook以及调用相关函数等步骤,代码未经严格测试,存在一定BUG。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关键字:VB 预览

       前一阵有人在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地址是wjxcn@263.net。

以前用Excel2003做了些宏,在网上还有不少粉丝,因一些功能在Excel2010无法使用,故重新整理,欢迎指正; 本Excel的宏在Excel2010测试表现出色; 运行宏前,要保证EXCEL没有禁用宏。 Michael Ho QQ: 9900060 ----------------------- 本Excel有以下功能: 插入图片1 1.点击执行后,会出现文件夹选择窗,请选择你JPG图片所在文件夹(选择“文件夹”而不是选择文件); 2.宏会自动复制Sheet2到新工作簿,并插入你所选文件的全部JPG图片到B列,对应的图片名自动填到C列; 3.图片的大小会自动适应Sheet2的B3单元格,因此可以在点击执行前调整Sheet2的B3单元格的大小来控制插入图片的大小。 -------- 插入图片2 1.点击执行后,会出现文件夹选择窗,请选择你JPG图片所在文件夹(选择“文件夹”而不是选择文件); 2.宏会自动复制Sheet3到新工作簿,并插入你所选文件的全部JPG图片制作图册,对应的图片名自动填到图片下方; -------- 插入图片3 如果用户自己的Excel文件有一列是型号,该宏可以插入指定文件夹里以型号命名的JPG图片到另一列; 1.打开本Excel文件,不要关闭; 2.再另外打开你自己需要操作的另一个Excel文件,并保持你要操作的工作表做为当前活动工作表; 3.在你的文件按Ctrl+I (或在你的文件手动执行宏,然后选择本EXCEL文件的宏InsertPic3); 4.然后会出现文件夹选择窗,请选择你JPG图片所在文件夹(选择“文件夹”而不是选择文件); 5.在弹出的对话框指定型号在第几列,图片要插入到第几列,以及从哪一行开始; 6.图片的大小会自动适应你设定的第一行要插入图片的单元格,因此提前调整那个单元格的大小可以控制插入图片的大小。 ------------- 删除活动工作表所有图片 Ctrl+d 删除活动工作表里所有的JPG图片,(不一定是本工作簿的工作表); 1.打开本Excel文件,不要关闭; 2.再另外打开你自己需要操作的另一个Excel文件,并保持你要操作的工作表做为当前活动工作表; 3.在你的文件按Ctrl+d (或在你的文件手动执行宏,然后选择本EXCEL文件的宏DelPic); ------------- 导出活动工作表被选的一张JPG图片 Ctrl+e 导出活动工作表被选的一张JPG图片,(不一定是本工作簿的工作表); 1.打开本Excel文件,不要关闭; 2.再另外打开你自己需要操作的另一个Excel文件,并保持你要操作的工作表做为当前活动工作表; 3.请选一张要导出的图片; 4.在你的文件按Ctrl+e (或在你的文件手动执行宏,然后选择本EXCEL文件的宏OutputOnePic); 5.在弹出的对话框指定图片要保存的名字; 1.不管图片在Excel是否被缩放过,导出的图片是按图片的原始尺寸进行保存。 2.在桌面上会自动新建一个"OutputPic"的文件夹,导出的图片将会存在那个文夹里; 3.如果文件已有相同名字的文件,则后面导出的文件会自动加上(v1), (v2), (v3)... ------------- 导出活动工作表所有JPG图片 Ctrl+f 导出活动工作表所有JPG图片,并且图片名自动使用指定列的图片名; 1.打开本Excel文件,不要关闭; 2.再另外打开你自己需要操作的另一个Excel文件,并保持你要操作的工作表做为当前活动工作表; 3.在你的文件按Ctrl+f (或在你的文件手动执行宏,然后选择本EXCEL文件的宏OutputAllPic); 4.在弹出的对话框指定图片所在列,图片名所在的列; 1.不管图片在Excel是否被缩放过,导出的图片是按图片的原始尺寸进行保存; 2.在桌面上会自动新建一个"OutputPic"的文件夹,所有导出的图片将会存在那个文夹里; 3.如果文件已有相同名字的文件,则后面导出的文件会自动加上(v1), (v2), (v3)... ---------------- 对指定文件的JPG图片进行重命名 Ctrl+r 利用活动工作表的所有图片的旧名与新名的对照,对指定文件JPG图片进行重命名; 1.打开本Excel文件,不要关闭; 2.再另外打开你自己需要操作的另一个Excel文件,并保持你要操作的工作表做为当前活动工作表; 3.在你的文件按Ctrl+r (或在你的文件手动执行宏,然后选择本EXCEL文件的宏RenamePic); 4.在弹出的对话框指定图片旧名所在列和图片新名所在的列; 1.可以结合插入图片的宏,将所有图片的旧名输入到Excel,再在另一列填上新图片名,然后使用该宏。 2.如果顺利运行,会在原来那个文件夹下面新建一个叫“New”的子文件夹,所有重命好名的图片会自动放入子文件夹里; 3.如果文件已有相同名字的文件,则后面的文件会覆盖原来的文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值