GetTextExtentPointI
関数シグネチャ
// GDI32.dll
#include <windows.h>
BOOL GetTextExtentPointI(
HDC hdc,
WORD* pgiIn,
INT cgi,
SIZE* psize
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| hdc | HDC | in | デバイスコンテキストへのハンドル。 |
| pgiIn | WORD* | in | グリフインデックスの配列へのポインター。 |
| cgi | INT | in | グリフインデックスの数を指定します。 |
| psize | SIZE* | out | 文字列の寸法を論理単位で受け取る SIZE 構造体へのポインター。 |
戻り値の型: BOOL
公式ドキュメント
GetTextExtentPointI 関数は、指定されたグリフインデックスの配列の幅と高さを計算します。
戻り値
関数が成功した場合、戻り値は 0 以外です。
関数が失敗した場合、戻り値は 0 です。
解説(Remarks)
GetTextExtentPointI 関数は、現在選択されているフォントを使用して、グリフインデックスの配列の寸法を計算します。幅と高さは論理単位で、クリッピングを考慮せずに計算されます。
この関数がテキストの範囲を返すとき、テキストが水平である、すなわちエスケープメントが常に 0 であると仮定します。これはテキストの水平方向と垂直方向の両方の測定に当てはまります。0 以外のエスケープメントを指定するフォントを使用した場合でも、この関数はテキストの範囲を計算する際にその角度を使用しません。アプリケーションが明示的に変換する必要があります。ただし、グラフィックスモードが GM_ADVANCED に設定され、文字の向きが印刷の向きから 90 度回転している場合、この関数が返す値はこの規則に従いません。特定の文字列について文字の向きと印刷の向きが一致する場合、この関数は SIZE 構造体に文字列の寸法を { cx : 116, cy : 18 } として返します。同じ文字列について文字の向きと印刷の向きが 90 度離れている場合、この関数は SIZE 構造体に文字列の寸法を { cx : 18, cy : 116 } として返します。
一部のデバイスは文字のカーニングを行うため、個々のグリフインデックスの範囲の合計が、グリフインデックスの配列全体の範囲と等しくならない場合があります。
計算される文字列の幅には、SetTextCharacterExtra 関数によって設定された文字間隔が考慮されます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// GDI32.dll
#include <windows.h>
BOOL GetTextExtentPointI(
HDC hdc,
WORD* pgiIn,
INT cgi,
SIZE* psize
);[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("GDI32.dll", ExactSpelling = true)]
static extern bool GetTextExtentPointI(
IntPtr hdc, // HDC
ref ushort pgiIn, // WORD*
int cgi, // INT
IntPtr psize // SIZE* out
);<DllImport("GDI32.dll", ExactSpelling:=True)>
Public Shared Function GetTextExtentPointI(
hdc As IntPtr, ' HDC
ByRef pgiIn As UShort, ' WORD*
cgi As Integer, ' INT
psize As IntPtr ' SIZE* out
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function' hdc : HDC
' pgiIn : WORD*
' cgi : INT
' psize : SIZE* out
Declare PtrSafe Function GetTextExtentPointI Lib "gdi32" ( _
ByVal hdc As LongPtr, _
ByRef pgiIn As Integer, _
ByVal cgi As Long, _
ByVal psize As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
GetTextExtentPointI = ctypes.windll.gdi32.GetTextExtentPointI
GetTextExtentPointI.restype = wintypes.BOOL
GetTextExtentPointI.argtypes = [
wintypes.HANDLE, # hdc : HDC
ctypes.POINTER(ctypes.c_ushort), # pgiIn : WORD*
ctypes.c_int, # cgi : INT
ctypes.c_void_p, # psize : SIZE* out
]require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('GDI32.dll')
GetTextExtentPointI = Fiddle::Function.new(
lib['GetTextExtentPointI'],
[
Fiddle::TYPE_VOIDP, # hdc : HDC
Fiddle::TYPE_VOIDP, # pgiIn : WORD*
Fiddle::TYPE_INT, # cgi : INT
Fiddle::TYPE_VOIDP, # psize : SIZE* out
],
Fiddle::TYPE_INT)#[link(name = "gdi32")]
extern "system" {
fn GetTextExtentPointI(
hdc: *mut core::ffi::c_void, // HDC
pgiIn: *mut u16, // WORD*
cgi: i32, // INT
psize: *mut SIZE // SIZE* out
) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("GDI32.dll")]
public static extern bool GetTextExtentPointI(IntPtr hdc, ref ushort pgiIn, int cgi, IntPtr psize);
"@
$api = Add-Type -MemberDefinition $sig -Name 'GDI32_GetTextExtentPointI' -Namespace Win32 -PassThru
# $api::GetTextExtentPointI(hdc, pgiIn, cgi, psize)#uselib "GDI32.dll"
#func global GetTextExtentPointI "GetTextExtentPointI" sptr, sptr, sptr, sptr
; GetTextExtentPointI hdc, varptr(pgiIn), cgi, varptr(psize) ; 戻り値は stat
; hdc : HDC -> "sptr"
; pgiIn : WORD* -> "sptr"
; cgi : INT -> "sptr"
; psize : SIZE* out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "GDI32.dll" #cfunc global GetTextExtentPointI "GetTextExtentPointI" sptr, var, int, var ; res = GetTextExtentPointI(hdc, pgiIn, cgi, psize) ; hdc : HDC -> "sptr" ; pgiIn : WORD* -> "var" ; cgi : INT -> "int" ; psize : SIZE* out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "GDI32.dll" #cfunc global GetTextExtentPointI "GetTextExtentPointI" sptr, sptr, int, sptr ; res = GetTextExtentPointI(hdc, varptr(pgiIn), cgi, varptr(psize)) ; hdc : HDC -> "sptr" ; pgiIn : WORD* -> "sptr" ; cgi : INT -> "int" ; psize : SIZE* out -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
; BOOL GetTextExtentPointI(HDC hdc, WORD* pgiIn, INT cgi, SIZE* psize) #uselib "GDI32.dll" #cfunc global GetTextExtentPointI "GetTextExtentPointI" intptr, var, int, var ; res = GetTextExtentPointI(hdc, pgiIn, cgi, psize) ; hdc : HDC -> "intptr" ; pgiIn : WORD* -> "var" ; cgi : INT -> "int" ; psize : SIZE* out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; BOOL GetTextExtentPointI(HDC hdc, WORD* pgiIn, INT cgi, SIZE* psize) #uselib "GDI32.dll" #cfunc global GetTextExtentPointI "GetTextExtentPointI" intptr, intptr, int, intptr ; res = GetTextExtentPointI(hdc, varptr(pgiIn), cgi, varptr(psize)) ; hdc : HDC -> "intptr" ; pgiIn : WORD* -> "intptr" ; cgi : INT -> "int" ; psize : SIZE* out -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
gdi32 = windows.NewLazySystemDLL("GDI32.dll")
procGetTextExtentPointI = gdi32.NewProc("GetTextExtentPointI")
)
// hdc (HDC), pgiIn (WORD*), cgi (INT), psize (SIZE* out)
r1, _, err := procGetTextExtentPointI.Call(
uintptr(hdc),
uintptr(pgiIn),
uintptr(cgi),
uintptr(psize),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // BOOLfunction GetTextExtentPointI(
hdc: THandle; // HDC
pgiIn: Pointer; // WORD*
cgi: Integer; // INT
psize: Pointer // SIZE* out
): BOOL; stdcall;
external 'GDI32.dll' name 'GetTextExtentPointI';result := DllCall("GDI32\GetTextExtentPointI"
, "Ptr", hdc ; HDC
, "Ptr", pgiIn ; WORD*
, "Int", cgi ; INT
, "Ptr", psize ; SIZE* out
, "Int") ; return: BOOL●GetTextExtentPointI(hdc, pgiIn, cgi, psize) = DLL("GDI32.dll", "bool GetTextExtentPointI(void*, void*, int, void*)")
# 呼び出し: GetTextExtentPointI(hdc, pgiIn, cgi, psize)
# hdc : HDC -> "void*"
# pgiIn : WORD* -> "void*"
# cgi : INT -> "int"
# psize : SIZE* out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "gdi32" fn GetTextExtentPointI(
hdc: ?*anyopaque, // HDC
pgiIn: [*c]u16, // WORD*
cgi: i32, // INT
psize: [*c]SIZE // SIZE* out
) callconv(std.os.windows.WINAPI) i32;proc GetTextExtentPointI(
hdc: pointer, # HDC
pgiIn: ptr uint16, # WORD*
cgi: int32, # INT
psize: ptr SIZE # SIZE* out
): int32 {.importc: "GetTextExtentPointI", stdcall, dynlib: "GDI32.dll".}pragma(lib, "gdi32");
extern(Windows)
int GetTextExtentPointI(
void* hdc, // HDC
ushort* pgiIn, // WORD*
int cgi, // INT
SIZE* psize // SIZE* out
);ccall((:GetTextExtentPointI, "GDI32.dll"), stdcall, Int32,
(Ptr{Cvoid}, Ptr{UInt16}, Int32, Ptr{SIZE}),
hdc, pgiIn, cgi, psize)
# hdc : HDC -> Ptr{Cvoid}
# pgiIn : WORD* -> Ptr{UInt16}
# cgi : INT -> Int32
# psize : SIZE* out -> Ptr{SIZE}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
int32_t GetTextExtentPointI(
void* hdc,
uint16_t* pgiIn,
int32_t cgi,
void* psize);
]]
local gdi32 = ffi.load("gdi32")
-- gdi32.GetTextExtentPointI(hdc, pgiIn, cgi, psize)
-- hdc : HDC
-- pgiIn : WORD*
-- cgi : INT
-- psize : SIZE* out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('GDI32.dll');
const GetTextExtentPointI = lib.func('__stdcall', 'GetTextExtentPointI', 'int32_t', ['void *', 'uint16_t *', 'int32_t', 'void *']);
// GetTextExtentPointI(hdc, pgiIn, cgi, psize)
// hdc : HDC -> 'void *'
// pgiIn : WORD* -> 'uint16_t *'
// cgi : INT -> 'int32_t'
// psize : SIZE* out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("GDI32.dll", {
GetTextExtentPointI: { parameters: ["pointer", "pointer", "i32", "pointer"], result: "i32" },
});
// lib.symbols.GetTextExtentPointI(hdc, pgiIn, cgi, psize)
// hdc : HDC -> "pointer"
// pgiIn : WORD* -> "pointer"
// cgi : INT -> "i32"
// psize : SIZE* out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
int32_t GetTextExtentPointI(
void* hdc,
uint16_t* pgiIn,
int32_t cgi,
void* psize);
C, "GDI32.dll");
// $ffi->GetTextExtentPointI(hdc, pgiIn, cgi, psize);
// hdc : HDC
// pgiIn : WORD*
// cgi : INT
// psize : SIZE* out
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;
public interface Gdi32 extends StdCallLibrary {
Gdi32 INSTANCE = Native.load("gdi32", Gdi32.class);
boolean GetTextExtentPointI(
Pointer hdc, // HDC
ShortByReference pgiIn, // WORD*
int cgi, // INT
Pointer psize // SIZE* out
);
}@[Link("gdi32")]
lib LibGDI32
fun GetTextExtentPointI = GetTextExtentPointI(
hdc : Void*, # HDC
pgiIn : UInt16*, # WORD*
cgi : Int32, # INT
psize : SIZE* # SIZE* out
) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef GetTextExtentPointINative = Int32 Function(Pointer<Void>, Pointer<Uint16>, Int32, Pointer<Void>);
typedef GetTextExtentPointIDart = int Function(Pointer<Void>, Pointer<Uint16>, int, Pointer<Void>);
final GetTextExtentPointI = DynamicLibrary.open('GDI32.dll')
.lookupFunction<GetTextExtentPointINative, GetTextExtentPointIDart>('GetTextExtentPointI');
// hdc : HDC -> Pointer<Void>
// pgiIn : WORD* -> Pointer<Uint16>
// cgi : INT -> Int32
// psize : SIZE* out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function GetTextExtentPointI(
hdc: THandle; // HDC
pgiIn: Pointer; // WORD*
cgi: Integer; // INT
psize: Pointer // SIZE* out
): BOOL; stdcall;
external 'GDI32.dll' name 'GetTextExtentPointI';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "GetTextExtentPointI"
c_GetTextExtentPointI :: Ptr () -> Ptr Word16 -> Int32 -> Ptr () -> IO CInt
-- hdc : HDC -> Ptr ()
-- pgiIn : WORD* -> Ptr Word16
-- cgi : INT -> Int32
-- psize : SIZE* out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let gettextextentpointi =
foreign "GetTextExtentPointI"
((ptr void) @-> (ptr uint16_t) @-> int32_t @-> (ptr void) @-> returning int32_t)
(* hdc : HDC -> (ptr void) *)
(* pgiIn : WORD* -> (ptr uint16_t) *)
(* cgi : INT -> int32_t *)
(* psize : SIZE* out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library gdi32 (t "GDI32.dll"))
(cffi:use-foreign-library gdi32)
(cffi:defcfun ("GetTextExtentPointI" get-text-extent-point-i :convention :stdcall) :int32
(hdc :pointer) ; HDC
(pgi-in :pointer) ; WORD*
(cgi :int32) ; INT
(psize :pointer)) ; SIZE* out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $GetTextExtentPointI = Win32::API::More->new('GDI32',
'BOOL GetTextExtentPointI(HANDLE hdc, LPVOID pgiIn, int cgi, LPVOID psize)');
# my $ret = $GetTextExtentPointI->Call($hdc, $pgiIn, $cgi, $psize);
# hdc : HDC -> HANDLE
# pgiIn : WORD* -> LPVOID
# cgi : INT -> int
# psize : SIZE* out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。関連項目
- f GetTextExtentPointW — 文字列を描画した際の寸法を取得する。
- f GetTextExtentPoint32W — 文字列を描画した際の幅と高さを取得する。
- f SetTextCharacterExtra — 文字間に追加する間隔量を設定する。