下面這些是和Win32程序共同使用的數據類型
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獨特的數據類型windows
POSITION:一個數值,表明collection對象(例如數組或鏈表)中的元素位置,經常使用於MFC collection classes(即數據處理類,如CArray)
LPCRECT:32-bit指針,指向一個不變的RECT結構數組
L表示long指針, 這是爲了兼容Windows 3.1等16位操做系統遺留下來的, 在win32中以及其餘的32爲操做系統中, long指針和near指針及far修飾符都是爲了兼容的做用。沒有實際意義。ide
P表示這是一個指針
C表示是一個常量
T在Win32環境中, 有一個_T宏, 這個宏用來表示你的字符是否使用UNICODE, 若是你的程序定義了UNICODE或者其餘相關的宏,那麼這個字符或者字符串將被做爲UNICODE字符串,不然就是標準的ANSI字符串。
STR表示這個變量是一個字符串。函數
因此LPCTSTR就表示一個指向常固定地址的能夠根據一些宏定義改變語義的字符串。
一樣, LPCSTR就只能是一個ANSI字符串, 在程序中咱們大部分時間要使用帶T的類型定義。spa
LPCTSTR == const TCHAR *操作系統
MFC/windows基本數據類型詳細介紹指針
#define FALSE 0 afx.hcode
#define TRUE 1 afx.horm
#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;
1、其它數據類型轉換爲字符串
短整型(int)
itoa(i,temp,10);///將i轉換爲字符串放入temp中,最後一個數字表示十進制
itoa(i,temp,2); ///按二進制方式轉換
長整型(long)
ltoa(l,temp,10);
2、從其它包含字符串的變量中獲取指向該字符串的指針
CString變量
str = "2008北京奧運";
buf = (LPSTR)(LPCTSTR)str;
BSTR類型的_variant_t變量
v1 = (_bstr_t)"程序員";
buf = _com_util::ConvertBSTRToString((_bstr_t)v1);
3、字符串轉換爲其它數據類型
strcpy(temp,"123");
短整型(int)
i = atoi(temp);
長整型(long)
l = atol(temp);
浮點(double)
d = atof(temp);
4、其它數據類型轉換到CString
使用CString的成員函數Format來轉換,例如:
整數(int)
str.Format("%d",i);
浮點數(float)
str.Format("%f",i);
字符串指針(char *)等已經被CString構造函數支持的數據類型能夠直接賦值
str = username;
5、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);
6、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;
7、其它 對消息的處理中咱們常常須要將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位