'這邊我舉一個簡單的讀取emf檔案作為例子,實際應用是其它的metafile
Dim metafile As New Metafile("D:\12345.emf")
我用下面這行代碼保存出來的emf檔案無法加載到visio中,提示“匯入圖形檔案失敗”,不得以棄用
metafile.Save("D:\\11111.emf", ImageFormat.Emf)
改用下面函式后(SaveEnhMetafileToFile)保存的檔案可以被visio加載,并“曲線組合”,這是我需要的,
'但問題在于必須關閉exe后才能洗掉檔案, 檔案一直被占用著,求大神幫忙看看問題在哪里?
Imports System.Drawing.Imaging
Imports System.Runtime.InteropServices
Imports System.Text
<DllImport("user32.dll")>
Private Shared Function OpenClipboard(hWndNewOwner As IntPtr) As Boolean
End Function
<DllImport("user32.dll")>
Private Shared Function EmptyClipboard() As Boolean
End Function
<DllImport("user32.dll")>
Private Shared Function SetClipboardData(uFormat As UInteger, hMem As IntPtr) As IntPtr
End Function
<DllImport("user32.dll")>
Private Shared Function CloseClipboard() As Boolean
End Function
<DllImport("gdi32.dll")>
Private Shared Function CopyEnhMetaFile(hemfSrc As IntPtr, hNULL As System.Text.StringBuilder) As IntPtr
End Function
<DllImport("gdi32.dll")>
Private Shared Function CloseEnhMetaFile(hdc As IntPtr) As Integer
End Function
<DllImport("gdi32.dll")>
Private Shared Function DeleteEnhMetaFile(hemf As IntPtr) As IntPtr
End Function
Public Function SaveEnhMetafileToFile(mf As Metafile, fileName As String) As Boolean
Dim bResult As Boolean = False
Dim hEMF As IntPtr
Try
hEMF = mf.GetHenhmetafile()
If Not hEMF.Equals(New IntPtr(0)) Then
Dim tempName As New StringBuilder(fileName)
CopyEnhMetaFile(hEMF, tempName)
CloseEnhMetaFile(hEMF) '=====沒用,,還是被占用
DeleteEnhMetaFile(hEMF) '=====還是沒用,,還是被占用
mf.Dispose() '=====依然沒用,,還是被占用,崩潰了
End If
Catch ex As Exception
Return False
End Try
Return bResult
End Function
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'這邊我舉一個簡單的讀取emf檔案作為例子,實際應用是其它的metafile
Dim metafile As New Metafile("D:\12345.emf")
'我用下面這行代碼保存出來的emf檔案無法加載到visio中,提示“匯入圖形檔案失敗”,不得以棄用
'metafile.Save("D:\\11111.emf", ImageFormat.Emf)
'改用下面函式后保存的檔案可以被visio加載,并“曲線組合”,這是我需要的,
'但問題在于必須關閉exe后才能洗掉檔案, 檔案一直被占用著
SaveEnhMetafileToFile(metafile, "D:\\22222.emf")
End Sub
uj5u.com熱心網友回復:
找到原因了,需要洗掉CopyEnhMetaFile創建的句柄,Friend Shared Function SaveEnhMetafileToFile(mf As Metafile, fileName As String) As Boolean
Dim bResult As Boolean = False
Dim hEMF As IntPtr
hEMF = mf.GetHenhmetafile()
' invalidates mf
If Not hEMF.Equals(New IntPtr(0)) Then
Dim tempName As New StringBuilder(fileName)
Dim hCopyEMF As IntPtr = CopyEnhMetaFile(hEMF, tempName.ToString())
DeleteEnhMetaFile(hCopyEMF)
DeleteEnhMetaFile(hEMF)
End If
Return bResult
End Function
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/207441.html
標籤:VB.NET
上一篇:下拉提示
下一篇:linq請教
