WNDCLASSEXW
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| cbSize | DWORD | 4 | +0 | +0 | この構造体のサイズ (バイト単位)。このメンバーには sizeof(WNDCLASSEX) を設定します。GetClassInfoEx 関数を呼び出す前に、必ずこのメンバーを設定してください。 |
| style | WNDCLASS_STYLES | 4 | +4 | +4 | クラスのスタイル。このメンバーには クラススタイル の任意の組み合わせを指定できます。 |
| lpfnWndProc | WNDPROC | 8/4 | +8 | +8 | ウィンドウプロシージャへのポインター。ウィンドウプロシージャを呼び出すには、CallWindowProc 関数を使用しなければなりません。詳細については、WindowProc を参照してください。 |
| cbClsExtra | INT | 4 | +16 | +12 | ウィンドウクラス構造体に続けて割り当てる追加バイト数。システムはこれらのバイトを 0 で初期化します。 |
| cbWndExtra | INT | 4 | +20 | +16 | ウィンドウインスタンスに続けて割り当てる追加バイト数。システムはこれらのバイトを 0 で初期化します。アプリケーションが、リソースファイル内の CLASS ディレクティブを使用して作成されたダイアログボックスを WNDCLASSEX で登録する場合は、このメンバーに DLGWINDOWEXTRA を設定しなければなりません。 |
| hInstance | HINSTANCE | 8/4 | +24 | +20 | このクラスのウィンドウプロシージャを含むインスタンスへのハンドル。 |
| hIcon | HICON | 8/4 | +32 | +24 | クラスアイコンへのハンドル。このメンバーはアイコンリソースへのハンドルでなければなりません。このメンバーが NULL の場合、システムは既定のアイコンを提供します。 |
| hCursor | HCURSOR | 8/4 | +40 | +28 | クラスカーソルへのハンドル。このメンバーはカーソルリソースへのハンドルでなければなりません。このメンバーが NULL の場合、アプリケーションは、マウスがアプリケーションのウィンドウに入るたびにカーソルの形状を明示的に設定する必要があります。 |
| hbrBackground | HBRUSH | 8/4 | +48 | +32 | クラスの背景ブラシへのハンドル。このメンバーには、背景の描画に使用するブラシへのハンドル、または色の値を指定できます。色の値は次の標準システムカラーのいずれかでなければなりません (選択した色に値 1 を加算する必要があります)。色の値を指定する場合は、それを次のいずれかの HBRUSH 型に変換しなければなりません。
このメンバーが NULL の場合、アプリケーションは、クライアント領域の描画を要求されるたびに自身で背景を描画する必要があります。背景を描画する必要があるかどうかを判断するには、アプリケーションは WM_ERASEBKGND メッセージを処理するか、BeginPaint 関数によって設定される PAINTSTRUCT 構造体の fErase メンバーを調べます。 |
| lpszMenuName | LPWSTR | 8/4 | +56 | +36 | クラスメニューのリソース名を、リソースファイル内に現れるとおりに指定する、null 終端の文字列へのポインター。整数でメニューを識別する場合は、MAKEINTRESOURCE マクロを使用します。このメンバーが NULL の場合、このクラスに属するウィンドウには既定のメニューがありません。 |
| lpszClassName | LPWSTR | 8/4 | +64 | +40 | null 終端の文字列へのポインター、またはアトム。このパラメーターがアトムの場合、それは事前に RegisterClass 関数または RegisterClassEx 関数を呼び出して作成されたクラスアトムでなければなりません。アトムは lpszClassName の下位ワードに格納する必要があり、上位ワードは 0 でなければなりません。 lpszClassName が文字列の場合は、ウィンドウクラス名を指定します。クラス名には、RegisterClass または RegisterClassEx で登録された任意の名前、または定義済みのコントロールクラス名のいずれかを指定できます。 lpszClassName の最大長は 256 です。lpszClassName が最大長を超える場合、RegisterClassEx 関数は失敗します。 |
| hIconSm | HICON | 8/4 | +72 | +44 | ウィンドウクラスに関連付けられた小さいアイコンへのハンドル。このメンバーが NULL の場合、システムは hIcon メンバーで指定されたアイコンリソースから、小さいアイコンとして使用する適切なサイズのアイコンを検索します。 |
公式ドキュメント
ウィンドウクラスの情報を格納します。この構造体は RegisterClassEx 関数および GetClassInfoEx 関数で使用されます。
WNDCLASSEX 構造体は WNDCLASS 構造体に似ていますが、2 つの違いがあります。WNDCLASSEX には、構造体のサイズを指定する cbSize メンバーと、ウィンドウクラスに関連付けられた小さいアイコンのハンドルを格納する hIconSm メンバーが含まれます。
解説(Remarks)
winuser.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして、WNDCLASSEX を定義しています。エンコーディング中立のエイリアスの使用と、エンコーディング中立でないコードを混在させると、不一致が生じ、コンパイルエラーや実行時エラーの原因となることがあります。詳細については、関数プロトタイプの規則 を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// WNDCLASSEXW (x64 80 / x86 48 バイト)
typedef struct WNDCLASSEXW {
DWORD cbSize;
WNDCLASS_STYLES style;
WNDPROC lpfnWndProc;
INT cbClsExtra;
INT cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPWSTR lpszMenuName;
LPWSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEXW;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WNDCLASSEXW
{
public uint cbSize;
public uint style;
public IntPtr lpfnWndProc;
public int cbClsExtra;
public int cbWndExtra;
public IntPtr hInstance;
public IntPtr hIcon;
public IntPtr hCursor;
public IntPtr hbrBackground;
public IntPtr lpszMenuName;
public IntPtr lpszClassName;
public IntPtr hIconSm;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WNDCLASSEXW
Public cbSize As UInteger
Public style As UInteger
Public lpfnWndProc As IntPtr
Public cbClsExtra As Integer
Public cbWndExtra As Integer
Public hInstance As IntPtr
Public hIcon As IntPtr
Public hCursor As IntPtr
Public hbrBackground As IntPtr
Public lpszMenuName As IntPtr
Public lpszClassName As IntPtr
Public hIconSm As IntPtr
End Structureimport ctypes
from ctypes import wintypes
class WNDCLASSEXW(ctypes.Structure):
_fields_ = [
("cbSize", wintypes.DWORD),
("style", wintypes.DWORD),
("lpfnWndProc", ctypes.c_void_p),
("cbClsExtra", ctypes.c_int),
("cbWndExtra", ctypes.c_int),
("hInstance", ctypes.c_void_p),
("hIcon", ctypes.c_void_p),
("hCursor", ctypes.c_void_p),
("hbrBackground", ctypes.c_void_p),
("lpszMenuName", ctypes.c_void_p),
("lpszClassName", ctypes.c_void_p),
("hIconSm", ctypes.c_void_p),
]#[repr(C)]
pub struct WNDCLASSEXW {
pub cbSize: u32,
pub style: u32,
pub lpfnWndProc: *mut core::ffi::c_void,
pub cbClsExtra: i32,
pub cbWndExtra: i32,
pub hInstance: *mut core::ffi::c_void,
pub hIcon: *mut core::ffi::c_void,
pub hCursor: *mut core::ffi::c_void,
pub hbrBackground: *mut core::ffi::c_void,
pub lpszMenuName: *mut core::ffi::c_void,
pub lpszClassName: *mut core::ffi::c_void,
pub hIconSm: *mut core::ffi::c_void,
}import "golang.org/x/sys/windows"
type WNDCLASSEXW struct {
cbSize uint32
style uint32
lpfnWndProc uintptr
cbClsExtra int32
cbWndExtra int32
hInstance uintptr
hIcon uintptr
hCursor uintptr
hbrBackground uintptr
lpszMenuName uintptr
lpszClassName uintptr
hIconSm uintptr
}type
WNDCLASSEXW = record
cbSize: DWORD;
style: DWORD;
lpfnWndProc: Pointer;
cbClsExtra: Integer;
cbWndExtra: Integer;
hInstance: Pointer;
hIcon: Pointer;
hCursor: Pointer;
hbrBackground: Pointer;
lpszMenuName: Pointer;
lpszClassName: Pointer;
hIconSm: Pointer;
end;const WNDCLASSEXW = extern struct {
cbSize: u32,
style: u32,
lpfnWndProc: ?*anyopaque,
cbClsExtra: i32,
cbWndExtra: i32,
hInstance: ?*anyopaque,
hIcon: ?*anyopaque,
hCursor: ?*anyopaque,
hbrBackground: ?*anyopaque,
lpszMenuName: ?*anyopaque,
lpszClassName: ?*anyopaque,
hIconSm: ?*anyopaque,
};type
WNDCLASSEXW {.bycopy.} = object
cbSize: uint32
style: uint32
lpfnWndProc: pointer
cbClsExtra: int32
cbWndExtra: int32
hInstance: pointer
hIcon: pointer
hCursor: pointer
hbrBackground: pointer
lpszMenuName: pointer
lpszClassName: pointer
hIconSm: pointerstruct WNDCLASSEXW
{
uint cbSize;
uint style;
void* lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
void* hInstance;
void* hIcon;
void* hCursor;
void* hbrBackground;
void* lpszMenuName;
void* lpszClassName;
void* hIconSm;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; WNDCLASSEXW サイズ: 48 バイト(x86)
dim st, 12 ; 4byte整数×12(構造体サイズ 48 / 4 切り上げ)
; cbSize : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; style : WNDCLASS_STYLES (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; lpfnWndProc : WNDPROC (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; cbClsExtra : INT (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; cbWndExtra : INT (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; hInstance : HINSTANCE (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; hIcon : HICON (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; hCursor : HCURSOR (+28, 4byte) st.7 = 値 / 値 = st.7 (lpoke/lpeek も可)
; hbrBackground : HBRUSH (+32, 4byte) st.8 = 値 / 値 = st.8 (lpoke/lpeek も可)
; lpszMenuName : LPWSTR (+36, 4byte) st.9 = 値 / 値 = st.9 (lpoke/lpeek も可)
; lpszClassName : LPWSTR (+40, 4byte) st.10 = 値 / 値 = st.10 (lpoke/lpeek も可)
; hIconSm : HICON (+44, 4byte) st.11 = 値 / 値 = st.11 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; WNDCLASSEXW サイズ: 80 バイト(x64)
dim st, 20 ; 4byte整数×20(構造体サイズ 80 / 4 切り上げ)
; cbSize : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; style : WNDCLASS_STYLES (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; lpfnWndProc : WNDPROC (+8, 8byte) qpoke st,8,値 / qpeek(st,8) ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; cbClsExtra : INT (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; cbWndExtra : INT (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; hInstance : HINSTANCE (+24, 8byte) qpoke st,24,値 / qpeek(st,24) ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; hIcon : HICON (+32, 8byte) qpoke st,32,値 / qpeek(st,32) ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; hCursor : HCURSOR (+40, 8byte) qpoke st,40,値 / qpeek(st,40) ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; hbrBackground : HBRUSH (+48, 8byte) qpoke st,48,値 / qpeek(st,48) ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; lpszMenuName : LPWSTR (+56, 8byte) qpoke st,56,値 / qpeek(st,56) ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; lpszClassName : LPWSTR (+64, 8byte) qpoke st,64,値 / qpeek(st,64) ※IronHSPのみ。3.7/3.8は lpoke st,64,下位 : lpoke st,68,上位
; hIconSm : HICON (+72, 8byte) qpoke st,72,値 / qpeek(st,72) ※IronHSPのみ。3.7/3.8は lpoke st,72,下位 : lpoke st,76,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global WNDCLASSEXW
#field int cbSize
#field int style
#field intptr lpfnWndProc
#field int cbClsExtra
#field int cbWndExtra
#field intptr hInstance
#field intptr hIcon
#field intptr hCursor
#field intptr hbrBackground
#field intptr lpszMenuName
#field intptr lpszClassName
#field intptr hIconSm
#endstruct
stdim st, WNDCLASSEXW ; NSTRUCT 変数を確保
st->cbSize = 100
mes "cbSize=" + st->cbSize