技術(shù) 點
- 技術(shù)
- 點
- V幣
- 點
- 積分
- 12861

|
Access中的Ole對象總感覺是個神秘的東西,功能好象很強大,既可以顯示圖片,還可顯示W(wǎng)ord文檔、Excel表格等,但對它的控制卻不象其它對象那么容易,聯(lián)機幫助中講的不多,僅有的一點幫助看得也是一頭霧水。
拿Ole字段儲存圖片來說,通過菜單操作在Ole字段中插入圖片后,在表中會以文字顯示,可能是“圖片”,又可能是“位圖圖像”,還可能是“包”,綁定到窗體的Ole對象框后,有的顯示圖片,有的是顯示一個圖標(biāo)加上文件名?傊鞣N情況,有點讓人望而卻步,玩不起不玩總可以吧~
不過有時候我們還不得不用它,比如要在連續(xù)窗體每一行顯示一個圖片時,就可以用ole字段來顯示圖片了。紅塵如煙大俠大家都知道吧,他做的通用平臺里的圖標(biāo)編輯窗口就是這樣的。
那么怎樣在ole字段中插入圖片文件,綁定到窗體時能顯示為圖片?有下面兩個方法:
1、象上面說的用Access自身提供的插入對象操作,插入圖片文件,但只有位圖文件能顯示圖片。
2、把圖片插入到Access的圖片框中,再復(fù)制圖片框粘貼到ole對象框,或者把圖片插入到Word中,再把Word中的圖片復(fù)制粘貼到ole對象框。這種方法可以顯示大部分格式的圖片,jpg、gif、png、ico等都可以,并且還可以保持透明哦~
這些大家可能都懂了,我只是總結(jié)一下,呵呵...
但是,昨天嶺南王子給我下任務(wù)了,說要用純代碼插入圖片到ole對象框...王子的命令不得不執(zhí)行啊...
不過王子的要求很合理,封裝好的程序給別人使用,要添加圖片,總不能讓人打開Word把圖片拷來拷去吧,顯示得太不專業(yè)了。
今天把上面說的兩種手工插入圖片的方法用代碼實現(xiàn)了,把關(guān)鍵的第二種貼上來,做得匆忙請大家指正:
模塊中:- ' 示 例: 演示代碼插入圖片到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,根據(jù)其類型轉(zhuǎn)為相應(yīng)格式放到剪貼板,最后粘貼到Ole對象框。
- ' 這個方法相當(dāng)于在設(shè)計視圖中插入一幅圖片到圖片框,然后復(fù)制該圖片框,再在窗體視圖中粘貼到Ole對象框。
- ' 這種方法支持更多的格式,只要能加載到圖片框的圖片都可以插入到Ole對象框中并顯示。
- ' 但透明的png圖片會有鋸齒,這沒辦法。因為Ole對象框只能顯示位圖和圖元文件,增強型圖元文件粘貼到Ole對象框中會轉(zhuǎn)為圖元文件。
- ' 另外,圖片框能加載的圖片格式及效果和電腦上安裝的圖形篩選器版本有關(guān)。
- ' 注意:對于2007或以上版本,須要在Access選項中將圖片屬性儲存格式設(shè)置為:將所有圖片數(shù)據(jù)轉(zhuǎn)換成位圖。否則使用此方法不成功。
- ' 也可用LoadPicture直接創(chuàng)建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 ' 把圖片框的數(shù)據(jù)放到數(shù)組備用
- Select Case bytArray(0) ' 圖片框中的圖片有位圖、圖元文件、增強圖元文件3種類型
- Case 40 '位圖(DIB)
- hGlobal = GlobalAlloc(GMEM_MOVEABLE, UBound(bytArray) + 1) ' 創(chuàng)建緩沖區(qū),用于存放DIB數(shù)據(jù)
- lHandle = GlobalLock(hGlobal) ' 獲取緩沖區(qū)讀寫指針,這個指針就是DIB的句柄了
- CopyMemory ByVal lHandle, bytArray(0), UBound(bytArray) + 1 ' 復(fù)制字節(jié)數(shù)組內(nèi)容(DIB數(shù)據(jù))到緩沖區(qū)
- GlobalUnlock hGlobal ' 解鎖后才能使用
- lRet = SetClipboardData(CF_DIB, lHandle) ' 把DIB放入剪貼板
- GlobalFree hGlobal ' 釋放分配的緩沖區(qū)空間,也可以不釋放,系統(tǒng)會自己處理
-
- Case 3 '圖元文件
- ' lHandle = SetMetaFileBitsEx(UBound(bytArray) + 1 - 24, bytArray(24)) ' 創(chuàng)建圖元文件
- ' lRet = SetClipboardData(CF_METAFILEPICT, lHandle) ' 把圖元文件放入剪貼板,不成功,不知何故!
- '上面的代碼把圖元文件放入剪貼板不成功,轉(zhuǎn)成增強型圖元文件就可以了
- CopyMemory tMf, bytArray(8), Len(tMf)
- lHandle = SetWinMetaFileBits(UBound(bytArray) + 24 + 1 - 8, bytArray(24), 0&, tMf) ' 從圖元文件數(shù)據(jù)創(chuàng)建增強型圖元文件
- lRet = SetClipboardData(CF_ENHMETAFILE, lHandle) ' 把增強型圖元文件放入剪貼板
- Case 14 '增強圖元文件
- lHandle = SetEnhMetaFileBits(UBound(bytArray) + 1 - 8, bytArray(8)) ' 創(chuàng)建增強型圖元文件
- lRet = SetClipboardData(CF_ENHMETAFILE, lHandle) ' 把增強型圖元文件放入剪貼板
- Case Else
- End Select
-
- Call CloseClipboard ' 必須關(guān)閉剪貼板才能復(fù)制
-
- If lRet Then
- objFrame.SetFocus ' 把焦點移到Ole對象框
- DoCmd.RunCommand acCmdPaste ' 把上面放到剪貼板中的東東粘貼到Ole對象框中
- Call OpenClipboard(0) ' 重新打開剪貼板以清空內(nèi)容。也可以保留
- Call EmptyClipboard ' 清空剪貼板
- Call CloseClipboard ' 剪貼板用完要關(guān)閉,不然之后程序不能正常復(fù)制
- ImageToObjFrame = True
- End If
- End If
- ErrHandle:
-
- End Function
復(fù)制代碼 窗體中:- '----------------------------------------------------------------------------------------------------------------------------------
- ' 代碼插入圖片到Ole對象框之剪貼板法
- ' 原理:請看模塊中的ImageToObjFrame函數(shù)
- '----------------------------------------------------------------------------------------------------------------------------------
- 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
復(fù)制代碼 示例mdb是少不了的:
|
本帖子中包含更多資源
您需要 登錄 才可以下載或查看,沒有帳號?注冊
x
評分
-
查看全部評分
|