Win32 API 日本語リファレンス
ホームDevices.Display › FD_DEVICEMETRICS

FD_DEVICEMETRICS

構造体
サイズx64: 124 バイト / x86: 124 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
flRealizedTypeDWORD4+0+0

アクセラレータフラグのセットです。この値には、次の値の組み合わせを指定できます。

FDM_TYPE_BM_SIDE_CONST

横書きおよび縦書き用のアクセラレータです。このフラグが設定されている場合、フォントはすべてのビットマップについて一定の高さを持ちます。横書きの場合は cy の寸法が一定であることを意味し、縦書きの場合は cx の寸法が一定であることを意味します。このアクセラレータはアウトラインには使用されません。

FDM_TYPE_CHAR_INC_EQUAL_BM_BASE

横書きおよび縦書き用のアクセラレータです。横書きの場合、このフラグが設定されていると、各グリフの送り幅はグリフビットマップの cx の寸法と等しくなります。縦書きの場合、このフラグが設定されていると、各グリフの送り幅はグリフビットマップの cy の寸法と等しくなります。このアクセラレータはアウトラインには使用されません。

FDM_TYPE_CONST_BEARINGS

設定されている場合、すべてのグリフで a スペースおよび c スペースが一定です。

FDM_TYPE_MAXEXT_EQUAL_BM_SIDE

このフラグは、FDM_TYPE_BM_SIDE_CONST も設定されている場合にのみ設定できます。設定されている場合、フォントの高さ (横書きおよび縦書きについて前述のとおり) は、最大アセンダーと最大ディセンダーの合計に等しくなります。このアクセラレータはアウトラインには使用されません。

FDM_TYPE_ZERO_BEARINGS

設定されている場合、すべてのグリフで a スペースおよび c スペースが 0 です。

pteBasePOINTE8+4+4フォントのベースラインに沿った表記空間 (notional space) の単位ベクトルを、デバイス空間に変換して正規化した値を格納する POINTE 構造体を指定します。詳細については、GDI Data Types の POINTE を参照してください。
pteSidePOINTE8+12+12フォントのベースラインに垂直で、アセンダー方向を向く表記空間の単位ベクトルを、デバイス空間に変換して正規化した値を格納する POINTE 構造体を指定します。表記空間では、ベースライン方向とアセンダー方向は直交していなければなりませんが、デバイス空間では、表記空間からデバイス空間への変換によっては pteBasepteSide が直交している必要はありません。
lDINT4+20+20フォントが固定ピッチ (等幅) フォントである場合の送り幅を指定します。フォントが可変ピッチフォントである場合、このメンバーは 0 に設定する必要があります。
fxMaxAscenderINT4+24+24このフォントインスタンスについて、pteSide に沿って測定されたヒント処理済みの最大アセンダー高さを指定します。GDI Data Types の FIX データ型を参照してください。
fxMaxDescenderINT4+28+28このフォントインスタンスについて、pteSide に沿って測定されたヒント処理済みの最大ディセンダー高さを指定します。GDI Data Types の FIX データ型を参照してください。
ptlUnderline1POINTL8+32+32このフォントインスタンスについて、グリフの文字原点を基準としたヒント処理済みの下線位置を格納する POINTL 構造体を指定します。
ptlStrikeOutPOINTL8+40+40このフォントインスタンスについて、グリフの文字原点を基準としたヒント処理済みの取り消し線位置を格納する POINTL 構造体を指定します。
ptlULThicknessPOINTL8+48+48このフォントインスタンスについて、ヒント処理済みの下線の太さを格納する POINTL 構造体を指定します。このベクトルは、下線の描画に使用される矩形の辺を定義します。底辺はベースラインによって暗黙的に定義されます。
ptlSOThicknessPOINTL8+56+56このフォントインスタンスについて、ヒント処理済みの取り消し線の太さを格納する POINTL 構造体を指定します。このベクトルは、取り消し線の描画に使用される矩形の辺を定義します。底辺はベースラインによって暗黙的に定義されます。
cxMaxDWORD4+64+64このフォントインスタンスについて、ヒント処理済みのグリフビットマップの最大幅をピクセル単位で指定します。アウトラインには使用されません。
cyMaxDWORD4+68+68このフォントインスタンスについて、ヒント処理済みのグリフビットマップの最大高さをピクセル単位で指定します。アウトラインには使用されません。
cjGlyphMaxDWORD4+72+72このフォントインスタンスについて、ヒント処理済みのグリフの最大サイズをバイト単位で指定します。この値は、そのフォントのいずれかのグリフを格納するために必要な GLYPHBITS 構造体の最大サイズです。
fdxQuantizedFD_XFORM16+76+76FD_XFORM 構造体を指定します。フォントドライバーは、フォントの実現時に実際に使用されるフォント変換をここに設定します。これは、FONTOBJ_pxoGetXform によって定義される、GDI が要求した変換とは異なる場合があります。
lNonLinearExtLeadingINT4+92+9228.4 デバイス単位での非線形の外部レディングです。
lNonLinearIntLeadingINT4+96+9628.4 デバイス単位での非線形の内部レディングです。
lNonLinearMaxCharWidthINT4+100+10028.4 デバイス単位での非線形の最大文字送り量です。
lNonLinearAvgCharWidthINT4+104+10428.4 デバイス単位での非線形の平均文字幅です。
lMinAINT4+108+108このフォントの実現における最大の負の A スペースであり、絶対値で指定されます。
lMinCINT4+112+112このフォントの実現における最大の負の C スペースであり、絶対値で指定されます。
lMinDINT4+116+116このフォントの実現における 0 以外で最小の文字幅です。
alReservedINT4+120+120予約済みであり、フォントプロバイダーは無視する必要があります。

公式ドキュメント

FD_DEVICEMETRICS 構造体は、ドライバーが提供する DrvQueryFontData 関数の iMode パラメーターが QFD_MAXEXTENTS である場合に、デバイス固有のフォント情報を GDI に提供するために使用されます。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// POINTE  (x64 8 / x86 8 バイト)
typedef struct POINTE {
    FLOAT x;
    FLOAT y;
} POINTE;

// POINTL  (x64 8 / x86 8 バイト)
typedef struct POINTL {
    INT x;
    INT y;
} POINTL;

// FD_XFORM  (x64 16 / x86 16 バイト)
typedef struct FD_XFORM {
    FLOAT eXX;
    FLOAT eXY;
    FLOAT eYX;
    FLOAT eYY;
} FD_XFORM;

// FD_DEVICEMETRICS  (x64 124 / x86 124 バイト)
typedef struct FD_DEVICEMETRICS {
    DWORD flRealizedType;
    POINTE pteBase;
    POINTE pteSide;
    INT lD;
    INT fxMaxAscender;
    INT fxMaxDescender;
    POINTL ptlUnderline1;
    POINTL ptlStrikeOut;
    POINTL ptlULThickness;
    POINTL ptlSOThickness;
    DWORD cxMax;
    DWORD cyMax;
    DWORD cjGlyphMax;
    FD_XFORM fdxQuantized;
    INT lNonLinearExtLeading;
    INT lNonLinearIntLeading;
    INT lNonLinearMaxCharWidth;
    INT lNonLinearAvgCharWidth;
    INT lMinA;
    INT lMinC;
    INT lMinD;
    INT alReserved[1];
} FD_DEVICEMETRICS;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct POINTE
{
    public float x;
    public float y;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct POINTL
{
    public int x;
    public int y;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct FD_XFORM
{
    public float eXX;
    public float eXY;
    public float eYX;
    public float eYY;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct FD_DEVICEMETRICS
{
    public uint flRealizedType;
    public POINTE pteBase;
    public POINTE pteSide;
    public int lD;
    public int fxMaxAscender;
    public int fxMaxDescender;
    public POINTL ptlUnderline1;
    public POINTL ptlStrikeOut;
    public POINTL ptlULThickness;
    public POINTL ptlSOThickness;
    public uint cxMax;
    public uint cyMax;
    public uint cjGlyphMax;
    public FD_XFORM fdxQuantized;
    public int lNonLinearExtLeading;
    public int lNonLinearIntLeading;
    public int lNonLinearMaxCharWidth;
    public int lNonLinearAvgCharWidth;
    public int lMinA;
    public int lMinC;
    public int lMinD;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)] public int[] alReserved;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure POINTE
    Public x As Single
    Public y As Single
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure POINTL
    Public x As Integer
    Public y As Integer
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure FD_XFORM
    Public eXX As Single
    Public eXY As Single
    Public eYX As Single
    Public eYY As Single
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure FD_DEVICEMETRICS
    Public flRealizedType As UInteger
    Public pteBase As POINTE
    Public pteSide As POINTE
    Public lD As Integer
    Public fxMaxAscender As Integer
    Public fxMaxDescender As Integer
    Public ptlUnderline1 As POINTL
    Public ptlStrikeOut As POINTL
    Public ptlULThickness As POINTL
    Public ptlSOThickness As POINTL
    Public cxMax As UInteger
    Public cyMax As UInteger
    Public cjGlyphMax As UInteger
    Public fdxQuantized As FD_XFORM
    Public lNonLinearExtLeading As Integer
    Public lNonLinearIntLeading As Integer
    Public lNonLinearMaxCharWidth As Integer
    Public lNonLinearAvgCharWidth As Integer
    Public lMinA As Integer
    Public lMinC As Integer
    Public lMinD As Integer
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=1)> Public alReserved() As Integer
End Structure
import ctypes
from ctypes import wintypes

class POINTE(ctypes.Structure):
    _fields_ = [
        ("x", ctypes.c_float),
        ("y", ctypes.c_float),
    ]

class POINTL(ctypes.Structure):
    _fields_ = [
        ("x", ctypes.c_int),
        ("y", ctypes.c_int),
    ]

class FD_XFORM(ctypes.Structure):
    _fields_ = [
        ("eXX", ctypes.c_float),
        ("eXY", ctypes.c_float),
        ("eYX", ctypes.c_float),
        ("eYY", ctypes.c_float),
    ]

class FD_DEVICEMETRICS(ctypes.Structure):
    _fields_ = [
        ("flRealizedType", wintypes.DWORD),
        ("pteBase", POINTE),
        ("pteSide", POINTE),
        ("lD", ctypes.c_int),
        ("fxMaxAscender", ctypes.c_int),
        ("fxMaxDescender", ctypes.c_int),
        ("ptlUnderline1", POINTL),
        ("ptlStrikeOut", POINTL),
        ("ptlULThickness", POINTL),
        ("ptlSOThickness", POINTL),
        ("cxMax", wintypes.DWORD),
        ("cyMax", wintypes.DWORD),
        ("cjGlyphMax", wintypes.DWORD),
        ("fdxQuantized", FD_XFORM),
        ("lNonLinearExtLeading", ctypes.c_int),
        ("lNonLinearIntLeading", ctypes.c_int),
        ("lNonLinearMaxCharWidth", ctypes.c_int),
        ("lNonLinearAvgCharWidth", ctypes.c_int),
        ("lMinA", ctypes.c_int),
        ("lMinC", ctypes.c_int),
        ("lMinD", ctypes.c_int),
        ("alReserved", ctypes.c_int * 1),
    ]
#[repr(C)]
pub struct POINTE {
    pub x: f32,
    pub y: f32,
}

#[repr(C)]
pub struct POINTL {
    pub x: i32,
    pub y: i32,
}

#[repr(C)]
pub struct FD_XFORM {
    pub eXX: f32,
    pub eXY: f32,
    pub eYX: f32,
    pub eYY: f32,
}

#[repr(C)]
pub struct FD_DEVICEMETRICS {
    pub flRealizedType: u32,
    pub pteBase: POINTE,
    pub pteSide: POINTE,
    pub lD: i32,
    pub fxMaxAscender: i32,
    pub fxMaxDescender: i32,
    pub ptlUnderline1: POINTL,
    pub ptlStrikeOut: POINTL,
    pub ptlULThickness: POINTL,
    pub ptlSOThickness: POINTL,
    pub cxMax: u32,
    pub cyMax: u32,
    pub cjGlyphMax: u32,
    pub fdxQuantized: FD_XFORM,
    pub lNonLinearExtLeading: i32,
    pub lNonLinearIntLeading: i32,
    pub lNonLinearMaxCharWidth: i32,
    pub lNonLinearAvgCharWidth: i32,
    pub lMinA: i32,
    pub lMinC: i32,
    pub lMinD: i32,
    pub alReserved: [i32; 1],
}
import "golang.org/x/sys/windows"

type POINTE struct {
	x float32
	y float32
}

type POINTL struct {
	x int32
	y int32
}

type FD_XFORM struct {
	eXX float32
	eXY float32
	eYX float32
	eYY float32
}

type FD_DEVICEMETRICS struct {
	flRealizedType uint32
	pteBase POINTE
	pteSide POINTE
	lD int32
	fxMaxAscender int32
	fxMaxDescender int32
	ptlUnderline1 POINTL
	ptlStrikeOut POINTL
	ptlULThickness POINTL
	ptlSOThickness POINTL
	cxMax uint32
	cyMax uint32
	cjGlyphMax uint32
	fdxQuantized FD_XFORM
	lNonLinearExtLeading int32
	lNonLinearIntLeading int32
	lNonLinearMaxCharWidth int32
	lNonLinearAvgCharWidth int32
	lMinA int32
	lMinC int32
	lMinD int32
	alReserved [1]int32
}
type
  POINTE = record
    x: Single;
    y: Single;
  end;

  POINTL = record
    x: Integer;
    y: Integer;
  end;

  FD_XFORM = record
    eXX: Single;
    eXY: Single;
    eYX: Single;
    eYY: Single;
  end;

  FD_DEVICEMETRICS = record
    flRealizedType: DWORD;
    pteBase: POINTE;
    pteSide: POINTE;
    lD: Integer;
    fxMaxAscender: Integer;
    fxMaxDescender: Integer;
    ptlUnderline1: POINTL;
    ptlStrikeOut: POINTL;
    ptlULThickness: POINTL;
    ptlSOThickness: POINTL;
    cxMax: DWORD;
    cyMax: DWORD;
    cjGlyphMax: DWORD;
    fdxQuantized: FD_XFORM;
    lNonLinearExtLeading: Integer;
    lNonLinearIntLeading: Integer;
    lNonLinearMaxCharWidth: Integer;
    lNonLinearAvgCharWidth: Integer;
    lMinA: Integer;
    lMinC: Integer;
    lMinD: Integer;
    alReserved: array[0..0] of Integer;
  end;
const POINTE = extern struct {
    x: f32,
    y: f32,
};

const POINTL = extern struct {
    x: i32,
    y: i32,
};

const FD_XFORM = extern struct {
    eXX: f32,
    eXY: f32,
    eYX: f32,
    eYY: f32,
};

const FD_DEVICEMETRICS = extern struct {
    flRealizedType: u32,
    pteBase: POINTE,
    pteSide: POINTE,
    lD: i32,
    fxMaxAscender: i32,
    fxMaxDescender: i32,
    ptlUnderline1: POINTL,
    ptlStrikeOut: POINTL,
    ptlULThickness: POINTL,
    ptlSOThickness: POINTL,
    cxMax: u32,
    cyMax: u32,
    cjGlyphMax: u32,
    fdxQuantized: FD_XFORM,
    lNonLinearExtLeading: i32,
    lNonLinearIntLeading: i32,
    lNonLinearMaxCharWidth: i32,
    lNonLinearAvgCharWidth: i32,
    lMinA: i32,
    lMinC: i32,
    lMinD: i32,
    alReserved: [1]i32,
};
type
  POINTE {.bycopy.} = object
    x: float32
    y: float32

  POINTL {.bycopy.} = object
    x: int32
    y: int32

  FD_XFORM {.bycopy.} = object
    eXX: float32
    eXY: float32
    eYX: float32
    eYY: float32

  FD_DEVICEMETRICS {.bycopy.} = object
    flRealizedType: uint32
    pteBase: POINTE
    pteSide: POINTE
    lD: int32
    fxMaxAscender: int32
    fxMaxDescender: int32
    ptlUnderline1: POINTL
    ptlStrikeOut: POINTL
    ptlULThickness: POINTL
    ptlSOThickness: POINTL
    cxMax: uint32
    cyMax: uint32
    cjGlyphMax: uint32
    fdxQuantized: FD_XFORM
    lNonLinearExtLeading: int32
    lNonLinearIntLeading: int32
    lNonLinearMaxCharWidth: int32
    lNonLinearAvgCharWidth: int32
    lMinA: int32
    lMinC: int32
    lMinD: int32
    alReserved: array[1, int32]
struct POINTE
{
    float x;
    float y;
}

struct POINTL
{
    int x;
    int y;
}

struct FD_XFORM
{
    float eXX;
    float eXY;
    float eYX;
    float eYY;
}

struct FD_DEVICEMETRICS
{
    uint flRealizedType;
    POINTE pteBase;
    POINTE pteSide;
    int lD;
    int fxMaxAscender;
    int fxMaxDescender;
    POINTL ptlUnderline1;
    POINTL ptlStrikeOut;
    POINTL ptlULThickness;
    POINTL ptlSOThickness;
    uint cxMax;
    uint cyMax;
    uint cjGlyphMax;
    FD_XFORM fdxQuantized;
    int lNonLinearExtLeading;
    int lNonLinearIntLeading;
    int lNonLinearMaxCharWidth;
    int lNonLinearAvgCharWidth;
    int lMinA;
    int lMinC;
    int lMinD;
    int[1] alReserved;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; FD_DEVICEMETRICS サイズ: 124 バイト(x64)
dim st, 31    ; 4byte整数×31(構造体サイズ 124 / 4 切り上げ)
; flRealizedType : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; pteBase : POINTE (+4, 8byte)  varptr(st)+4 を基点に操作(8byte:入れ子/配列)
; pteSide : POINTE (+12, 8byte)  varptr(st)+12 を基点に操作(8byte:入れ子/配列)
; lD : INT (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; fxMaxAscender : INT (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; fxMaxDescender : INT (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; ptlUnderline1 : POINTL (+32, 8byte)  varptr(st)+32 を基点に操作(8byte:入れ子/配列)
; ptlStrikeOut : POINTL (+40, 8byte)  varptr(st)+40 を基点に操作(8byte:入れ子/配列)
; ptlULThickness : POINTL (+48, 8byte)  varptr(st)+48 を基点に操作(8byte:入れ子/配列)
; ptlSOThickness : POINTL (+56, 8byte)  varptr(st)+56 を基点に操作(8byte:入れ子/配列)
; cxMax : DWORD (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; cyMax : DWORD (+68, 4byte)  st.17 = 値  /  値 = st.17   (lpoke/lpeek も可)
; cjGlyphMax : DWORD (+72, 4byte)  st.18 = 値  /  値 = st.18   (lpoke/lpeek も可)
; fdxQuantized : FD_XFORM (+76, 16byte)  varptr(st)+76 を基点に操作(16byte:入れ子/配列)
; lNonLinearExtLeading : INT (+92, 4byte)  st.23 = 値  /  値 = st.23   (lpoke/lpeek も可)
; lNonLinearIntLeading : INT (+96, 4byte)  st.24 = 値  /  値 = st.24   (lpoke/lpeek も可)
; lNonLinearMaxCharWidth : INT (+100, 4byte)  st.25 = 値  /  値 = st.25   (lpoke/lpeek も可)
; lNonLinearAvgCharWidth : INT (+104, 4byte)  st.26 = 値  /  値 = st.26   (lpoke/lpeek も可)
; lMinA : INT (+108, 4byte)  st.27 = 値  /  値 = st.27   (lpoke/lpeek も可)
; lMinC : INT (+112, 4byte)  st.28 = 値  /  値 = st.28   (lpoke/lpeek も可)
; lMinD : INT (+116, 4byte)  st.29 = 値  /  値 = st.29   (lpoke/lpeek も可)
; alReserved : INT (+120, 4byte)  varptr(st)+120 を基点に操作(4byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global POINTE
    #field float x
    #field float y
#endstruct

#defstruct global POINTL
    #field int x
    #field int y
#endstruct

#defstruct global FD_XFORM
    #field float eXX
    #field float eXY
    #field float eYX
    #field float eYY
#endstruct

#defstruct global FD_DEVICEMETRICS
    #field int flRealizedType
    #field POINTE pteBase
    #field POINTE pteSide
    #field int lD
    #field int fxMaxAscender
    #field int fxMaxDescender
    #field POINTL ptlUnderline1
    #field POINTL ptlStrikeOut
    #field POINTL ptlULThickness
    #field POINTL ptlSOThickness
    #field int cxMax
    #field int cyMax
    #field int cjGlyphMax
    #field FD_XFORM fdxQuantized
    #field int lNonLinearExtLeading
    #field int lNonLinearIntLeading
    #field int lNonLinearMaxCharWidth
    #field int lNonLinearAvgCharWidth
    #field int lMinA
    #field int lMinC
    #field int lMinD
    #field int alReserved 1
#endstruct

stdim st, FD_DEVICEMETRICS        ; NSTRUCT 変数を確保
st->flRealizedType = 100
mes "flRealizedType=" + st->flRealizedType