摘要:該文介紹了在應(yīng)用程序中使用OLE技術(shù)來來插入OLE對象的兩種方法,第一種方法是使用微軟的OLE容器控件,第二種方法介紹了在不能使用OLE容器控件的時候,如何通過調(diào)用API函數(shù)插入OLE對象。
關(guān)鍵詞: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容器控件實現(xiàn)插入OLE對象
Object Linking and Embedding,對象連接與嵌入,簡稱OLE技術(shù)。OLE是在客戶應(yīng)用程序間傳輸和共享信息的一組綜合標準。OLE基于組件對象模型 (COM) 并允許開發(fā)可在多個應(yīng)用程序間互操作的可復(fù)用即插即用對象。在Visual Basic 6.0中,提供了一個OLE容器的功能,允許在用戶的應(yīng)用程序嵌入公式、word、Excel等OLE對象。大大提高了應(yīng)用程序的功能。類似于windows操作系統(tǒng)自帶的寫字板,寫字板程序有一個重要的功能就是在文檔中嵌入各種RTF(豐富格式文本)。如圖1所示。
如果想要在自己的應(yīng)用程序中實現(xiàn)這種功能,就要使用RichTextBox控件和OLE容器功能。下邊首先闡述在Visual Basic6.0中如何實現(xiàn)。
在Visual Basic 6.0中要實現(xiàn)RTF的功能,主要有兩種方法,第一種是使用RichTextBox控件結(jié)合OLE容器的功能,此種方法實現(xiàn)起來方便簡單,但只能使用在基于windows的窗體應(yīng)用程序中,在Activex控件等技術(shù)中都不能使用,限制了此種方法的應(yīng)用。
第一種方法的實現(xiàn):
首先在VB中建立一個標準的windows應(yīng)用程序,向窗體上添加OLE容器控件和RichTextBox控件,其中的RichTextBox控件不是標準的控件,需要通過在控件工具箱點擊右鍵選擇【部件】選項,如圖2所示。
選中其中的Microsoft Rich TexBox Control 6.0,這樣在控件工具箱中就多了一個RichTextBox控件。如圖所示:,其中第一個是OLE容器控件,第二個就是RichTextBox控件。
在窗體上加入這兩個控件,在加入一個命令按鈕,最終的界面如圖3所示。
此程序中,我們只是利用OLE容器控件做中介,并不是直接把OLE對象顯示在OLE容器中,而是顯示在RichTextBox控件中,所以,需要設(shè)置OLE容器對象的Visible屬性為False,這樣在程序運行起來之后就看不到OLE容器控件了。下邊講解如何實現(xiàn)把OLE對象插入RichTextBox控件。為命令按鈕Command1編寫代碼:
Private Sub Command1_Click()
OLE1.InsertObjDlg'通過OLE容器控件調(diào)用插入對象對話框,顯示各種可以插入的對象
If OLE1.Class <> \"\" Then '如果用戶選擇了插入某種對象
RichTextBox1.OLEObjects.Add , , , OLE1.Class'把此對象插入RichTextBox控件中
End If
End Sub
程序運行時,用戶點擊按鈕,將會打開插入對象對話框,如圖4所示。
如果用戶選擇插入公式,就會自動打開公式編輯器,讓用戶編輯公式,編輯完成后自動插入到RichTextBox控件中,如圖5所示。
由以上的介紹可以看出,使用第一種方法插入OLE對象的方法是簡單快捷的。但這種方法只能用于能使用OLE容器控件的窗體應(yīng)用程序中。在其他類型的應(yīng)用程序中無法使用,例如在ActiveX控件中就不能使用OLE控件容器。
2 使用API函數(shù)實現(xiàn)OLE對象的插入
第二種方法的是使用RichTextBox控件,結(jié)合windows API技術(shù),直接在應(yīng)用程序中調(diào)用windows API實現(xiàn)在RichTextBox控件中插入各種各樣的OLE對象,從而實現(xiàn)豐富格式文本的功能。
下邊介紹第二種實現(xiàn)向RichTextBox控件中插入OLE對象的方法,本方法的核心是使用windows API函數(shù)的方法。本文將以一個支持RTF功能的ActiveX控件的實現(xiàn)為例,講解如何不通過OLE容器控件實現(xiàn)豐富格式文本,如圖6所示。
首先,為了在程序中使用OLE技術(shù),首先要引入相應(yīng)的API函數(shù)。
第一個要引入的API是顯示插入對象對話框的API,這是此程序中主要的一個API,用來顯示插入對象的對話框:
Private Declare Function OleUIInsertObject Lib \"oledlg.dll\" _
Alias \"OleUIInsertObjectA\" (inParam As Any) As Long
其次,還要引入其它的一些API,要引入的API介紹如下:
此API的功能是根據(jù)Class ID得到Com對象的ProgID,此API需要從VB傳遞LPOLESTR * 參數(shù):
Private Declare Function ProgIDFromCLSID Lib \"ole32.dll\"(clsid As Any, strAddess As Long) As Long
用此API來為OLE方式分配的內(nèi)存用OLE方式釋放:
Private Declare Sub CoTaskMemFree Lib \"ole32.dll\" (ByVal pvoid As Long)
用此API將一塊內(nèi)存的數(shù)據(jù)從一個位置復(fù)制到另一個位置:
Private Declare Sub CopyMemory Lib \"kernel32\" Alias \"RtlMoveMemory\" (Destination As Any, Source As Any, ByVal Length As Long)
用此API返回UNICODE編碼字符串的長度(不包括字符串結(jié)束標志):
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
插入圖片的函數(shù)代碼:
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 總結(jié)
本文介紹了兩種在應(yīng)用程序中實現(xiàn)插入OLE對象的方法,其中第一種使用RichTextBox結(jié)合OLE容器控件,第二種方法使用RichTextBox結(jié)合API函數(shù)實現(xiàn)插入OLE對象和圖片等。在應(yīng)用程序中使用OLE對象能大大提高應(yīng)用程序的功能,解決傳統(tǒng)應(yīng)用程序中大部分只能處理字符的缺點。