VC常用数据类型及使用转换详解
2024-07-06一、常用数据类型列表
VC常用数据类型列表(1)
Type
Default Size
Description
基
础
类
型
全
是
小
写
说明:这些基础数据类型对于MFC还是API都是被支持的
boolean
unsigned 8 bit ,
取值TRUE/FALSE
byte
unsigned 8 bit,
整数,输出按字符输出
char
unsigned 8 bit,
字符
double
signed 64 bit
浮点型
float
signed32 bit
浮点型
handle_t
Primitive handle type
hyper
signed 64 bit
整型
int
signed 32 bit
整型
long
signed 32 bit
整型
short
signed 16 bit
整型
small
signed 8 bit
整型
void *
32-bit
指向未知类型的指针
wchar_t
unsigned 16 bit
16位字符,比char可容纳更多的字符
VC常用数据类型列表(2)
Win32
API
常
用
数
据
类
型
全
大
写
说明: 这些Win32API支持的简单数据类型主要是用来定义函数返回值,消息参数,结构成员。这类数据类型大致可以分为五大类:字符型、布尔型、整型、指针型和句柄型(?). 总共大概有100多种不同的类型,
BOOL/BOOLEAN
8bit,TRUE/FALSE
布尔变量,实际上是16位UINT
BYTE
unsigned 8 bit
8位无符号整数
BSTR
CComBSTR
_bstr_t
32 bit
BSTR是指向字符串的32位指针
是对BSTR的封装
是对BSTR的封装
CHAR
8 bit
(ANSI)字符类型
COLORREF
32 bit
RGB颜色值索引 整型
DWORD
unsigned 32 bit
整型
FLOAT
float型
float型
HANDLE
32位的无符号整数,用作Windows系统所建立的某个对象的句柄,使该句柄就相当于引用该对象。
HBITMAP
bitmap句柄
HBRUSH
brush句柄
HCURSOR
cursor句柄
HDC
设备上下文句柄
HFILE
OpenFile打开的File句柄
HFONT
font句柄
HHOOK
hook句柄
HKEY
注册表键句柄
HPEN
pen句柄
HWND
32位的无符号整数,用作窗口句柄,使该句柄就相当于引用该窗口。
HINSTANCE
32位的无符号整数,用作实例句柄
VC常用数据类型列表(3)
INT
--------
--------
UINT
定义一个新的Win32数据类型,它会把一个参数强制转换成Windows3.x应用中的16位值或Win32应用中的32位值
LONG
--------
32位带符号整数
LONGLONG
64位带符号整型
LPARAM
32 bit
消息参数
LPBOOL
BOOL型指针
LPBYTE
BYTE型指针
LPCOLOREF
COLORREF型指针
LPCSTR/LPSTR/PCSTR
指向8位(ANSI)字符串类型指针
LPCWSTR/LPWSTR/PCWSTR
指向16位Unicode字符串类型
LPCTSTR/LPTSTR/PCTSTR
指向一8位或16位字符串类型指针
LPSTR
一个32位,指向字符(字符串)数据的指针
LPVOID
指向一个未指定类型的32位指针
LPDWORD
指向一个DWORD型指针
其他相似类型: LPHANDLE、LPINT、LPLONG、LPWORD、LPRESULT
PBOOL、PBOOLEAN、PBYTE、PCHAR、PDWORD、PFLOAT、PHANDLE、PINT、PLONG、PSHORT……
说明:(1)在16位系统中 LP为16bit,P为8bit,在32位系统中都是32bit(此时等价)
(2)LPCSTR等 中的C指Const,T表示TCHAR模式即可以工作在ANSI下也可UNICODE
SHORT
usigned
整型
其他UCHAR、UINT、ULONG、ULONGLONG、USHORT为无符号相应类型
TBYTE
WCHAR型或者CHAR型
TCHAR
ANSI与unicode均可
VARIANT
_variant_t
COleVariant
一个结构体参考OAIDL.H
_variant_t是VARIANT的封装类
COleVariant也是VARIANT的封装类
FARPROC
指向函数的32位指针
WNDPROC
指向一个窗口过程的32位指针
WCHAR
16位Unicode字符型
WORD
16位无符号整型
LOWORD
取一个32位整数的低16位,并应强制转换为short int。
WPARAM
消息参数
SIZE_T
size_t是针对系统定制的一种数据类型,一般是整形,因为C/C++标准只定义一最低的 位数,而不是必需的固定位数。而且在内存里,对数的高位对齐存储还是低位对齐存储各系统都不一样。为了提高代码的可移植性,就有必要定义这样的数据类型。 一般这种类型都会定义到它具体占几位内存等。当然,有些是编译器或系统已经给定义好的。具体要查看技术手册。
MFC
独有
数据
类型
下面两个数据类型是微软基础类库中独有的数据类型
POSITION
标记集合中一个元素的位置的值,被MFC中的集合类所使用
LPCRECT
指向一个RECT结构体常量(不能修改)的32位指针
CString
其实是MFC中的一个类
同时,为了统一变量的命名,在Windows中,不同类型的变量拥有各自的标准前缀,一般情况如表所示。
不同数据类型的前缀
前缀 数据类型
c 字符(char)
s 短整数(short)
cb 用于定义对象(一般为一个结构)尺寸的整数
n 整数(integer)
sz 以''/0''结尾的字符串
b 字节
f BOOL
w 字(WORD,无符号短整数)
l 长整数(LONG)
h HANDLE(无符号整数)
m_ 类成员变量
fn 函数(function)
dw 双字(DWORD,无符号长整数)
二、数据类型转换:
刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解,本文将介绍一些常用数据类型的使用。
我们先定义一些常见类型变量借以说明
int i = 100;
long l = 2001;
float f=300.2;
double d=12345.119;
char username[]="example";
char temp[200];
char *buf;
CString str;
_variant_t v1;
_bstr_t v2;
一、其它数据类型转换为字符串
短整型(int)
itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制
itoa(i,temp,2); ///按二进制方式转换
长整型(long)
ltoa(l,temp,10);
二、从其它包含字符串的变量中获取指向该字符串的指针
CString变量
str = "2008北京奥运";
buf = (LPSTR)(LPCTSTR)str;
BSTR类型的_variant_t变量
v1 = (_bstr_t)"程序员";
buf = _com_util::ConvertBSTRToString((_bstr_t)v1);
三、字符串转换为其它数据类型
strcpy(temp,"123");
短整型(int)
i = atoi(temp);
长整型(long)
l = atol(temp);
浮点(double)
d = atof(temp);
四、其它数据类型转换到CString
使用CString的成员函数Format来转换,例如:
整数(int)
str.Format("%d",i);
浮点数(float)
str.Format("%f",i);
字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值
str = username;
五、BSTR、_bstr_t与CComBSTR
CComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。
char *转换到BSTR可以这样: BSTR b=_com_util::ConvertStringToBSTR("数据");///使用前需要加上头文件comutil.h
反之可以使用char *p=_com_util::ConvertBSTRToString(b);
六、VARIANT 、_variant_t 与 COleVariant
VARIANT的结构可以参考头文件VC98/Include/OAIDL.H中关于结构体tagVARIANT的定义。
对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:
VARIANT va;
int a=2001;
va.vt=VT_I4;///指明整型数据
va.lVal=a; ///赋值
对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:
unsigned char bVal; VT_UI1
short iVal; VT_I2
long lVal;VT_I4
float fltVal;VT_R4
double dblVal;VT_R8
VARIANT_BOOL boolVal;VT_BOOL
SCODE scode;VT_ERROR
CY cyVal;VT_CY
DATE date;VT_DATE
BSTR bstrVal;VT_BSTR
IUnknown FAR* punkVal;VT_UNKNOWN
IDispatch FAR* pdispVal;VT_DISPATCH
SAFEARRAY FAR* parray;VT_ARRAY|*
unsigned char FAR* pbVal;VT_BYREF|VT_UI1
short FAR* piVal;VT_BYREF|VT_I2
long FAR* plVal;VT_BYREF|VT_I4
float FAR* pfltVal;VT_BYREF|VT_R4
double FAR* pdblVal; VT_BYREF|VT_R8
VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOL
SCODE FAR* pscode;VT_BYREF|VT_ERROR
CY FAR* pcyVal;VT_BYREF|VT_CY
DATE FAR* pdate; VT_BYREF|VT_DATE
BSTR FAR* pbstrVal;VT_BYREF|VT_BSTR
IUnknown FAR* FAR* ppunkVal;VT_BYREF|VT_UNKNOWN
IDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCH
SAFEARRAY FAR* FAR* pparray;VT_ARRAY|*
VARIANT FAR* pvarVal;VT_BYREF|VT_VARIANT
void FAR* byref;VT_BYREF
_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
例如:
long l=222;
ing i=100;
_variant_t lVal(l);
lVal = (long)i;
COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:
COleVariant v3 = "字符串", v4 = (long)1999;
CString str =(BSTR)v3.pbstrVal;
long i = v4.lVal;
七、其它
对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD),例如:
LPARAM lParam;
WORD lovalue = LOWORD(lParam);///取低16位
WORD hivalue = HIWORD(lParam);///取高16位
对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如:
WORD wvalue;
BYTE lovalue = LOBYTE(wvalue);///取低8位
BYTE hivalue = HIBYTE(wvalue);///取高8位