概述
MFC中的数据类型
BOOL:布尔值,取值为TRUE or FALSE
BSTR:32-bit 字符指针
BYTE:8-bit整数,未带正负号
COLORREF:32-bit数值,代表一个颜色值
DWORD:32-bit整数,未带正负号
LONG:32-bit整数,带正负号
LPARAM:32-bit整数,作为窗口函数或callback函数的一个参数
LPCSTR:32-bit指针,指向一个常数字符串
LPSTR:32-bit指针,指向一个字符串
LPCTSTR:32-bit指针,指向一个常数字符串,此字符串可以移植到Unicode和DBCS
LPTSTR:32-bit指针,指向一个字符串,此字符串可以移植到Unicode和DBCS
LPVOID:32-bit指针,指向一个未指定类型的数据
LPRESULT:32-bit数值,作为窗口函数或callback函数的返回值
UINT:在Win16中是一个16-bit 未带正负号整数,在Win32中是一个32-bit 未带 正负号整数,
WNDPROC:32-bit指针,指向一个窗口函数
WORD:16-bit 整数 ,未带正负号
WPARAM:窗口函数或callback函数的一个参数,在Win16中是16-bit,在Win32中是32-bit
下面这些是MFC独特的数据类型
POSITION:一个数值,代表collection对象(例如数组或链表)中的元素位置,常 用于MFC collectionclasses(即数据处理类,如CArray)
LPCRECT:32-bit指针,指向一个不变的RECT结构
L表示long指针, 这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32为操作系统中, long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。
P表示这是一个指针
C表示是一个常量
T在Win32环境中, 有一个_T宏, 这个宏用来表示你的字符是否使用UNICODE,如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。
STR表示这个变量是一个字符串。
所以LPCTSTR就表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。
同样, LPCSTR就只能是一个ANSI字符串, 在程序中我们大部分时间要使用带T的类型定义。
LPCTSTR == const TCHAR *
MFC/windows基本数据类型详细介绍
#define FALSE
0
afx.h
#define TRUE
1
afx.h
#define NULL
0
afx.h
typedef void
VOID
winnt.h
//短整型typedef unsigned short
typedef unsigned short
USHORT;
windef.h
typedef unsigned short
WORD;
windef.h
typedef unsigned short
wchar_t
typedef short
SHORT;
winnt.h
//整型typedef
int
typedef int
BOOL;
//取值为TRUE or FALSE windef.h
typedef int
INT;windef.h
typedef unsigned int
UINT;//定义一个新的Win32数据类型,它会把一个参数强制转换成Windows3.x应用中的16位值或Win32应用中的32位值windef.h
//长整型typedef long
typedef unsigned long
ULONG;
windef.h
typedef unsigned long
DWORD;
windef.h
typedef DWORD
COLORREF; windef.h
typedef long
LONG;
winnt.h
typedef __int64
LONGLONG; winnt.h
typedef unsigned __int64
ULONGLONG; winnt.h
typedef ULONGLONG
DWORDLONG;winnt.h
//浮点型
typedef float
FLOAT;
windef.h
typedef double
DOUBLE;
wtypes.h
//字符类型typedef char
typedef char
CHAR/CCHAR;winnt.h
typedef unsigned char
UCHAR;
windef.h
typedef unsigned char
BYTE;
windef.h
typedef wchar_t
WCHAR;//声明一个16位的UNICODE字符,用来表示世界上所有已知的书写语言的符号winnt.h
//指向字符串的指针类型LP*
// UNICODE (Wide Character) types
typedef wchar_t WCHAR;
//wc,
16-bit UNICODE character
typedef __nullterminated WCHAR *NWPSTR, *LPWSTR,*PWSTR;
typedef __nullterminated CONST WCHAR *LPCWSTR, *PCWSTR;
// ANSI (Multi-byte Character) types
typedef CHAR *PCHAR, *LPCH, *PCH;
typedef __nullterminated CHAR *NPSTR, *LPSTR,*PSTR;
//指向Windows字符串(以空字符结束)的32位指针char*
typedef __nullterminated CONST CHAR *LPCSTR,*PCSTR;
//指向Windows常字符串(以空字符结束)的32位指针const
char*
// Neutral ANSI/UNICODE types and macros
// tchar.h
#ifdef
_UNICODE
typedef wchar_t
_TCHAR;
typedef wchar_t
TCHAR;
#else
typedef char
_TCHAR;
typedef char
TCHAR;
#endif
typedef LPWSTR PTSTR, LPTSTR;
//指向Windows字符串(以空字符结束)的32位指针,用于移植到双字节字符集
LPTSTR
For
Unicode
platforms,it
is
LPWSTR,For
ANSI
and
DBCS
platforms,it
is
LPSTR
typedef LPCWSTR
PCTSTR, LPCTSTR;
//指向Windows常字符串(以空字符结束)的32位指针const char* ,用于移植到双字节字符集
LPCTSTR For
Unicode
platforms,it
is
LPCWSTR,For
ANSI
and
DBCS
platforms,it
is
LPCSTR
typedef LPWSTR LP;
#define __T(x)
x
tchar.h
//ndef _UNICODE
#define _T(x)
__T(x)
tchar.h
#define _TEXT(x)
__T(x)
tchar.h
#define __TEXT(quote) L##quote winnt.h
//r_winnt
//以上的_T、__T、_TEXT、__TEXT、L宏使字符串会自动根据工程的版本(ANSI还是UNICODE)进行转化.
使代码不需修改自动适应ASNI和UNICODE版本
typedef WCHAR OLECHAR;
wtypes.h
typedef OLECHAR *BSTR;
unsigned
short*
wtypes.h
//函数参数、返回值类型
typedef UINT_PTR
WPARAM;//窗口函数或callback函数的一个参数,在Win16中是16-bit,在Win32中是32-bit windef.h
typedef LONG_PTR
LPARAM; //32位窗口函数或callback函数的一个参数windef.h
typedef LONG_PTR
LRESULT; //32位作为窗口函数或callback函数的返回值windef.h
//指向函数的指针类型
typedef int (WINAPI *PROC)();PROC //指向回调函数的指针
typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM,LPARAM);
//Windows函数调用类型__stdcall
#define CALLBACK
__stdcall
windef.h
#define WINAPI
__stdcall
windef.h
#define WINAPIV
__cdecl
windef.h
#define APIENTRY
WINAPI
windef.h
#define APIPRIVATE
__stdcall
windef.h
#define PASCAL
__stdcall
windef.h
//关于调用宏参考http://blog.163.com/xiang_163_ok/blog/static/6171684520082161551829/
typedef void far
*LPVOID;
指向任意类型的指针windef.h
下面将介绍一些常用数据类型的使用:
我们先定义一些常见类型变量借以说明
int
i
=
100;
long
l
=
2001;
float
f=300.2;
double
d=12345.119;
char
username[]="女侠程佩君";
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的结构可以参考头文件VC98IncludeOAIDL.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;
int
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位
最后
以上就是有魅力方盒为你收集整理的MFC中的数据类型的全部内容,希望文章能够帮你解决MFC中的数据类型所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复