刚接触MFC编程就出现了让我头大的一件事—-这些变量我咋都不认识。若你也有这种感觉,那这篇博客将会给你一些启发~
在MFC中定义的基本变量
- 首先,所有的变量都被从小写定义成了大写。如:
typedef int BOOL;//TRUE FALSE typedef unsigned char BYTE; typedef float FLOAT; typedef int INT; typedef char CHAR; typedef short SHORT; typedef long LONG; typedef CHAR* PCHAR, LPSTR; //可写的字符指针变量 #ifndef VOID #define VOID void
还有字的定义:
typedef unsigned long DWORD;//双字 typedef unsigned short WORD;//单字
- 所有的无符号变量都加上U来区分。如:
typedef unsigned int UINT;
- 所有的指针类型变量都加上P来区分。如:
typedef FLOAT *PFLOAT; typedef BOOL near *PBOOL; typedef BOOL far *LPBOOL; typedef BYTE near *PBYTE; typedef BYTE far *LPBYTE; typedef int near *PINT; typedef int far *LPINT; typedef WORD near *PWORD; typedef WORD far *LPWORD; typedef long far *LPLONG; typedef DWORD near *PDWORD; typedef DWORD far *LPDWORD; typedef void far *LPVOID; typedef CONST void far *LPCVOID; //near和far是c语言相对古老的的用法,用于声明变量在内存中的远近(以前16位的dos操作系统,最大有64K的内存,紧缺的很~)。
- 所有的常量指针都使用C。如:
typedef CONST void* LPCVOID; typedef CONST CHAR *LPCSTR, *PCSTR;//只读的字符指针变量
结构体类型。主要有三个POINT、SIZE、RECT
typedef struct tagPOINT { LONG x; LONG y; } POINT, *PPOINT, *LPPOINT;//结构体别名 typedef struct tagSIZE { LONG cx; LONG cy; } SIZE, *PSIZE, *LPSIZE; typedef struct tagRECT { LONG left; LONG top; LONG right; LONG bottom; } RECT, *PRECT, *LPRECT; <p>
</p> … DECLARE_HANDLE (HWND); … #define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name <p>3. 最神奇的**句柄类型**。 句柄是一种故意隐藏了内容的结构体指针。看一下HWND的声明:
</p> const char * p = “aaa”; //内存中,每个a占有一个字节 const char * pc = “中国”;//内存中,每个汉字占有两个字节 const wchar_t * pU = L”aa”;//内存中,每个a占有两个字节 const wchar_t * pcU = L”中国”;//内存中,每个汉字占有一个字节 const TCHAR * s = L”aa”;//这个TCHAR声明时,必须声明成Unicode编码的串 /* //修改vs的编码方式为’多字节字符集’后 const TCHAR *s =L”aa”;//这就会报错,因为这时候TCHAR是char类型 const TCHAR *s =”aa”;//不会报错 */可以看到HWND就是结构体的指针,而结构体的内容是unused,(拒绝使用~)。 - HWND 窗口句柄 - HINSTANCE 进程实例句柄 - HCURSOR 光标句柄 - HICON 图标句柄 - HMENU 菜单句柄 - HFONT 字体句柄 - HFILE 文件句柄 - 等 4. 最复杂的**字符串指针类型** 首先,谈精简版的历史。很早以前,各国文字都有自己的编码方式,而且每个国家字符的字节也不一样(多字节字符)。后来,拥有了统一的编码方式,统一了编码--Unicode。 vs中创建项目时,默认是Unicode编码的。可以使用**wchar_t**来声明Unicode编码的字符串,而且字符串声明时在前面加上**L**。**TCHAR**是一个怪胎,他是char和wchar_t的自适应版。