应用程序中插入OLE对象的方法

时间:2022-07-15 06:39:24

应用程序中插入OLE对象的方法

摘要:该文介绍了在应用程序中使用OLE技术来来插入OLE对象的两种方法,第一种方法是使用微软的OLE容器控件,第二种方法介绍了在不能使用OLE容器控件的时候,如何通过调用API函数插入OLE对象。

关键词:OLE;API;RichTextBox

中图分类号:TP311 文献标识码:A文章编号:1009-3044(2009)35-9967-02

The Methods of Insert Ole Object into Windows Application

CHEN Jia-hong

(Jinling Institute of Technology, Nanjing 211169, China)

Abstract: This article shows how you can insert OLE objects into a RichTextBox control by using the OLE way, The first method is to use Microsoft's OLE Container Control, The second method describes that how we can call the windows API function to inserting OLE objects when we cannot use OLE container control.

Key words: OLE; API; RichTextBox

1 基于OLE容器控件实现插入OLE对象

Object Linking and Embedding,对象连接与嵌入,简称OLE技术。OLE是在客户应用程序间传输和共享信息的一组综合标准。OLE基于组件对象模型 (COM) 并允许开发可在多个应用程序间互操作的可复用即插即用对象。在Visual Basic 6.0中,提供了一个OLE容器的功能,允许在用户的应用程序嵌入公式、word、Excel等OLE对象。大大提高了应用程序的功能。类似于windows操作系统自带的写字板,写字板程序有一个重要的功能就是在文档中嵌入各种RTF(丰富格式文本)。如图1所示。

如果想要在自己的应用程序中实现这种功能,就要使用RichTextBox控件和OLE容器功能。下边首先阐述在Visual Basic6.0中如何实现。

在Visual Basic 6.0中要实现RTF的功能,主要有两种方法,第一种是使用RichTextBox控件结合OLE容器的功能,此种方法实现起来方便简单,但只能使用在基于windows的窗体应用程序中,在Activex控件等技术中都不能使用,限制了此种方法的应用。

第一种方法的实现:

首先在VB中建立一个标准的windows应用程序,向窗体上添加OLE容器控件和RichTextBox控件,其中的RichTextBox控件不是标准的控件,需要通过在控件工具箱点击右键选择【部件】选项,如图2所示。

选中其中的Microsoft Rich TexBox Control 6.0,这样在控件工具箱中就多了一个RichTextBox控件。如图所示:,其中第一个是OLE容器控件,第二个就是RichTextBox控件。

在窗体上加入这两个控件,在加入一个命令按钮,最终的界面如图3所示。

此程序中,我们只是利用OLE容器控件做中介,并不是直接把OLE对象显示在OLE容器中,而是显示在RichTextBox控件中,所以,需要设置OLE容器对象的Visible属性为False,这样在程序运行起来之后就看不到OLE容器控件了。下边讲解如何实现把OLE对象插入RichTextBox控件。为命令按钮Command1编写代码:

Private Sub Command1_Click()

OLE1.InsertObjDlg'通过OLE容器控件调用插入对象对话框,显示各种可以插入的对象

If OLE1.Class "" Then '如果用户选择了插入某种对象

RichTextBox1.OLEObjects.Add , , , OLE1.Class'把此对象插入RichTextBox控件中

End If

End Sub

程序运行时,用户点击按钮,将会打开插入对象对话框,如图4所示。

如果用户选择插入公式,就会自动打开公式编辑器,让用户编辑公式,编辑完成后自动插入到RichTextBox控件中,如图5所示。

由以上的介绍可以看出,使用第一种方法插入OLE对象的方法是简单快捷的。但这种方法只能用于能使用OLE容器控件的窗体应用程序中。在其他类型的应用程序中无法使用,例如在ActiveX控件中就不能使用OLE控件容器。

2 使用API函数实现OLE对象的插入

第二种方法的是使用RichTextBox控件,结合windows API技术,直接在应用程序中调用windows API实现在RichTextBox控件中插入各种各样的OLE对象,从而实现丰富格式文本的功能。

下边介绍第二种实现向RichTextBox控件中插入OLE对象的方法,本方法的核心是使用windows API函数的方法。本文将以一个支持RTF功能的ActiveX控件的实现为例,讲解如何不通过OLE容器控件实现丰富格式文本,如图6所示。

首先,为了在程序中使用OLE技术,首先要引入相应的API函数。

第一个要引入的API是显示插入对象对话框的API,这是此程序中主要的一个API,用来显示插入对象的对话框:

Private Declare Function OleUIInsertObject Lib "oledlg.dll" _

Alias "OleUIInsertObjectA" (inParam As Any) As Long

其次,还要引入其它的一些API,要引入的API介绍如下:

此API的功能是根据Class ID得到Com对象的ProgID,此API需要从VB传递LPOLESTR * 参数:

Private Declare Function ProgIDFromCLSID Lib "ole32.dll"(clsid As Any, strAddess As Long) As Long

用此API来为OLE方式分配的内存用OLE方式释放:

Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal pvoid As Long)

用此API将一块内存的数据从一个位置复制到另一个位置:

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

用此API返回UNICODE编码字符串的长度(不包括字符串结束标志):

Private Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long'OleUIInsertObjectType中的dwFlags使用的常量。其它功能的核心代码如下:

Public Sub InsertOleObject()

Dim UIInsertObj As OleUIInsertObjectType

Dim retValue As Long

Dim lpolestr As Long

Dim strsize As Long

Dim ProgId As String

UIInsertObj.cbStruct = LenB(UIInsertObj)

UIInsertObj.dwFlags = IOF_SELECTCREATENEW

UIInsertObj.hWndOwner = 0

UIInsertObj.lpszFile = String(256, " ")

UIInsertObj.cchFile = Len(UIInsertObj.lpszFile)

retValue = OleUIInsertObject(UIInsertObj)

If (retValue = OLEUI_OK) Then

If ((UIInsertObj.dwFlags And IOF_SELECTCREATENEW) = _

IOF_SELECTCREATENEW) Then

retValue = ProgIDFromCLSID(UIInsertObj.clsid, lpolestr)

strsize = lstrlenW(lpolestr) + 1

ProgId = String(strsize, 0)

CopyMemory ByVal StrPtr(ProgId), ByVal lpolestr, strsize * 2

CoTaskMemFree lpolestr

RichTextBox1.OLEObjects.Add , , "", ProgId

Else

RichTextBox1.OLEObjects.Add , , UIInsertObj.lpszFile

End If

End If

Exit Sub

End Sub

插入图片的函数代码:

Private Sub minspic_Click()

CommonDialog1.Filter = "所有图形文件|*.bmp;*.dib;*.BMP;*.gif;*.GIF;*.jpg;*.jpeg;*.JPG;*.JPEG;*.jpe;*.JPE|BMP(*.bmp;*.dib)|*.bmp;*.dib|GIF(*.gif;*.GIF)|*.gif;*.GIF|JPG (*.JPG;*.JPEG;*.jpg;*.jpeg)|*.JPG;*.JPEG;*.jpg;*.jpeg"

CommonDialog1.ShowOpen

Clipboard.Clear

Clipboard.SetData LoadPicture(CommonDialog1.FileName)

RichTextBox1.SetFocus

SendKeys "^v", True

End Sub

3 总结

本文介绍了两种在应用程序中实现插入OLE对象的方法,其中第一种使用RichTextBox结合OLE容器控件,第二种方法使用RichTextBox结合API函数实现插入OLE对象和图片等。在应用程序中使用OLE对象能大大提高应用程序的功能,解决传统应用程序中大部分只能处理字符的缺点。

上一篇:非计算机专业网页设计课程教改探析 下一篇:项目教学法在高职《多媒体技术》课程教学中的...