当前位置:文档之家› MFC+类型转换

MFC+类型转换

VC++类型转换整理已有 84 次阅读2009-11-30 16:18标签: 类型1、CString to char*经过类型强制转换,可以将CString类型转换成char*,例如:CString cStr = "Hello,world!";char* zStr = (char*)(LPCTSTR)cStr;2、char* to CStringchar*类型可以直接给CString,完成自动转换,例如:char* zStr = "Hello,world!";CString cStr = zStr;3、CString to LPCSTR将CString转换成LPCSTR,需要获得CString的长度,例如:CString cStr = _T("Hello,world!");int nLen = cStr.GetLength();LPCSTR lpszBuf = cStr.GetBuffer(nLen);4、CString to LPSTR这个和第3个技巧是一样的,例如:CString cStr = _T("Hello,world!");int nLen = str.GetLength();LPSTR lpszBuf = str.GetBuffer(nLen);5、Char[] to int将字符串类型转换成整数型,可以使用atoi函数,例如:char c[10];int n;n = atoi©;6、Char[] to float和第5个技巧一样,使用atof()函数可以转换成float型,例如:char c[10];float f;f = atof©;7、Char* to int和第5个技巧完全一样,例如:char *str = "100";int i;i = atoi(str);一、其它数据类型转换为字符串短整型(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与CComBSTRCComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。

char *转换到BSTR可以这样: BSTR b=_com_util::ConvertStringToBSTR("数据");///使用前需要加上头文件comutil.h反之可以使用char *p=_com_util::ConvertBSTRToString(b);六、VARIANT 、_variant_t 与 COleVariantVARIANT的结构可以参考头文件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_UI1short iVal; VT_I2long lVal; VT_I4float fltVal; VT_R4double dblVal; VT_R8VARIANT_BOOL boolVal; VT_BOOLSCODE scode; VT_ERRORCY cyVal; VT_CYDATE date; VT_DATEBSTR bstrVal; VT_BSTRIUnknown FAR* punkVal; VT_UNKNOWNIDispatch FAR* pdispVal; VT_DISPATCHSAFEARRAY FAR* parray; VT_ARRAY|*unsigned char FAR* pbVal; VT_BYREF|VT_UI1short FAR* piVal; VT_BYREF|VT_I2long FAR* plVal; VT_BYREF|VT_I4float FAR* pfltVal; VT_BYREF|VT_R4double FAR* pdblVal; VT_BYREF|VT_R8VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOLSCODE FAR* pscode; VT_BYREF|VT_ERRORCY FAR* pcyVal; VT_BYREF|VT_CYDATE FAR* pdate; VT_BYREF|VT_DATEBSTR FAR* pbstrVal; VT_BYREF|VT_BSTRIUnknown FAR* FAR* ppunkVal; VT_BYREF|VT_UNKNOWNIDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCHSAFEARRAY FAR* FAR* pparray; VT_ARRAY|*VARIANT FAR* pvarVal; VT_BYREF|VT_VARIANTvoid 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位后记:本文匆匆写成,错误之处在所难免,欢迎来信指正。

int ->str itoa,atoidouble- str ftoa,atof_bstr_t,_variant_t,CString,long 等等看看下面:我给你点详细的例子,看下面先看懂_variant_t与_bstr_t这两个类的构造函数和 operator=里面有重载了很多情况,其他类型向_variant_t 赋值:_variant_t( ) throw( );_variant_t( const VARIANT& varSrc ) throw( _com_error );_variant_t( const VARIANT* pVarSrc ) throw( _com_error );_variant_t( const _variant_t& var_t_Src ) throw( _com_error );_variant_t( VARIANT& varSrc, bool fCopy ) throw( _com_error );_variant_t( short sSrc, VARTYPE vtSrc = VT_I2 ) throw( _com_error ); _variant_t( long lSrc, VARTYPE vtSrc = VT_I4 ) throw( _com_error ); _variant_t( float fltSrc ) throw( );_variant_t( double dblSrc, VARTYPE vtSrc = VT_R8 ) throw( _com_error ); _variant_t( const CY& cySrc ) throw( );_variant_t( const _bstr_t& bstrSrc ) throw( _com_error );_variant_t( const wchar_t *wstrSrc ) throw( _com_error );_variant_t( const char* strSrc ) throw( _com_error );_variant_t( bool bSrc ) throw( );_variant_t( IUnknown* pIUknownSrc, bool fAddRef = true ) throw( );_variant_t( IDispatch* pDispSrc, bool fAddRef = true ) throw( );_variant_t( const DECIMAL& decSrc ) throw( );_variant_t( BYTE bSrc ) throw( );operator=的重载形式:_variant_t& operator=( const VARIANT& varSrc ) throw( _com_error ); _variant_t& operator=( const VARIANT* pVarSrc ) throw( _com_error ); _variant_t& operator=( const _variant_t& var_t_Src ) throw( _com_error ); _variant_t& operator=( short sSrc ) throw( _com_error );_variant_t& operator=( long lSrc ) throw( _com_error );_variant_t& operator=( float fltSrc ) throw( _com_error );_variant_t& operator=( double dblSrc ) throw( _com_error );_variant_t& operator=( const CY& cySrc ) throw( _com_error );_variant_t& operator=( const _bstr_t& bstrSrc ) throw( _com_error ); _variant_t& operator=( const wchar_t* wstrSrc ) throw( _com_error ); _variant_t& operator=( const char* strSrc ) throw( _com_error );_variant_t& operator=( IDispatch* pDispSrc ) throw( _com_error );_variant_t& operator=( bool bSrc ) throw( _com_error );_variant_t& operator=( IUnknown* pSrc ) throw( _com_error );_variant_t& operator=( const DECIMAL& decSrc ) throw( _com_error ); _variant_t& operator=( BYTE bSrc ) throw( _com_error );有了以上两个函数,举个例子:double f=1.0_variant_t v;v=f; //是合法的看看operator=的重载形式就知道了CString str="ddd"_variant_t v;v=str.AllocSysString() 或者v=(_bstr_t)(char*)str;即可_variant_t转换成别的形式你首先必须确定你要转化成什么样的形式double f;_variant_t vf=v.dblVal 即可或者f=(double)v;也可以附:_variant_t的操作符operator short( ) const throw( _com_error ); operator long( ) const throw( _com_error); operator float( ) const throw( _com_error ); operator double( ) const throw( _com_error ); operator CY( ) const throw( _com_error ); operator bool( ) const throw( _com_error ); operator DECIMAL( ) const throw( _com_error ); operator BYTE( ) const throw( _com_error ); operator _bstr_t( ) const throw( _com_error ); operator IDispatch*( ) const throw( _com_error ); operator IUnknown*( ) const throw( _com_error );二:CString->TCHAR*的转化可以用函数GetBuff()函数原型为:LPTSTR GetBuffer( int nMinBufLength ); CString str("CString");TCHAR* szMsg = new TCHAR[100];//其参数为CString字符串的长度szMsg = str.GetBuffer(str.GetLength());str.ReleaseBuffer();delete []szMsg;szMsg = NULL;TCHAR*->CString的转化TCHAR szTchar[18] = L"TCHAR";CString str;str.Format(_T("%s"),szTchar);CString和string的互相转换CString->std::string 例子:CString strMfc="test";std::string strStl;strStl=strMfc.GetBuffer(0);std::string->CString 例子:CString strMfc;std::string strStl="test";strMfc=strStl.c_str();对有关数据类型转换的整理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);∙浮点数(float,double)用fcvt可以完成转换,这是MSDN中的例子:int decimal, sign;char *buffer;double source = 3.1415926535;buffer = _fcvt( source, 7, &decimal, &sign );运行结果:source: 3.1415926535 buffer: '31415927' decimal: 1 sign: 0decimal表示小数点的位置,sign表示符号:0为正数,1为负数∙CString变量str = "2008北京奥运";buf = (LPSTR)(LPCTSTR)str;∙BSTR变量BSTR bstrValue = ::SysAllocString(L"程序员");char * buf = _com_util::ConvertBSTRToString(bstrValue);SysFreeString(bstrValue);AfxMessageBox(buf);delete(buf);∙CComBSTR变量CComBSTR bstrVar("test");char *buf = _com_util::ConvertBSTRToString(bstrVar.m_str);AfxMessageBox(buf);delete(buf);∙_bstr_t变量_bstr_t类型是对BSTR的封装,因为已经重载了=操作符,所以很容易使用_bstr_t bstrVar("test");const char *buf = bstrVar;///不要修改buf中的内容AfxMessageBox(buf);∙通用方法(针对非COM数据类型)用sprintf完成转换∙char buffer[200]; char c = '1'; int i = 35; long j = 1000; floatf = 1.7320534f; sprintf( buffer, "%c",c); sprintf( buffer, "%d",i);sprintf( buffer, "%d",j); sprintf( buffer, "%f",f);二、字符串转换为其它数据类型strcpy(temp,"123");∙短整型(int)i = atoi(temp);∙长整型(long)l = atol(temp);∙浮点(double)d = atof(temp);∙CString变量CString name = temp;∙BSTR变量BSTR bstrValue = ::SysAllocString(L"程序员");...///完成对bstrValue的使用SysFreeString(bstrValue);∙CComBSTR变量CComBSTR类型变量可以直接赋值CComBSTR bstrVar1("test");CComBSTR bstrVar2(temp);∙_bstr_t变量_bstr_t类型的变量可以直接赋值_bstr_t bstrVar1("test");_bstr_t bstrVar2(temp);三、其它数据类型转换到CString使用CString的成员函数Format来转换,例如:∙整数(int)str.Format("%d",i);∙浮点数(float)str.Format("%f",i);∙字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值str = username;∙对于Format所不支持的数据类型,可以通过上面所说的关于其它数据类型转化到char *的方法先转到char *,然后赋值给CString变量。

相关主题