データ型

型の別名

Windows プログラムでは,long や unsigned int といった型名の代わりに,LONG や UINT といった独自の型名が多く使われます。
これらは主に,次のように typedef で定義されたものです。

typedef long LONG;
typedef unsigned int UINT;

次の表に示すのは,windef.h や winnt.h で定義されている主な型の別名です。

C の型Win32 における別名
charCHAR
wchar_tWCHAR
unsigned charUCHAR, BYTE
shortSHORT
unsigned shortUSHORT, WORD
intINT
unsigned intUINT
longLONG
unsigned longULONG, DWORD
floatFLOAT
doubleDOUBLE
voidVOID

ポインタ型は, 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