GetEnhMetaFileBits 拡張メタファイルデータを取得

Cの宣言:

UINT GetEnhMetaFileBits(
	HENHMETAFILE hEmf,
	UINT ByteArraySize,
	LPBYTE ByteArray);

VBの宣言:

Declare Function GetEnhMetaFileBits Lib "gdi32" ( _
	ByVal hEmf As Long, _
	ByVal ByteArraySize As Long, _
	ByRef ByteArray As Byte) As Long

説明:

hEmfで指定された拡張メタファイルの生のデータを取得する。

引数の意味は以下の通り。
hEmf 取得元の拡張メタファイルのハンドル。
ByteArraySize ByteArrayのサイズ。
ByteArray 取得結果のデータ。NULLを指定可能。

戻り値は、ByteArrayに返されたデータのサイズである。ByteArrayにNULLを設定した場合、必要なサイズが返される。関数の実行に失敗した場合、0が返される。

VBのサンプル:

拡張メタファイル"c:\pic\test.emf"に含まれる図形のうち、Ellipse関数によって描画された楕円系を長方形に変更し、"c:\pic\new.emf"という名前で保存する。
Type RECTL
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

Type EMR
    iType As Long
    nSize As Long
End Type

Type EMR_ELLIPSE
    e As EMR
    rclBox As RECTL
End Type

Type EMR_RECTANGLE
    e As EMR
    rclBox As RECTL
End Type

Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Dest As Any, ByRef Src As Any, ByVal Length As Long)

' メタファイル中の楕円を長方形に変換
Private Sub Command1_Click()

    Dim SrcData(10000) As Byte '元のメタファイルの内容を格納するバッファ
    Dim DestData(10000) As Byte '新規メタファイルの内容を格納するバッファ
    Dim hSrcMetaFile As Long '複製元メタファイルのハンドル
    Dim hMemMetaFile As Long 'メモリ上の新規メタファイルのハンドル
    Dim hFileMetaFile As Long 'ファイル上の新規メタファイルのハンドル
    Dim r As RECT '描画する領域
    Dim BufSize As Long 'SrcDataに格納されたメタファイルの内容のサイズ
    Dim SrcIdx As Long, DestIdx As Long
    Dim RecordHeader As EMR 'メタファイルレコードのヘッダ
    Dim EllipseRecord As EMR_ELLIPSE '楕円描画用レコードの情報
    Dim RectangleRecord As EMR_RECTANGLE '長方形描画用レコードの情報
        
    '複製元メタファイルのオープン
    hSrcMetaFile = GetEnhMetaFile("c:\pic\test.emf")

    'メタファイルの内容を取得
    BufSize = GetEnhMetaFileBits(hSrcMetaFile, 10000, SrcData(0))

    SrcIdx = 0
    DestIdx = 0
    
    ' 楕円の描画を長方形の描画に置き換え
    While SrcIdx < BufSize
        'レコードのヘッダを取得
        MoveMemory RecordHeader, SrcData(SrcIdx), Len(RecordHeader)
        
        If RecordHeader.iType = EMR_ELLIPSE Then '楕円描画レコードの場合
            '楕円描画情報を取得
            MoveMemory EllipseRecord, SrcData(SrcIdx), Len(EllipseRecord)
            
            '長方形描画情報を作成
            RectangleRecord.e.iType = EMR_RECTANGLE
            RectangleRecord.e.nSize = Len(RectangleRecord)
            RectangleRecord.rclBox = EllipseRecord.rclBox
            
            '新規メタファイル用バッファに設定
            MoveMemory DestData(DestIdx), RectangleRecord, Len(RectangleRecord)
            DestIdx = DestIdx + Len(RectangleRecord)
        
        Else '楕円描画レコードでない場合
            'そのまま複製
            MoveMemory DestData(DestIdx), SrcData(SrcIdx), RecordHeader.nSize
            DestIdx = DestIdx + RecordHeader.nSize
        End If
        
        SrcIdx = SrcIdx + RecordHeader.nSize
    Wend
    
    'バッファの内容を元に新規メタファイルを作成
    hMemMetaFile = SetEnhMetaFileBits(BufSize, DestData(0))
    
    'ファイルに保存
    hFileMetaFile = CopyEnhMetaFile(hMemMetaFile, "c:\pic\new.emf")
    
    'メタファイルのクローズ
    DeleteEnhMetaFile hFileMetaFile
    DeleteEnhMetaFile hMemMetaFile
    DeleteEnhMetaFile hSrcMetaFile

End Sub

(original text:2000/01/27 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。