ホーム › Devices.Display › EngCreateBitmap
EngCreateBitmap
関数ドライバ用にエンジン管理のビットマップサーフェスを作成する。
シグネチャ
// GDI32.dll
#include <windows.h>
HBITMAP EngCreateBitmap(
SIZE sizl,
INT lWidth,
DWORD iFormat,
DWORD fl,
void* pvBits
);パラメーター
| 名前 | 型 | 方向 | 説明 | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| sizl | SIZE | in | 作成するビットマップの幅と高さ(ピクセル単位)をメンバーに格納した SIZEL 構造体を指定します。SIZEL 構造体は SIZE 構造体と同一です。 pvBits が NULL でない場合、この値はデバイス上で表示されるすべてのピクセルを表す必要があり、これによりデバイスがオフスクリーンメモリを保持できるようになります。 | ||||||||||||||||||
| lWidth | INT | in | ビットマップの割り当て幅を指定します。これは、ポインターを 1 スキャンライン下へ移動するために加算する必要があるバイト数です。 | ||||||||||||||||||
| iFormat | DWORD | in | ビットマップの形式を、1 ピクセルあたりに必要な色情報のビット数として指定します。このパラメーターには、次のいずれかの値を指定できます。
| ||||||||||||||||||
| fl | DWORD | in | 作成するビットマップのプロパティを指定するビットマスクです。このパラメーターには、0、または次の値の任意の組み合わせを指定できます。
| ||||||||||||||||||
| pvBits | void* | inout | 作成するビットマップの最初のスキャンラインへのポインターです。このパラメーターが NULL の場合、GDI はビットマップのピクセル用の記憶領域を割り当てます。pvBits が NULL でない場合は、ビットマップ用のバッファーへのポインターになります。 |
戻り値の型: HBITMAP
公式ドキュメント
EngCreateBitmap 関数は、ビットマップの作成と管理を GDI に要求します。
戻り値
関数が正常に完了すると、戻り値は作成されたビットマップを識別するハンドルになります。それ以外の場合、戻り値は 0 です。EngCreateBitmap はエラーコードをログに記録しません。
解説(Remarks)
ビットマップ用の記憶領域は、必要に応じてドライバーが提供することもできます。
ドライバーは、DrvEnableSurface から戻る前に、EngAssociateSurface を呼び出して、作成したビットマップをサーフェスとして関連付ける必要があります。
ビットマップが不要になったら、EngDeleteSurface を使用して削除する必要があります。
フレームバッファーディスプレイドライバーは pvBits パラメーターを使用し、GDI がほとんどの描画をディスプレイへ直接行えるようにする必要があります。
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// GDI32.dll
#include <windows.h>
HBITMAP EngCreateBitmap(
SIZE sizl,
INT lWidth,
DWORD iFormat,
DWORD fl,
void* pvBits
);[DllImport("GDI32.dll", ExactSpelling = true)]
static extern IntPtr EngCreateBitmap(
SIZE sizl, // SIZE
int lWidth, // INT
uint iFormat, // DWORD
uint fl, // DWORD
IntPtr pvBits // void* in/out
);<DllImport("GDI32.dll", ExactSpelling:=True)>
Public Shared Function EngCreateBitmap(
sizl As SIZE, ' SIZE
lWidth As Integer, ' INT
iFormat As UInteger, ' DWORD
fl As UInteger, ' DWORD
pvBits As IntPtr ' void* in/out
) As IntPtr
End Function' sizl : SIZE
' lWidth : INT
' iFormat : DWORD
' fl : DWORD
' pvBits : void* in/out
Declare PtrSafe Function EngCreateBitmap Lib "gdi32" ( _
ByVal sizl As LongPtr, _
ByVal lWidth As Long, _
ByVal iFormat As Long, _
ByVal fl As Long, _
ByVal pvBits As LongPtr) As LongPtr
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
EngCreateBitmap = ctypes.windll.gdi32.EngCreateBitmap
EngCreateBitmap.restype = ctypes.c_void_p
EngCreateBitmap.argtypes = [
SIZE, # sizl : SIZE
ctypes.c_int, # lWidth : INT
wintypes.DWORD, # iFormat : DWORD
wintypes.DWORD, # fl : DWORD
ctypes.POINTER(None), # pvBits : void* in/out
]require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('GDI32.dll')
EngCreateBitmap = Fiddle::Function.new(
lib['EngCreateBitmap'],
[
Fiddle::TYPE_VOIDP, # sizl : SIZE
Fiddle::TYPE_INT, # lWidth : INT
-Fiddle::TYPE_INT, # iFormat : DWORD
-Fiddle::TYPE_INT, # fl : DWORD
Fiddle::TYPE_VOIDP, # pvBits : void* in/out
],
Fiddle::TYPE_VOIDP)#[link(name = "gdi32")]
extern "system" {
fn EngCreateBitmap(
sizl: SIZE, // SIZE
lWidth: i32, // INT
iFormat: u32, // DWORD
fl: u32, // DWORD
pvBits: *mut () // void* in/out
) -> *mut core::ffi::c_void;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[DllImport("GDI32.dll")]
public static extern IntPtr EngCreateBitmap(SIZE sizl, int lWidth, uint iFormat, uint fl, IntPtr pvBits);
"@
$api = Add-Type -MemberDefinition $sig -Name 'GDI32_EngCreateBitmap' -Namespace Win32 -PassThru
# $api::EngCreateBitmap(sizl, lWidth, iFormat, fl, pvBits)#uselib "GDI32.dll"
#func global EngCreateBitmap "EngCreateBitmap" sptr, sptr, sptr, sptr, sptr
; EngCreateBitmap sizl, lWidth, iFormat, fl, pvBits ; 戻り値は stat
; sizl : SIZE -> "sptr"
; lWidth : INT -> "sptr"
; iFormat : DWORD -> "sptr"
; fl : DWORD -> "sptr"
; pvBits : void* in/out -> "sptr"
; ※値渡し構造体は直接渡せません。intにパック、または var で構造体変数を渡してください。
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "GDI32.dll"
#cfunc global EngCreateBitmap "EngCreateBitmap" int, int, int, int, sptr
; res = EngCreateBitmap(sizl, lWidth, iFormat, fl, pvBits)
; sizl : SIZE -> "int"
; lWidth : INT -> "int"
; iFormat : DWORD -> "int"
; fl : DWORD -> "int"
; pvBits : void* in/out -> "sptr"
; ※値渡し構造体は直接渡せません。intにパック、または var で構造体変数を渡してください。; HBITMAP EngCreateBitmap(SIZE sizl, INT lWidth, DWORD iFormat, DWORD fl, void* pvBits)
#uselib "GDI32.dll"
#cfunc global EngCreateBitmap "EngCreateBitmap" int, int, int, int, intptr
; res = EngCreateBitmap(sizl, lWidth, iFormat, fl, pvBits)
; sizl : SIZE -> "int"
; lWidth : INT -> "int"
; iFormat : DWORD -> "int"
; fl : DWORD -> "int"
; pvBits : void* in/out -> "intptr"
; ※値渡し構造体は直接渡せません。intにパック、または var で構造体変数を渡してください。import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
gdi32 = windows.NewLazySystemDLL("GDI32.dll")
procEngCreateBitmap = gdi32.NewProc("EngCreateBitmap")
)
// sizl (SIZE), lWidth (INT), iFormat (DWORD), fl (DWORD), pvBits (void* in/out)
r1, _, err := procEngCreateBitmap.Call(
uintptr(sizl),
uintptr(lWidth),
uintptr(iFormat),
uintptr(fl),
uintptr(pvBits),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // HBITMAPfunction EngCreateBitmap(
sizl: SIZE; // SIZE
lWidth: Integer; // INT
iFormat: DWORD; // DWORD
fl: DWORD; // DWORD
pvBits: Pointer // void* in/out
): THandle; stdcall;
external 'GDI32.dll' name 'EngCreateBitmap';result := DllCall("GDI32\EngCreateBitmap"
, "Ptr", sizl ; SIZE
, "Int", lWidth ; INT
, "UInt", iFormat ; DWORD
, "UInt", fl ; DWORD
, "Ptr", pvBits ; void* in/out
, "Ptr") ; return: HBITMAP●EngCreateBitmap(sizl, lWidth, iFormat, fl, pvBits) = DLL("GDI32.dll", "void* EngCreateBitmap(void*, int, dword, dword, void*)")
# 呼び出し: EngCreateBitmap(sizl, lWidth, iFormat, fl, pvBits)
# sizl : SIZE -> "void*"
# lWidth : INT -> "int"
# iFormat : DWORD -> "dword"
# fl : DWORD -> "dword"
# pvBits : void* in/out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "gdi32" fn EngCreateBitmap(
sizl: SIZE, // SIZE
lWidth: i32, // INT
iFormat: u32, // DWORD
fl: u32, // DWORD
pvBits: ?*anyopaque // void* in/out
) callconv(std.os.windows.WINAPI) ?*anyopaque;proc EngCreateBitmap(
sizl: SIZE, # SIZE
lWidth: int32, # INT
iFormat: uint32, # DWORD
fl: uint32, # DWORD
pvBits: pointer # void* in/out
): pointer {.importc: "EngCreateBitmap", stdcall, dynlib: "GDI32.dll".}pragma(lib, "gdi32");
extern(Windows)
void* EngCreateBitmap(
SIZE sizl, // SIZE
int lWidth, // INT
uint iFormat, // DWORD
uint fl, // DWORD
void* pvBits // void* in/out
);ccall((:EngCreateBitmap, "GDI32.dll"), stdcall, Ptr{Cvoid},
(SIZE, Int32, UInt32, UInt32, Ptr{Cvoid}),
sizl, lWidth, iFormat, fl, pvBits)
# sizl : SIZE -> SIZE
# lWidth : INT -> Int32
# iFormat : DWORD -> UInt32
# fl : DWORD -> UInt32
# pvBits : void* in/out -> Ptr{Cvoid}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
void* EngCreateBitmap(
SIZE sizl,
int32_t lWidth,
uint32_t iFormat,
uint32_t fl,
void* pvBits);
]]
local gdi32 = ffi.load("gdi32")
-- gdi32.EngCreateBitmap(sizl, lWidth, iFormat, fl, pvBits)
-- sizl : SIZE
-- lWidth : INT
-- iFormat : DWORD
-- fl : DWORD
-- pvBits : void* in/out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('GDI32.dll');
const EngCreateBitmap = lib.func('__stdcall', 'EngCreateBitmap', 'void *', ['SIZE', 'int32_t', 'uint32_t', 'uint32_t', 'void *']);
// EngCreateBitmap(sizl, lWidth, iFormat, fl, pvBits)
// sizl : SIZE -> 'SIZE'
// lWidth : INT -> 'int32_t'
// iFormat : DWORD -> 'uint32_t'
// fl : DWORD -> 'uint32_t'
// pvBits : void* in/out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("GDI32.dll", {
EngCreateBitmap: { parameters: ["buffer", "i32", "u32", "u32", "pointer"], result: "pointer" },
});
// lib.symbols.EngCreateBitmap(sizl, lWidth, iFormat, fl, pvBits)
// sizl : SIZE -> "buffer"
// lWidth : INT -> "i32"
// iFormat : DWORD -> "u32"
// fl : DWORD -> "u32"
// pvBits : void* in/out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
void* EngCreateBitmap(
SIZE sizl,
int32_t lWidth,
uint32_t iFormat,
uint32_t fl,
void* pvBits);
C, "GDI32.dll");
// $ffi->EngCreateBitmap(sizl, lWidth, iFormat, fl, pvBits);
// sizl : SIZE
// lWidth : INT
// iFormat : DWORD
// fl : DWORD
// pvBits : void* in/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);
Pointer EngCreateBitmap(
SIZE /* extends Structure (by value) */ sizl, // SIZE
int lWidth, // INT
int iFormat, // DWORD
int fl, // DWORD
Pointer pvBits // void* in/out
);
}@[Link("gdi32")]
lib LibGDI32
fun EngCreateBitmap = EngCreateBitmap(
sizl : SIZE, # SIZE
lWidth : Int32, # INT
iFormat : UInt32, # DWORD
fl : UInt32, # DWORD
pvBits : Void* # void* in/out
) : Void*
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef EngCreateBitmapNative = Pointer<Void> Function(SIZE, Int32, Uint32, Uint32, Pointer<Void>);
typedef EngCreateBitmapDart = Pointer<Void> Function(int, int, int, int, Pointer<Void>);
final EngCreateBitmap = DynamicLibrary.open('GDI32.dll')
.lookupFunction<EngCreateBitmapNative, EngCreateBitmapDart>('EngCreateBitmap');
// sizl : SIZE -> SIZE
// lWidth : INT -> Int32
// iFormat : DWORD -> Uint32
// fl : DWORD -> Uint32
// pvBits : void* in/out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function EngCreateBitmap(
sizl: SIZE; // SIZE
lWidth: Integer; // INT
iFormat: DWORD; // DWORD
fl: DWORD; // DWORD
pvBits: Pointer // void* in/out
): THandle; stdcall;
external 'GDI32.dll' name 'EngCreateBitmap';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "EngCreateBitmap"
c_EngCreateBitmap :: SIZE -> Int32 -> Word32 -> Word32 -> Ptr () -> IO (Ptr ())
-- sizl : SIZE -> SIZE
-- lWidth : INT -> Int32
-- iFormat : DWORD -> Word32
-- fl : DWORD -> Word32
-- pvBits : void* in/out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
-- ※値渡し構造体は GHC FFI で直接渡せません。Ptr で渡すラッパ(C側)経由にしてください。open Ctypes
open Foreign
let engcreatebitmap =
foreign "EngCreateBitmap"
(SIZE @-> int32_t @-> uint32_t @-> uint32_t @-> (ptr void) @-> returning (ptr void))
(* sizl : SIZE -> SIZE *)
(* lWidth : INT -> int32_t *)
(* iFormat : DWORD -> uint32_t *)
(* fl : DWORD -> uint32_t *)
(* pvBits : void* in/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 ("EngCreateBitmap" eng-create-bitmap :convention :stdcall) :pointer
(sizl (:struct size)) ; SIZE
(l-width :int32) ; INT
(i-format :uint32) ; DWORD
(fl :uint32) ; DWORD
(pv-bits :pointer)) ; void* in/out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $EngCreateBitmap = Win32::API::More->new('GDI32',
'HANDLE EngCreateBitmap(LPVOID sizl, int lWidth, DWORD iFormat, DWORD fl, LPVOID pvBits)');
# my $ret = $EngCreateBitmap->Call($sizl, $lWidth, $iFormat, $fl, $pvBits);
# sizl : SIZE -> LPVOID
# lWidth : INT -> int
# iFormat : DWORD -> DWORD
# fl : DWORD -> DWORD
# pvBits : void* in/out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。関連項目
使用する型