データ型
型の別名
Windows プログラムでは,long や unsigned int といった型名の代わりに,LONG や UINT といった独自の型名が多く使われます。
これらは主に,次のように typedef で定義されたものです。
typedef long LONG;
typedef unsigned int UINT;次の表に示すのは,windef.h や winnt.h で定義されている主な型の別名です。
| C の型 | Win32 における別名 |
|---|---|
| char | CHAR |
| wchar_t | WCHAR |
| unsigned char | UCHAR, BYTE |
| short | SHORT |
| unsigned short | USHORT, WORD |
| int | INT |
| unsigned int | UINT |
| long | LONG |
| unsigned long | ULONG, DWORD |
| float | FLOAT |
| double | DOUBLE |
| void | VOID |
ポインタ型は, P または LP という接頭辞の付いた型名となります。
| C の型 | Win32 における別名 |
|---|---|
| unsigned char * | PUCHAR, PBYTE, LPBYTE |
| short * | PSHORT |
| unsigned short * | PUSHORT, PWORD, LPWORD |
| int * | PINT, LPINT |
| unsigned int * | PUINT |
| long * | PLONG |
| unsigned long * | PULONG, PDWORD, LPDWORD |
| float * | PFLOAT |
| void * | PVOID, LPVOID |
| const void * | LPCVOID |
文字列型はかなりたくさんの別名があります。慣れるまでが大変です。
| C の型 | Win32 における別名 |
|---|---|
| char * | PCHAR, LPCH, PCH, NPSTR, LPSTR, PSTR |
| const char * | LPCCH, PCCH, LPCSTR, PCSTR |
| wchar_t * | PWCHAR, LPWCH, PWCH, NWPSTR, LPWSTR, PWSTR |
| const wchar_t * | LPCWCH, PCWCH, LPCWSTR, PCWSTR |
| TCHAR * | PTCHAR, LPTCH, PTCH, PTSTR, LPTSTR |
| const TCHAR * | LPCTCH, PCTCH, PCTSTR, LPCTSTR |
ちなみに,ポインタ型の接頭辞が P (pointer) と LP (long pointer) の 2 種類存在するのは,Win16 の名残です。
Win16 では,near ポインタ,far ポインタというポインタの区別があり,near ポインタ型には接頭辞 P,far ポインタ型には接頭辞 LP を使用していました。
論理型
TRUE または FALSE いずれかの値を取る,論理型 BOOL および BOOLEAN が用意されています。
型の定義は次の通りです。
typedef int BOOL;
typedef BYTE BOOLEAN;TRUE と FALSE は,次のように定義されています。
#define FALSE 0
#define TRUE 1返却型が BOOL であっても,関数が 0 でも 1 でもない値を返す可能性があります。
次のようなコードは御法度です。
if (IsWindow(hwnd) == TRUE) { ... }ハンドル型
ハンドル (handle) とは,プログラムやファイルなどに割り当てられる,一種のポインタのことです。
C の入門書で,きっと次みたいなプログラムを読んだことがあるでしょう。
FILE *fp = fopen("hoge.txt", "r");このときの fp が正に (ファイルへの) ハンドルと言えます。
次の表に示すのは代表的なハンドル型の例です。
ハンドル型の型名には接頭辞 H が付きます。
| 型 | ハンドルの対象 |
|---|---|
| HINSTANCE | インスタンス (プログラム) |
| HWND | ウィンドウ |
| HICON | アイコン |
| HCURSOR | カーソル |
| HDC | デバイスコンテキスト |
| HFONT | 論理フォント |
| HPEN | 論理ペン |
| HBRUSH | 論理ブラシ |
幾何関係の構造体
点の位置を表す POINT 構造体,矩形の位置を表す RECT 構造体,矩形の幅と高さを表す SIZE 構造体が,次のように定義されています。
POINT 構造体 [MSDN]
typedef struct tagPOINT {
LONG x; // x 座標
LONG y; // y 座標
} POINT, *PPOINT;
RECT 構造体 [MSDN]
typedef struct tagRECT {
LONG left; // 左上端の x 座標
LONG top; // 左上端の y 座標
LONG right; // 右下端の x 座標
LONG bottom; // 右下端の y 座標
} RECT, *PRECT;
SIZE 構造体 [MSDN]
typedef struct tagSIZE {
LONG cx; // 幅
LONG cy; // 高さ
} SIZE, *PSIZE;
ハンガリアン記法
Windows プログラミングでは,識別子の接頭辞でその識別子の種類を表す記法が用いられます。
例えば,ウィンドウハンドルの識別子は,ハンドルを表す接頭辞 h を付けて hWnd といった名前にします。
こうした表記法はハンガリアン記法 (Hungarian notation) と呼ばれるものです。
主な接頭辞を表にまとめました。
| 接頭辞 | 説明 |
|---|---|
| h | ハンドル (handle) |
| p, lp | ポインタ (pointer, long pointer) |
| b, f | 真理値 (boolean, flag) |
| i, n | 整数 (integer, number) |
| fn | 関数 (function) |
| sz | ゼロ終端文字列 (zero-terminated string) |
Microsoft によるハンガリアン記法の説明は次のページにあります。
- Hungarian Notation
- http://msdn.microsoft.com/en-us/library/aa260976.aspx