GetEnhMetaFilePaletteEntries 拡張メタファイルに含まれるパレットの取得

Cの宣言:

UINT GetEnhMetaFilePaletteEntries(
	HENHMETAFILE hEmf,
	UINT EntriyNum,
	LPPALETTEENTRY Entries);

VBの宣言:

Declare Function GetEnhMetaFilePaletteEntries Lib "gdi32" ( _
	ByVal hEmf As Long, _
	ByVal EntryNum As Long, _
	ByRef Entries As PALETTEENTRY) As Long

説明:

拡張メタファイル中のパレット情報を取得する。

引数の意味は以下の通り。
hEmf 取得元の拡張メタファイルのハンドル。
EntryNum Entriesの要素の数。
Entries 取得結果のパレット情報の配列。NULLを指定可能。

戻り値は、Entriesに返された情報の数である。EntriesにNULLを指定した場合、必要な配列の要素の数が返される。拡張メタファイルにパレットが存在しない場合、0が返される。関数の実行に失敗した場合、GDI_ERRORが返される。

VBのサンプル:

拡張メタファイル"c:\pic\pal.emf"にはパレットが含まれている。GetEnhMetaFilePaletteEntriesによってパレットを取得し、有効にしてからめたファイルを描画する。
Public Type PICTDESC_BMP
    cbSizeOfStruct As Long
    picType As Long
    hBitmap As Long
    hPal As Long
    Padding As Long
End Type

Public Const PICTYPE_BITMAP As Long = 1

Declare Function OleCreatePictureIndirect Lib "olepro32" ( _
    ByRef Desc As PICTDESC_BMP, _
    ByRef IID As GUID, _
    ByVal fOwn As Long, _
    ByRef IPic As IPicture) As Long

' パレットつきの拡張メタファイルを描画
Private Sub Command1_Click()

    Dim hEmf As Long '拡張メタファイルのハンドル
    Dim r As RECT '描画する領域
    Dim LogPal As LOGPALETTE 'パレット情報
    Dim hPal As Long 'パレットのハンドル
    Dim IPic As IPicture 'パレット用ピクチャオブジェクト
    Dim IID_IDispatch As GUID 'IDispatchインターフェースのGUID
    Dim Desc As PICTDESC_BMP 'パレット用ピクチャオブジェクトの作成情報
    
    '拡張メタファイルのオープン
    hEmf = GetEnhMetaFile("c:\pic\pal.emf")
    
    '描画領域の設定
    r.Left = 0
    r.Top = 0
    r.Right = 300
    r.Bottom = 300
    
    'パレットエントリの取得
    LogPal.palNumEntries = GetEnhMetaFilePaletteEntries(hEmf, 1000, LogPal.palPalEntry(0))
    
    ' パレットの作成
    LogPal.palVersion = &H300
    hPal = CreatePalette(LogPal)

    ' パレット用ピクチャオブジェクトの作成に用いる情報の初期化
    Desc.cbSizeOfStruct = Len(Desc)
    Desc.picType = PICTYPE_BITMAP
    Desc.hBitmap = 0
    Desc.hPal = hPal
    
    IID_IDispatch.Data1 = &H20400
    IID_IDispatch.data2 = 0
    IID_IDispatch.data3 = 0
    IID_IDispatch.data4(0) = &HC0
    IID_IDispatch.data4(1) = 0
    IID_IDispatch.data4(2) = 0
    IID_IDispatch.data4(3) = 0
    IID_IDispatch.data4(4) = 0
    IID_IDispatch.data4(5) = 0
    IID_IDispatch.data4(6) = 0
    IID_IDispatch.data4(7) = &H46
    
    'パレット用ピクチャオブジェクトの作成
    OleCreatePictureIndirect Desc, IID_IDispatch, 1, IPic
    
    '作成したオブジェクトをフォームのパレットとして設定
    Me.Palette = IPic
    Me.PaletteMode = vbPaletteModeCustom
    Me.Refresh

    '拡張メタファイルの描画
    PlayEnhMetaFile Picture1.hDC, hEmf, r
    
    '拡張メタファイルのクローズ
    DeleteEnhMetaFile hEmf

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

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