MFC中的數據類型

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            afx.h
#define NULL            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的結構可以參考頭文件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位 
發佈了17 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章