Access交流网
  • 设为首页|收藏本站|繁体中文|手机版
  •     
  • Access培训-Access开发平台-Access行业开发

  • 首页
  • 资讯
  • 技巧
  • 源码
  • 行业
  • 资源
  • 活动
  • 关于

技巧

ACCESS数据库

启动/设置/选项/背景

修复/压缩

安全/加密/解密

快捷键

版本升级/其它等

数据表

命名方式/设计规范

表设计

查询

Sql语言基础

选择查询

更新查询

删除查询

追加查询

生成表查询

交叉表查询

SQL特定查询

查询参数

查询综合应用

界面/窗体/控件

标签

文本框

命令按钮

组合框/列表框

选项组/复选框/选项按钮

选项卡

子窗体

窗体本身/综合应用

其它

报表打印

报表设计

高级报表

模块/函数/VBA/API/系统

VBA基础

内置函数

调试/跟踪/Debug

模块/类模块

API/COM/系统相关

字符数字日期

网络通信游戏

加密解密安全

文件处理

经典算法

宏/菜单/工具栏/功能区

宏/脚本

菜单/工具栏

功能区/Ribbon

图表/图形/图像/多媒体

图表

图形/图像

音频

视频/动画

DAO/链接表/ADO/ADP

DAO/链接表/ODBC

ADO/RDO

ADP

ActiveX/第三方控件/插件

Treeview树控件

ListView列表控件

Toolbar工具栏控件

微软其它控件

Dbi-Tech

CodeJock

Grid++Report

FastReport

ComponentOne

加载项/插件/Addin

OFFICE集成/导入导出/交互

Excel导入导出/交互

Word导入导出/交互

PPT交互

Outlook控制/邮件

Text文本文件/INI/CSV

PDF/SWF/XML格式

CAD格式

Sharepoint/其它Office

SqlServer/其它数据库

表

视图

存储过程/触发器

函数

用户/权限/安全

调试/维护

SqlServer其它/综合

发布/打包/文档/帮助

开发版/运行时

打包/发布/部署

开发文档/帮助制作

Access完整行业系统

采购管理系统

销售管理系统

仓库管理系统

人力资源管理HRM

CRM管理系统

MRP/ERP管理系统

BRP/流程优化

其它管理系统

心得/经验/绝招
其它/杂项
Excel技巧

Excel应用与操作

Excel开发编程

Word技巧

Word应用与操作

Word开发编程

Outlook技巧

Outlook应用与操作

Outlook开发编程

热门文章

  • TWAIN和WIA扫描仪的..
  • Access VBA/VB..
  • Delphi针对扫描仪编程..
  • 用代码插入图片到OLE对象..
  • TWAIN驱动介绍-Acc..
  • 扫描程序设计说明文档(tw..

最新文章

  • Access 获取图片的像..
  • Access在同一页面中调..
  • 解决“我的电脑”中不显示扫..
  • WIA的脚本和NET(扫描..
  • 可用来连接扫描仪的国外第三..
  • 如何共享扫描仪

联系方式

Access交流网(免费Access交流)

QQ:18449932 

网  址:www.access-cn.com

当前位置:首页 > 技巧 > 图表/图形/图像/多媒体 > 图形/图像
图形/图像

用代码插入图片到OLE对象的2种方法

Access中的Ole对象总感觉是个神秘的东西,功能好象很强大,既可以显示图片,还可显示Word文档、Excel表格等,但对它的控制却不象其它对象那么容易,联机帮助中讲的不多,仅有的一点帮助看得也是一头雾水。
拿Ole字段储存图片来说,通过菜单操作在Ole字段中插入图片后,在表中会以文字显示,可能是“图片”,又可能是“位图图像”,还可能是“包”,绑定到窗体的Ole对象框后,有的显示图片,有的是显示一个图标加上文件名。总之各种情况,有点让人望而却步,玩不起不玩总可以吧~
 
不过有时候我们还不得不用它,比如要在连续窗体每一行显示一个图片时,就可以用ole字段来显示图片了。红尘如烟大侠大家都知道吧,他做的通用平台里的图标编辑窗口就是这样的。
 
那么怎样在ole字段中插入图片文件,绑定到窗体时能显示为图片?有下面两个方法:
1、象上面说的用Access自身提供的插入对象操作,插入图片文件,但只有位图文件能显示图片。
2、把图片插入到Access的图片框中,再复制图片框粘贴到ole对象框,或者把图片插入到Word中,再把Word中的图片复制粘贴到ole对象框。这种方法可以显示大部分格式的图片,jpg、gif、png、ico等都可以,并且还可以保持透明哦~
 
这些大家可能都懂了,我只是总结一下,呵呵...
 
但是,昨天岭南王子给我下任务了,说要用纯代码插入图片到ole对象框...王子的命令不得不执行啊...
不过王子的要求很合理,封装好的程序给别人使用,要添加图片,总不能让人打开Word把图片拷来拷去吧,显示得太不专业了。
 
今天把上面说的两种手工插入图片的方法用代码实现了,把关键的第二种贴上来,做得匆忙请大家指正:
模块中:
' 示  例: 演示代码插入图片到Ole对象框的2种方法
' 作  者: t小宝(QQ:377922812)
' 日  期: 2013-07-26
 
Private Type METAFILEPICT
        mm As Long
        hMF As Long
        yExt As Long
        xExt As Long
End Type
 
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
 
Private Declare Function SetEnhMetaFileBits Lib "gdi32" (ByVal cbBuffer As Long, lpData As Byte) As Long
Private Declare Function SetMetaFileBitsEx Lib "gdi32" (ByVal nSize As Long, lpData As Byte) As Long
Private Declare Function SetWinMetaFileBits Lib "gdi32" (ByVal cbBuffer As Long, lpbBuffer As Byte, ByVal hdcRef As Long, lpmfp As METAFILEPICT) As Long
 
Private Declare Function GlobalAlloc Lib "kernel32.dll" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalLock Lib "kernel32.dll" (ByVal hMem As Long) As Long
Private Declare Function GlobalSize Lib "kernel32.dll" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32.dll" (ByVal hMem As Long) As Long
Private Declare Function GlobalFree Lib "kernel32.dll" (ByVal hMem As Long) As Long
 
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
 
Private Const CF_BITMAP = 2
Private Const CF_DIB = 8
Private Const CF_METAFILEPICT = 3
Private Const CF_ENHMETAFILE = 14
Private Const GMEM_MOVEABLE = &H2
 
'----------------------------------------------------------------------------------------------------------------------------------
' 代码插入图片到Ole对象框之剪贴板法
' 原理:先加载图片到图片框,获取图片框的PictureData,根据其类型转为相应格式放到剪贴板,最后粘贴到Ole对象框。
' 这个方法相当于在设计视图中插入一幅图片到图片框,然后复制该图片框,再在窗体视图中粘贴到Ole对象框。
' 这种方法支持更多的格式,只要能加载到图片框的图片都可以插入到Ole对象框中并显示。
' 但透明的png图片会有锯齿,这没办法。因为Ole对象框只能显示位图和图元文件,增强型图元文件粘贴到Ole对象框中会转为图元文件。
' 另外,图片框能加载的图片格式及效果和电脑上安装的图形筛选器版本有关。
' 注意:对于2007或以上版本,须要在Access选项中将图片属性储存格式设置为:将所有图片数据转换成位图。否则使用此方法不成功。
' 也可用LoadPicture直接创建StdPicture对象来获取图像的句柄并处理,但不支持png图片,且gif图片也会丢失透明部分,非透明图片可用。
'----------------------------------------------------------------------------------------------------------------------------------
Public Function ImageToObjFrame(imgBox As Image, objFrame As BoundObjectFrame) As Boolean
On Error GoTo ErrHandle
 
    Dim bytArray() As Byte
    Dim tMf As METAFILEPICT
    Dim hGlobal As Long
    Dim lHandle As Long
    Dim lRet As Long
 
    If IsNull(imgBox.PictureData) Then Exit Function
 
    If OpenClipboard(0) Then                                                      ' 使用剪贴板前先打开
        Call EmptyClipboard                                                       ' 为了不出意外清空剪贴板给自己用
        bytArray() = imgBox.PictureData                                           ' 把图片框的数据放到数组备用
 
        Select Case bytArray(0)                                                   ' 图片框中的图片有位图、图元文件、增强图元文件3种类型
        Case 40  '位图(DIB)
            hGlobal = GlobalAlloc(GMEM_MOVEABLE, UBound(bytArray) + 1)            ' 创建缓冲区,用于存放DIB数据
            lHandle = GlobalLock(hGlobal)                                         ' 获取缓冲区读写指针,这个指针就是DIB的句柄了
            CopyMemory ByVal lHandle, bytArray(0), UBound(bytArray) + 1           ' 复制字节数组内容(DIB数据)到缓冲区
            GlobalUnlock hGlobal                                                  ' 解锁后才能使用
            lRet = SetClipboardData(CF_DIB, lHandle)                              ' 把DIB放入剪贴板
            GlobalFree hGlobal                                                    ' 释放分配的缓冲区空间,也可以不释放,系统会自己处理
            
        Case 3   '图元文件
'            lHandle = SetMetaFileBitsEx(UBound(bytArray) + 1 - 24, bytArray(24))               ' 创建图元文件
'            lRet = SetClipboardData(CF_METAFILEPICT, lHandle)                                  ' 把图元文件放入剪贴板,不成功,不知何故!
 
            '上面的代码把图元文件放入剪贴板不成功,转成增强型图元文件就可以了
            CopyMemory tMf, bytArray(8), Len(tMf)
            lHandle = SetWinMetaFileBits(UBound(bytArray) + 24 + 1 - 8, bytArray(24), 0&, tMf)   ' 从图元文件数据创建增强型图元文件
            lRet = SetClipboardData(CF_ENHMETAFILE, lHandle)                                     ' 把增强型图元文件放入剪贴板
 
        Case 14  '增强图元文件
            lHandle = SetEnhMetaFileBits(UBound(bytArray) + 1 - 8, bytArray(8))                  ' 创建增强型图元文件
            lRet = SetClipboardData(CF_ENHMETAFILE, lHandle)                                     ' 把增强型图元文件放入剪贴板
        Case Else
        End Select
        
        Call CloseClipboard                                                       ' 必须关闭剪贴板才能复制
        
        If lRet Then
            objFrame.SetFocus                                                     ' 把焦点移到Ole对象框
            DoCmd.RunCommand acCmdPaste                                           ' 把上面放到剪贴板中的东东粘贴到Ole对象框中
            Call OpenClipboard(0)                                                 ' 重新打开剪贴板以清空内容。也可以保留
            Call EmptyClipboard                                                   ' 清空剪贴板
            Call CloseClipboard                                                   ' 剪贴板用完要关闭,不然之后程序不能正常复制
            ImageToObjFrame = True
        End If
 
    End If
ErrHandle:
    
End Function
 
窗体中:
'----------------------------------------------------------------------------------------------------------------------------------
' 代码插入图片到Ole对象框之剪贴板法
' 原理:请看模块中的ImageToObjFrame函数
'----------------------------------------------------------------------------------------------------------------------------------
Private Sub Command2_Click()
 
    Dim sFileName As String
    Dim bytArray() As Byte
    Dim tMf As METAFILEPICT
    Dim hGlobal As Long
    Dim lHandle As Long
    Dim lRet As Long
 
    sFileName = GetFileName(1, , "图片文件(*.bmp;*.jpg;*.gif;*.ico;*.tif;*.png;*.wmf;*.emf)BMP格式(*.bmp)JPG格式(*.jpg)GIF格式(*.gif)ICO格式(*.ico)TIFF格式(*.tif)PNG格式(*.png)WMF格式(*.wmf)EMF格式(*.emf)")
    If Len(sFileName) = 0 Then Exit Sub
 
    Me.Image0.Picture = sFileName
    
    If ImageToObjFrame(Me.Image0, Me.FPicture2) Then
        Me.FName = Mid(sFileName, InStrRev(sFileName, "\") + 1)
    End If
    
    Me.Image0.Picture = ""
    
End Sub
 
发布人:zstmtony  
分享到:
点击次数:  更新时间:2014-12-19 16:03:34  【打印此页】  【关闭】
上一条:设置Access窗体启动  下一条:Access建表规范总结(二)——基础表独立



相关文章

  • • Access 获取图片的像素
  • • Access在同一页面中调用多张图片及放大图片
  • • 解决“我的电脑”中不显示扫描仪和摄像头
  • • WIA的脚本和NET(扫描仪开发)
  • • 可用来连接扫描仪的国外第三方免费控件Accessing TWAIN compatible scanner in Visual Basic
  • • 如何共享扫描仪
  • • 扫描程序设计说明文档(twain_32调用说明)
  • • Delphi针对扫描仪编程开发的相关代码

热门文章

  • [2017-02-05] 扫描程序设计说明文档(twain_32调用说明)access数据库
  • [2017-02-06] 如何共享扫描仪access数据库
  • [2017-02-07] WIA的脚本和NET(扫描仪开发)access数据库
  • [2017-02-05] C#调用WIA对扫描仪进行开发编程access数据库
  • [2017-02-05] Access VBA/VB 通用扫描仪开发模块代码access数据库
  • [2017-02-05] TWAIN和WIA扫描仪的功能区别access数据库

热门产品

公司动态|在线留言|在线反馈|友情链接|会员中心|站内搜索|网站地图

Access交流网 版权所有 1999-2018 粤ICP备10043721号

QQ:18449932

Access应用 Access培训 Access开发 Access平台

access|数据库|access下载|access教程|access视频|access软件

Powered by MetInfo 5.3.12 ©2008-2023  www.metinfo.cn