PlayEnhMetaFileRecord 拡張メタファイルのレコードを再生

C宣言:

BOOL PlayEnhMetaFileRecord(
	HDC hDC,
	LPHANDLETABLE pHandles,
	CONST ENHMETARECORD *pRecord,
	UINT HandleNum);

ポインタをアドレス値で渡す場合のVBの宣言:

Declare Function PlayEnhMetaFileRecord Lib "gdi32" ( _
	ByVal hDC As Long, _
	ByVal pHandles As Long, _
	ByVal pRecord As Long, _
	ByVal HandleNum As Long) As Long

説明:

hDCで指定されたデバイスに対してpRecordで指定された拡張メタファイルのレコードを描画する。

引数の意味は以下の通り。
hDC 描画先デバイスを識別するデバイスコンテキストのハンドル。
pHandles 描画に使用するGDIオブジェクトのハンドルの配列のアドレス。
pRecord 描画を行なう拡張メタファイルのレコードのアドレス。
HandleNum pHandlesが指す配列の要素の数。

戻り値は、関数の実行に成功したか否かを表す真偽値である。

VBのサンプル:

下記サンプルでは、"c:\pic\test.emf"という拡張メタファイルに含まれるレコードを列挙している。列挙用コールバック関数であるEnumFunc関数では、与えられたレコードが円を描画するためのものである場合に限りそのレコードを再生し、そうでない場合は無視する。結果として、メタファイルから円の要素を抽出した図形がピクチャボックスに描画される。
-------------------------------- Form1.frm --------------------------------
' EnumEnhMetaFileの例
Private Sub Command1_Click()

    Dim hEmf As Long '拡張メタファイルのハンドル
    Dim r As RECT '描画する領域
    
    '拡張メタファイルのオープン
    hEmf = GetEnhMetaFile("c:\pic\test.emf")
    
    '描画領域の設定
    r.Left = 0
    r.Top = 0
    r.Right = 100
    r.Bottom = 100
    
    'レコードの列挙
    EnumEnhMetaFile Picture1.hDC, hEmf, AddressOf EnumFunc, 0, r
    
    '拡張メタファイルのクローズ
    DeleteEnhMetaFile hEmf

End Sub

-------------------------------- Module1.base --------------------------------
Declare Function PlayEnhMetaFileRecord Lib "gdi32" ( _
	ByVal hDC As Long, _
	ByVal pHandles As Long, _
	ByVal pRecord As Long, _
	ByVal HandleNum As Long) As Long

Declare Function RtlMoveMemory Lib "kernel32" ( _
	ByVal pDest As Long, _
	ByVal pSrc As Long, ByVal l As Long) As Long

' メタファイルレコード列挙コールバック
Public Function EnumFunc( _
	ByVal hDC As Long, _
	ByVal pHandles As Long, _
	ByVal pRecord As Long, _
	ByVal HandleNum As Long, _
	ByVal pData As Long) As Long

    Dim eh As EMR 'レコードのヘッダ
    
    'レコードのヘッダをehに格納
    RtlMoveMemory VarPtr(eh), pRecord, Len(eh)

	'レコードの種類が円を描画するためのものであれば、そのレコードを再生
    Select Case eh.iType
        Case _
            EMR_ELLIPSE, _
            EMR_HEADER, _
            EMR_SCALEVIEWPORTEXTEX, _
            EMR_SCALEWINDOWEXTEX, _
            EMR_SETMAPMODE, _
            EMR_SETMAPPERFLAGS
                PlayEnhMetaFileRecord(hDC, pHandles, pRecord, HandleNum)
    End Select

    EnumFunc = 1

End Function

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

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