Windows API自行定义了一些关键字,用来定义Windows中函数中的有关参数和返回值的大小和意义,通常将它们看作Windows的数据类型。其中较常用的有:
关键字 类型 说明
BOOL 逻辑类型 等价于int
BOOLEAN 逻辑类型 等价于BYTE
BYTE 字节 等价于unsigned char
CHAR 字符 等价于char
DOUBLE 双精度 等价于double
DWORD 双字 等价于unsigned long
FLOAT 浮点数 等价于float
HANDLE 句柄 等价于void
INT 整数 等价于int
LONG 长整数 等价于long
SHORT 短整数 等价于short
UCHAR 无符号字符 等价于unsigned char
UINT 无符号整数 等价于unsigned int
ULONG 无符号长整数 等价于unsigned long
USHORT 无符号短整数 等价于unsigned short
VOID 空的、无定义 等价于void
WCHAR 双字节码 等价于unsigned short
wchar_t 双字节码 等价于unsigned short
WORD 字 等价于unsigned short
WPARAM 消息参数 等价于UINT
LPARAM 消息参数 等价于LONG
LRESULT 消息返回值 等价于LONG
HINSTANCE 实例句柄 等价于unsigned long
HWND 窗口句柄 等价于unsigned long
HDC 设备环境句柄 等价于unsigned long
TCHAR 字符 等价于char
LPSTR 字符指针 等价于char *
LPCSTR 常量字符指针 等价于const char *
LPTSTR 字符指针 等价于TCHAR *
LPCTSTR 常量字符指针 等价于const TCHAR *
LPVOID 无类型指针 等价于void *
LPCVOID 无类型常量指针 等价于const void *
其中句柄(handle)是Windows编程的一个关键性的概念,编写Windows应用程序总是要和各种句柄打交道。所谓句柄,就是一个4字节长的唯一的数,用以标识许多不同的对象类型,如窗口、菜单、内存、画笔、画刷、电话线路等。
由于Windows是一个多任务操作系统,它可以同时运行多个程序或一个程序的多个副本。这些运行的程序称为一个实例。为了对同一程序的多个副本进行管理,Windows引入了实例句柄。Windows为每个应用程序建立一张表,实例句柄就好象是这张表的一个索引。
Windows不仅使用句柄来管理实例,也用它来管理窗口、位图、字体、元文件、图标等系统资源。
Windows NT系统支持Unicode。所谓Unicode,即统一双字节内码。我们知道,计算机中的西文信息使用单字节内码(8位2进制码,即ASCII码)。为了处理象中文这样的大字符集,国内、台湾和日本等使用汉字的国家各自定义了不同的双字节内码标准,如大陆的GB码、台湾的BIG5码和日本的JIS码等。但不同的内码系统不能通用,例如以BIG5码输入的文字在GB码系统下不可辨认。因此,国际标准化组织提出了通用的大字符集标准,这就是Unicode码。为了在应用程序中使用Unicode码,就必须使用wchar_t或WCHAR代替char和CHAR类型处理字符。但因目前仅Windows NT支持Unicode,所以为了使所开发的应用程序具有一定的通用性,可用TCHAR类型代替CHAR或WCHAR类型。TCHAR类型可根据需要自动定义为CHAR或WCHAR类型。
宽字符其实也没有什么神秘,又叫做Unicode。就是人家一个char字符占用一个字节而宽字符占用两个。为了显示中文。
Ascii码没有中文,因为计算机不是中国发明的,以前Ascii码足够了,但是中国人开始使用计算机了,于是要有中文(其它国家的我们不考虑),将两个Ascii合并在一起显示一个中文。
许多函数需要宽字符作为参数,这时候你直接在该函数后面加上一个‘A’表示非宽字符版本。
如:MessageBox需要宽字符,里那么我们就使用 MessageBoxA 函数。
宽字符:MessageBox(NULL,TEXT("我是内容"),TEXT("我是标题"),MB_OK);
非宽字符:MessageBoxA(NULL,"我是内容","我是标题",MB_OK);
多种方法:
001.将你的字符串放入 TEXT() 里面,就是宽字符版本了。
002.在你的字符串前面加上‘L’即可,如:L"我是内容"。
003.将你的字符串放入 _T() 里面,就是宽字符版本了,(需要tchar.h 头文件)
也就是说,以下是相同的:
#include<tchar.h>
MessageBox(NULL,TEXT("我是内容"),TEXT("我是标题"),MB_OK);
MessageBox(NULL,L"我是内容",L"我是标题"MB_OK);
MessageBox(NULL,_T("我是内容"),_T("我是标题"),MB_OK);
在VS2010里面,你可以直接使用 TCHAR 定义宽字符,使用char定义非宽字符。
TCHAR File[255];
char file[255];
然后在需要的时候可以进行转换:
宽字符转普通字符:WideCharToMultiByte();
普通字符转宽字符:MultiByteToWideChar();
详细参数可以在百度百科找到。
初学的话可以直接:
宽字符转普通字符
WideCharToMultiByte(0,0,File,255,file,255,0,0);
普通字符转宽字符:
MultiByteToWideChar(0,0,file,255,File,255);
要转化的放前面,转化后的放后面,那些数字是转化个数,其它置0.
加入头文件 tchar.h
宽字符版本字符处理函数。
如:
strlen() //测字符串长度 ,不适用于宽字符
它的替代品是: wcslen() ,_tcslen(),lstrlen()等……
printf() 成了 wprintf()
strcpy() 成了 _tcscpy ()
strcmp() 成了 _tcscmp()
…… ……
简单的例子:
#include<windows.h>
#include <tchar.h>
<strong><span style="font-size:18px;">#include <stdio.h>
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
int x, y;
TCHAR String[255];
x = GetSystemMetrics (SM_CXSCREEN) ; //屏幕的宽
y= GetSystemMetrics (SM_CYSCREEN) ; //屏幕的高
wsprintf(String, TEXT ("你的屏幕宽 %d pixels 高 %d pixels……不信量一量 "),x,y);
MessageBox(NULL,String,TEXT("测量测量……"),MB_OK);
return 0 ; //这个不解释……
}</span></strong>