Win32 API 日本語リファレンス
ホームGraphics.Gdi › GetDeviceCaps

GetDeviceCaps

関数
デバイスの能力や属性情報を取得する。
DLLGDI32.dll呼出規約winapi対応OSWindows 2000 以降

シグネチャ

// GDI32.dll
#include <windows.h>

INT GetDeviceCaps(
    HDC hdc,   // optional
    INT index
);

パラメーター

名前方向説明
hdcHDCinoptionalDC へのハンドル。
indexINTin

返す項目。このパラメーターには、次のいずれかの値を指定できます。

Index 意味
DRIVERVERSION
デバイスドライバーのバージョン。
TECHNOLOGY
デバイスの技術。次のいずれかの値になります。
DT_PLOTTER ベクタープロッター
DT_RASDISPLAY ラスターディスプレイ
DT_RASPRINTER ラスタープリンター
DT_RASCAMERA ラスターカメラ
DT_CHARSTREAM 文字ストリーム
DT_METAFILE メタファイル
DT_DISPFILE ディスプレイファイル

hdc パラメーターが拡張メタファイルの DC へのハンドルである場合、デバイスの技術は CreateEnhMetaFile 関数に指定された参照先デバイスの技術になります。拡張メタファイルの DC であるかどうかを判定するには、GetObjectType 関数を使用します。

HORZSIZE
物理画面の幅(ミリメートル単位)。
VERTSIZE
物理画面の高さ(ミリメートル単位)。
HORZRES
画面の幅(ピクセル単位)。プリンターの場合は、ページの印刷可能領域の幅(ピクセル単位)。
VERTRES
画面の高さ(ラスターライン単位)。プリンターの場合は、ページの印刷可能領域の高さ(ピクセル単位)。
LOGPIXELSX
画面の幅方向における論理インチあたりのピクセル数。複数のディスプレイモニターを備えるシステムでは、この値はすべてのモニターで同じになります。
LOGPIXELSY
画面の高さ方向における論理インチあたりのピクセル数。複数のディスプレイモニターを備えるシステムでは、この値はすべてのモニターで同じになります。
BITSPIXEL
1 ピクセルあたりの隣接する色ビット数。
PLANES
カラープレーン数。
NUMBRUSHES
デバイス固有のブラシの数。
NUMPENS
デバイス固有のペンの数。
NUMFONTS
デバイス固有のフォントの数。
NUMCOLORS
デバイスのカラーテーブルのエントリ数(デバイスの色深度が 1 ピクセルあたり 8 ビット以下の場合)。これより色深度が大きいデバイスでは -1 が返されます。
ASPECTX
線の描画に使用されるデバイスピクセルの相対的な幅。
ASPECTY
線の描画に使用されるデバイスピクセルの相対的な高さ。
ASPECTXY
線の描画に使用されるデバイスピクセルの対角線方向の幅。
PDEVICESIZE
予約済み。
CLIPCAPS
デバイスのクリッピング機能を示すフラグ。デバイスが矩形にクリップできる場合は 1、できない場合は 0 になります。
SIZEPALETTE
システムパレットのエントリ数。このインデックスは、デバイスドライバーが RASTERCAPS インデックスで RC_PALETTE ビットを設定している場合にのみ有効であり、ドライバーが 16 ビット Windows と互換性がある場合にのみ利用できます。
NUMRESERVED
システムパレットの予約済みエントリ数。このインデックスは、デバイスドライバーが RASTERCAPS インデックスで RC_PALETTE ビットを設定している場合にのみ有効であり、ドライバーが 16 ビット Windows と互換性がある場合にのみ利用できます。
COLORRES
デバイスの実際の色解像度(1 ピクセルあたりのビット数)。このインデックスは、デバイスドライバーが RASTERCAPS インデックスで RC_PALETTE ビットを設定している場合にのみ有効であり、ドライバーが 16 ビット Windows と互換性がある場合にのみ利用できます。
PHYSICALWIDTH
印刷デバイスの場合: 物理ページの幅(デバイス単位)。たとえば、8.5×11 インチの用紙に 600 dpi で印刷するよう設定されたプリンターの物理幅の値は 5100 デバイス単位になります。物理ページはほとんどの場合、ページの印刷可能領域より大きく、それより小さくなることはありません。
PHYSICALHEIGHT
印刷デバイスの場合: 物理ページの高さ(デバイス単位)。たとえば、8.5×11 インチの用紙に 600 dpi で印刷するよう設定されたプリンターの物理高さの値は 6600 デバイス単位になります。物理ページはほとんどの場合、ページの印刷可能領域より大きく、それより小さくなることはありません。
PHYSICALOFFSETX
印刷デバイスの場合: 物理ページの左端から印刷可能領域の左端までの距離(デバイス単位)。たとえば、8.5×11 インチの用紙に 600 dpi で印刷するよう設定され、用紙の左端から 0.25 インチに印刷できないプリンターの水平方向の物理オフセットは 150 デバイス単位になります。
PHYSICALOFFSETY
印刷デバイスの場合: 物理ページの上端から印刷可能領域の上端までの距離(デバイス単位)。たとえば、8.5×11 インチの用紙に 600 dpi で印刷するよう設定され、用紙の上端から 0.5 インチに印刷できないプリンターの垂直方向の物理オフセットは 300 デバイス単位になります。
VREFRESH
ディスプレイデバイスの場合: デバイスの現在の垂直リフレッシュレート(1 秒あたりのサイクル数、Hz)。

垂直リフレッシュレートの値 0 または 1 は、ディスプレイハードウェアの既定のリフレッシュレートを表します。この既定のレートは通常、ディスプレイカードやコンピューターのマザーボード上のスイッチによって、または ChangeDisplaySettings などのディスプレイ関数を使用しない構成プログラムによって設定されます。

SCALINGFACTORX
プリンターの x 軸のスケーリング係数。
SCALINGFACTORY
プリンターの y 軸のスケーリング係数。
BLTALIGNMENT
推奨される水平方向の描画アラインメント(ピクセルの倍数で表現)。最適な描画パフォーマンスを得るには、ウィンドウをこの値の倍数に水平方向に揃える必要があります。値が 0 の場合は、デバイスがアクセラレートされており、任意のアラインメントを使用できることを示します。
SHADEBLENDCAPS
デバイスのシェーディングおよびブレンディング機能を示す値。詳細は「解説」を参照してください。
SB_CONST_ALPHA BLENDFUNCTION 構造体の SourceConstantAlpha メンバーを処理できます。このメンバーは AlphaBlend 関数の blendFunction パラメーターから参照されます。
SB_GRAD_RECT GradientFill による矩形の描画が可能です。
SB_GRAD_TRI GradientFill による三角形の描画が可能です。
SB_NONE デバイスはこれらの機能をいずれもサポートしていません。
SB_PIXEL_ALPHA AlphaBlend でピクセル単位のアルファを処理できます。
SB_PREMULT_ALPHA AlphaBlend で乗算済みアルファを処理できます。
RASTERCAPS
次の表に示すように、デバイスのラスター機能を示す値。
RC_BANDING バンディングのサポートが必要です。
RC_BITBLT ビットマップの転送が可能です。
RC_BITMAP64 64 KB を超えるビットマップをサポートできます。
RC_DI_BITMAP SetDIBits および GetDIBits 関数をサポートできます。
RC_DIBTODEV SetDIBitsToDevice 関数をサポートできます。
RC_FLOODFILL フラッドフィルを実行できます。
RC_PALETTE パレットベースのデバイスであることを示します。
RC_SCALING スケーリングが可能です。
RC_STRETCHBLT StretchBlt 関数を実行できます。
RC_STRETCHDIB StretchDIBits 関数を実行できます。
CURVECAPS
次の表に示すように、デバイスの曲線描画機能を示す値。
CC_NONE デバイスは曲線をサポートしていません。
CC_CHORD デバイスは弦弧を描画できます。
CC_CIRCLES デバイスは円を描画できます。
CC_ELLIPSES デバイスは楕円を描画できます。
CC_INTERIORS デバイスは内部を描画できます。
CC_PIE デバイスは扇形を描画できます。
CC_ROUNDRECT デバイスは角丸矩形を描画できます。
CC_STYLED デバイスはスタイル付きの境界線を描画できます。
CC_WIDE デバイスは太い境界線を描画できます。
CC_WIDESTYLED デバイスは太くてスタイル付きの境界線を描画できます。
LINECAPS
次の表に示すように、デバイスの線描画機能を示す値。
LC_NONE デバイスは線をサポートしていません。
LC_INTERIORS デバイスは内部を描画できます。
LC_MARKER デバイスはマーカーを描画できます。
LC_POLYLINE デバイスはポリラインを描画できます。
LC_POLYMARKER デバイスは複数のマーカーを描画できます。
LC_STYLED デバイスはスタイル付きの線を描画できます。
LC_WIDE デバイスは太い線を描画できます。
LC_WIDESTYLED デバイスは太くてスタイル付きの線を描画できます。
POLYGONALCAPS
次の表に示すように、デバイスの多角形描画機能を示す値。
PC_NONE デバイスは多角形をサポートしていません。
PC_INTERIORS デバイスは内部を描画できます。
PC_POLYGON デバイスは交互塗りつぶしの多角形を描画できます。
PC_RECTANGLE デバイスは矩形を描画できます。
PC_SCANLINE デバイスは単一のスキャンラインを描画できます。
PC_STYLED デバイスはスタイル付きの境界線を描画できます。
PC_WIDE デバイスは太い境界線を描画できます。
PC_WIDESTYLED デバイスは太くてスタイル付きの境界線を描画できます。
PC_WINDPOLYGON デバイスはワインディング塗りつぶしの多角形を描画できます。
TEXTCAPS
次の表に示すように、デバイスのテキスト描画機能を示す値。
TC_OP_CHARACTER デバイスは文字出力精度に対応しています。
TC_OP_STROKE デバイスはストローク出力精度に対応しています。
TC_CP_STROKE デバイスはストローククリップ精度に対応しています。
TC_CR_90 デバイスは 90 度の文字回転に対応しています。
TC_CR_ANY デバイスは任意の文字回転に対応しています。
TC_SF_X_YINDEP デバイスは x 方向と y 方向で独立してスケーリングできます。
TC_SA_DOUBLE デバイスはスケーリング用に文字を 2 倍にできます。
TC_SA_INTEGER デバイスは文字のスケーリングに整数倍のみを使用します。
TC_SA_CONTIN デバイスは正確な文字スケーリングに任意の倍率を使用します。
TC_EA_DOUBLE デバイスは太字(ダブルウェイト)の文字を描画できます。
TC_IA_ABLE デバイスは斜体にできます。
TC_UA_ABLE デバイスは下線を付けられます。
TC_SO_ABLE デバイスは取り消し線を描画できます。
TC_RA_ABLE デバイスはラスターフォントを描画できます。
TC_VA_ABLE デバイスはベクターフォントを描画できます。
TC_RESERVED 予約済み。0 でなければなりません。
TC_SCROLLBLT デバイスはビットブロック転送を使用したスクロールができません。この意味は予想とは逆である可能性がある点に注意してください。
COLORMGMTCAPS
デバイスのカラーマネジメント機能を示す値。
CM_CMYK_COLOR デバイスは CMYK 色空間の ICC カラープロファイルを受け入れることができます。
CM_DEVICE_ICM デバイスはデバイスドライバーまたはデバイス自体のいずれかで ICM を実行できます。
CM_GAMMA_RAMP デバイスは GetDeviceGammaRamp および SetDeviceGammaRamp をサポートします
CM_NONE デバイスは ICM をサポートしていません。

戻り値の型: INT

公式ドキュメント

GetDeviceCaps 関数は、指定したデバイスについてデバイス固有の情報を取得します。

戻り値

戻り値は、目的の項目の値を示します。

nIndex が BITSPIXEL で、デバイスが 15bpp または 16bpp の場合、戻り値は 16 になります。

解説(Remarks)

nIndex が SHADEBLENDCAPS の場合:

複数モニターシステムでは、hdc がデスクトップの場合、GetDeviceCaps はプライマリモニターの機能を返します。他のモニターの情報が必要な場合は、マルチモニター API または CreateDC を使用して、特定のモニターのデバイスコンテキスト(DC)の HDC を取得する必要があります。
注意 通常、Display1 がプライマリモニターですが、常にそうとは限りません。
GetDeviceCaps は、プリンターエスケープの代わりに次の 6 つのインデックスを提供します。
Index 置き換えられるプリンターエスケープ
PHYSICALWIDTH GETPHYSPAGESIZE
PHYSICALHEIGHT GETPHYSPAGESIZE
PHYSICALOFFSETX GETPRINTINGOFFSET
PHYSICALOFFSETY GETPHYSICALOFFSET
SCALINGFACTORX GETSCALINGFACTOR
SCALINGFACTORY GETSCALINGFACTOR
注意 GetDeviceCaps は、ディスプレイドライバーが提供する情報を報告します。ディスプレイドライバーが情報の報告を拒否した場合、GetDeviceCaps は固定の計算に基づいて情報を算出します。ディスプレイドライバーが無効な情報を報告した場合、GetDeviceCaps はその無効な情報を返します。また、ディスプレイドライバーが情報の報告を拒否した場合、GetDeviceCaps は固定の DPI(96 DPI)または固定のサイズ(ディスプレイドライバーが提供した情報・提供しなかった情報に応じて)のいずれかを前提とするため、誤った情報を算出する可能性があります。残念ながら、Windows ディスプレイドライバーモデル(WDDM)(Windows Vista で導入)に基づいて実装されたディスプレイドライバーでは GDI が情報を取得できなくなるため、GetDeviceCaps は常に情報を算出する必要があります。

例については、Preparing to Print を参照してください。

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

各言語での呼び出し定義

// GDI32.dll
#include <windows.h>

INT GetDeviceCaps(
    HDC hdc,   // optional
    INT index
);
[DllImport("GDI32.dll", ExactSpelling = true)]
static extern int GetDeviceCaps(
    IntPtr hdc,   // HDC optional
    int index   // INT
);
<DllImport("GDI32.dll", ExactSpelling:=True)>
Public Shared Function GetDeviceCaps(
    hdc As IntPtr,   ' HDC optional
    index As Integer   ' INT
) As Integer
End Function
' hdc : HDC optional
' index : INT
Declare PtrSafe Function GetDeviceCaps Lib "gdi32" ( _
    ByVal hdc As LongPtr, _
    ByVal index As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

GetDeviceCaps = ctypes.windll.gdi32.GetDeviceCaps
GetDeviceCaps.restype = ctypes.c_int
GetDeviceCaps.argtypes = [
    wintypes.HANDLE,  # hdc : HDC optional
    ctypes.c_int,  # index : INT
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('GDI32.dll')
GetDeviceCaps = Fiddle::Function.new(
  lib['GetDeviceCaps'],
  [
    Fiddle::TYPE_VOIDP,  # hdc : HDC optional
    Fiddle::TYPE_INT,  # index : INT
  ],
  Fiddle::TYPE_INT)
#[link(name = "gdi32")]
extern "system" {
    fn GetDeviceCaps(
        hdc: *mut core::ffi::c_void,  // HDC optional
        index: i32  // INT
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("GDI32.dll")]
public static extern int GetDeviceCaps(IntPtr hdc, int index);
"@
$api = Add-Type -MemberDefinition $sig -Name 'GDI32_GetDeviceCaps' -Namespace Win32 -PassThru
# $api::GetDeviceCaps(hdc, index)
#uselib "GDI32.dll"
#func global GetDeviceCaps "GetDeviceCaps" sptr, sptr
; GetDeviceCaps hdc, index   ; 戻り値は stat
; hdc : HDC optional -> "sptr"
; index : INT -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
#uselib "GDI32.dll"
#cfunc global GetDeviceCaps "GetDeviceCaps" sptr, int
; res = GetDeviceCaps(hdc, index)
; hdc : HDC optional -> "sptr"
; index : INT -> "int"
; INT GetDeviceCaps(HDC hdc, INT index)
#uselib "GDI32.dll"
#cfunc global GetDeviceCaps "GetDeviceCaps" intptr, int
; res = GetDeviceCaps(hdc, index)
; hdc : HDC optional -> "intptr"
; index : INT -> "int"
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	gdi32 = windows.NewLazySystemDLL("GDI32.dll")
	procGetDeviceCaps = gdi32.NewProc("GetDeviceCaps")
)

// hdc (HDC optional), index (INT)
r1, _, err := procGetDeviceCaps.Call(
	uintptr(hdc),
	uintptr(index),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // INT
function GetDeviceCaps(
  hdc: THandle;   // HDC optional
  index: Integer   // INT
): Integer; stdcall;
  external 'GDI32.dll' name 'GetDeviceCaps';
result := DllCall("GDI32\GetDeviceCaps"
    , "Ptr", hdc   ; HDC optional
    , "Int", index   ; INT
    , "Int")   ; return: INT
●GetDeviceCaps(hdc, index) = DLL("GDI32.dll", "int GetDeviceCaps(void*, int)")
# 呼び出し: GetDeviceCaps(hdc, index)
# hdc : HDC optional -> "void*"
# index : INT -> "int"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "gdi32" fn GetDeviceCaps(
    hdc: ?*anyopaque, // HDC optional
    index: i32 // INT
) callconv(std.os.windows.WINAPI) i32;
proc GetDeviceCaps(
    hdc: pointer,  # HDC optional
    index: int32  # INT
): int32 {.importc: "GetDeviceCaps", stdcall, dynlib: "GDI32.dll".}
pragma(lib, "gdi32");
extern(Windows)
int GetDeviceCaps(
    void* hdc,   // HDC optional
    int index   // INT
);
ccall((:GetDeviceCaps, "GDI32.dll"), stdcall, Int32,
      (Ptr{Cvoid}, Int32),
      hdc, index)
# hdc : HDC optional -> Ptr{Cvoid}
# index : INT -> Int32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t GetDeviceCaps(
    void* hdc,
    int32_t index);
]]
local gdi32 = ffi.load("gdi32")
-- gdi32.GetDeviceCaps(hdc, index)
-- hdc : HDC optional
-- index : INT
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('GDI32.dll');
const GetDeviceCaps = lib.func('__stdcall', 'GetDeviceCaps', 'int32_t', ['void *', 'int32_t']);
// GetDeviceCaps(hdc, index)
// hdc : HDC optional -> 'void *'
// index : INT -> 'int32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("GDI32.dll", {
  GetDeviceCaps: { parameters: ["pointer", "i32"], result: "i32" },
});
// lib.symbols.GetDeviceCaps(hdc, index)
// hdc : HDC optional -> "pointer"
// index : INT -> "i32"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t GetDeviceCaps(
    void* hdc,
    int32_t index);
C, "GDI32.dll");
// $ffi->GetDeviceCaps(hdc, index);
// hdc : HDC optional
// index : INT
// 構造体/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);
    int GetDeviceCaps(
        Pointer hdc,   // HDC optional
        int index   // INT
    );
}
@[Link("gdi32")]
lib LibGDI32
  fun GetDeviceCaps = GetDeviceCaps(
    hdc : Void*,   # HDC optional
    index : Int32   # INT
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef GetDeviceCapsNative = Int32 Function(Pointer<Void>, Int32);
typedef GetDeviceCapsDart = int Function(Pointer<Void>, int);
final GetDeviceCaps = DynamicLibrary.open('GDI32.dll')
    .lookupFunction<GetDeviceCapsNative, GetDeviceCapsDart>('GetDeviceCaps');
// hdc : HDC optional -> Pointer<Void>
// index : INT -> Int32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function GetDeviceCaps(
  hdc: THandle;   // HDC optional
  index: Integer   // INT
): Integer; stdcall;
  external 'GDI32.dll' name 'GetDeviceCaps';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "GetDeviceCaps"
  c_GetDeviceCaps :: Ptr () -> Int32 -> IO Int32
-- hdc : HDC optional -> Ptr ()
-- index : INT -> Int32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let getdevicecaps =
  foreign "GetDeviceCaps"
    ((ptr void) @-> int32_t @-> returning int32_t)
(* hdc : HDC optional -> (ptr void) *)
(* index : INT -> int32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library gdi32 (t "GDI32.dll"))
(cffi:use-foreign-library gdi32)

(cffi:defcfun ("GetDeviceCaps" get-device-caps :convention :stdcall) :int32
  (hdc :pointer)   ; HDC optional
  (index :int32))   ; INT
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $GetDeviceCaps = Win32::API::More->new('GDI32',
    'int GetDeviceCaps(HANDLE hdc, int index)');
# my $ret = $GetDeviceCaps->Call($hdc, $index);
# hdc : HDC optional -> HANDLE
# index : INT -> int
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目