MFC数据类型汇总及说明

来源:互联网 发布:破解视频聊天软件 编辑:程序博客网 时间:2024/06/06 02:38

MFC数据类型汇总及说明

I        数据类型

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

II  MFC独特的数据类型

POSITION:一个数值,代表collection对象(例如数组或链表)中的元素位置,常用于MFC collection classes(即数据处理类,如CArray)

LPCRECT:32-bit指针,指向一个不变的RECT结构

L表示long指针, 这是为了兼容Windows3.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

//短整型typedefunsigned 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

//长整型typedeflong

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

//字符类型typedefchar

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*

/*以下为winnt.h的部分内容*/

// 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*

// NeutralANSI/UNICODE types and macros

 

// tchar.h

#ifdef _UNICODE

typedef wchar_t     _TCHAR;

typedef wchar_t     TCHAR;

#else  /* ndef _UNICODE */

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;

/*以上为winnt.h的部分内容*/

#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##quotewinnt.h  // r_winnt

//以上的_T、__T、_TEXT、__TEXT、L宏使字符串会自动根据工程的版本(ANSI还是UNICODE)进行转化.  使代码不需修改自动适应ASNI和UNICODE版本

typedef WCHAR OLECHAR;                        wtypes.h

typedef /* [wire_marshal] */ 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的结构可以参考头文件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;

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位

0 0
原创粉丝点击