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実現されたフォントの種別を示すフラグ。
pteBasePOINTE8+4+4ベースライン方向の単位ベクトル(POINTE)。
pteSidePOINTE8+12+12サイド(縦方向)の単位ベクトル。
lDINT4+20+20フォントのデバイス単位スケール値。
fxMaxAscenderINT4+24+24最大アセンダー高(固定小数点)。
fxMaxDescenderINT4+28+28最大ディセンダー深(固定小数点)。
ptlUnderline1POINTL8+32+32下線位置を表す点(POINTL)。
ptlStrikeOutPOINTL8+40+40取り消し線位置を表す点。
ptlULThicknessPOINTL8+48+48下線の太さベクトル。
ptlSOThicknessPOINTL8+56+56取り消し線の太さベクトル。
cxMaxDWORD4+64+64最大グリフ幅(ピクセル)。
cyMaxDWORD4+68+68最大グリフ高(ピクセル)。
cjGlyphMaxDWORD4+72+721グリフビットマップの最大バイトサイズ。
fdxQuantizedFD_XFORM16+76+76量子化された変換行列(FD_XFORM)。
lNonLinearExtLeadingINT4+92+92非線形外部レディング(行外間隔)。
lNonLinearIntLeadingINT4+96+96非線形内部レディング(行内間隔)。
lNonLinearMaxCharWidthINT4+100+100非線形の最大文字幅。
lNonLinearAvgCharWidthINT4+104+104非線形の平均文字幅。
lMinAINT4+108+108最小Aスペース(左サイドベアリング)。
lMinCINT4+112+112最小Cスペース(右サイドベアリング)。
lMinDINT4+116+116最小D(文字送り)値。
alReservedINT4+120+120将来の拡張用に予約された配列。

各言語での定義

#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