mfc类型转换.docx
《mfc类型转换.docx》由会员分享,可在线阅读,更多相关《mfc类型转换.docx(15页珍藏版)》请在冰点文库上搜索。
mfc类型转换
VC++类型转换整理已有84次阅读2009-11-3016:
18标签:
类型
1、CStringtochar*经过类型强制转换,可以将CString类型转换成char*,例如:
CStringcStr="Hello,world!
";char*zStr=(char*)(LPCTSTR)cStr;
2、char*toCStringchar*类型可以直接给CString,完成自动转换,例如:
char*zStr="Hello,world!
";CStringcStr=zStr;
3、CStringtoLPCSTR将CString转换成LPCSTR,需要获得CString的长度,例如:
CStringcStr=_T("Hello,world!
");intnLen=cStr.GetLength();LPCSTRlpszBuf=cStr.GetBuffer(nLen);
4、CStringtoLPSTR这个和第3个技巧是一样的,例如:
CStringcStr=_T("Hello,world!
");intnLen=str.GetLength();LPSTRlpszBuf=str.GetBuffer(nLen);
5、Char[]toint将字符串类型转换成整数型,可以使用atoi函数,例如:
charc[10];intn;n=atoi©;
6、Char[]tofloat和第5个技巧一样,使用atof()函数可以转换成float型,例如:
charc[10];floatf;f=atof©;
7、Char*toint和第5个技巧完全一样,例如:
char*str="100";inti;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与CComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。
char*转换到BSTR可以这样:
BSTRb=_com_util:
:
ConvertStringToBSTR("数据");///使用前需要加上头文件comutil.h反之可以使用char*p=_com_util:
:
ConvertBSTRToString(b);
六、VARIANT、_variant_t与COleVariantVARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。
对于VARIANT变量的赋值:
首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:
VARIANTva;inta=2001;va.vt=VT_I4;///指明整型数据va.lVal=a;///赋值对于不马上赋值的VARIANT,最好先用VoidVariantInit(VARIANTARGFAR*pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:
unsignedcharbVal;VT_UI1shortiVal;VT_I2longlVal;VT_I4floatfltVal;VT_R4doubledblVal;VT_R8VARIANT_BOOLboolVal;VT_BOOLSCODEscode;VT_ERRORCYcyVal;VT_CYDATEdate;VT_DATEBSTRbstrVal;VT_BSTRIUnknownFAR*punkVal;VT_UNKNOWNIDispatchFAR*pdispVal;VT_DISPATCHSAFEARRAYFAR*parray;VT_ARRAY|*unsignedcharFAR*pbVal;VT_BYREF|VT_UI1shortFAR*piVal;VT_BYREF|VT_I2longFAR*plVal;VT_BYREF|VT_I4floatFAR*pfltVal;VT_BYREF|VT_R4doubleFAR*pdblVal;VT_BYREF|VT_R8VARIANT_BOOLFAR*pboolVal;VT_BYREF|VT_BOOLSCODEFAR*pscode;VT_BYREF|VT_ERRORCYFAR*pcyVal;VT_BYREF|VT_CYDATEFAR*pdate;VT_BYREF|VT_DATEBSTRFAR*pbstrVal;VT_BYREF|VT_BSTRIUnknownFAR*FAR*ppunkVal;VT_BYREF|VT_UNKNOWNIDispatchFAR*FAR*ppdispVal;VT_BYREF|VT_DISPATCHSAFEARRAYFAR*FAR*pparray;VT_ARRAY|*VARIANTFAR*pvarVal;VT_BYREF|VT_VARIANTvoidFAR*byref;VT_BYREF_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
例如:
longl=222;ingi=100;_variant_tlVal(l);lVal=(long)i;COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:
COleVariantv3="字符串",v4=(long)1999;CStringstr=(BSTR)v
3.pbstrVal;longi=v
4.lVal;
七、其它对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD),例如:
LPARAMlParam;WORDloValue=LOWORD(lParam);///取低16位WORDhiValue=HIWORD(lParam);///取高16位对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如:
WORDwValue;BYTEloValue=LOBYTE(wValue);///取低8位BYTEhiValue=HIBYTE(wValue);///取高8位后记:
本文匆匆写成,错误之处在所难免,欢迎来信指正。
int->stritoa,atoidouble-strftoa,atof_bstr_t,_variant_t,CString,long等等看看下面:
我给你点详细的例子,看下面先看懂_variant_t与_bstr_t这两个类的构造函数和operator=里面有重载了很多情况,其他类型向_variant_t赋值:
_variant_t()throw();_variant_t(constVARIANT&varSrc)throw(_com_error);_variant_t(constVARIANT*pVarSrc)throw(_com_error);_variant_t(const_variant_t&var_t_Src)throw(_com_error);_variant_t(VARIANT&varSrc,boolfCopy)throw(_com_error);_variant_t(shortsSrc,VARTYPEvtSrc=VT_I2)throw(_com_error);_variant_t(longlSrc,VARTYPEvtSrc=VT_I4)throw(_com_error);_variant_t(floatfltSrc)throw();_variant_t(doubledblSrc,VARTYPEvtSrc=VT_R8)throw(_com_error);_variant_t(constCY&cySrc)throw();_variant_t(const_bstr_t&bstrSrc)throw(_com_error);_variant_t(constwchar_t*wstrSrc)throw(_com_error);_variant_t(constchar*strSrc)throw(_com_error);_variant_t(boolbSrc)throw();_variant_t(IUnknown*pIUknownSrc,boolfAddRef=true)throw();_variant_t(IDispatch*pDispSrc,boolfAddRef=true)throw();_variant_t(constDECIMAL&decSrc)throw();_variant_t(BYTEbSrc)throw();operator=的重载形式:
_variant_t&operator=(constVARIANT&varSrc)throw(_com_error);_variant_t&operator=(constVARIANT*pVarSrc)throw(_com_error);_variant_t&operator=(const_variant_t&var_t_Src)throw(_com_error);_variant_t&operator=(shortsSrc)throw(_com_error);_variant_t&operator=(longlSrc)throw(_com_error);_variant_t&operator=(floatfltSrc)throw(_com_error);_variant_t&operator=(doubledblSrc)throw(_com_error);_variant_t&operator=(constCY&cySrc)throw(_com_error);_variant_t&operator=(const_bstr_t&bstrSrc)throw(_com_error);_variant_t&operator=(constwchar_t*wstrSrc)throw(_com_error);_variant_t&operator=(constchar*strSrc)throw(_com_error);_variant_t&operator=(IDispatch*pDispSrc)throw(_com_error);_variant_t&operator=(boolbSrc)throw(_com_error);_variant_t&operator=(IUnknown*pSrc)throw(_com_error);_variant_t&operator=(constDECIMAL&decSrc)throw(_com_error);_variant_t&operator=(BYTEbSrc)throw(_com_error);有了以上两个函数,举个例子:
doublef=
1.0_variant_tv;v=f;//是合法的看看operator=的重载形式就知道了CStringstr="ddd"_variant_tv;v=str.AllocSysString()或者v=(_bstr_t)(char*)str;即可_variant_t转换成别的形式你首先必须确定你要转化成什么样的形式doublef;_variant_tvf=v.dblVal即可或者f=(double)v;也可以附:
_variant_t的操作符operatorshort()constthrow(_com_error);operatorlong()constthrow(_com_error);operatorfloat()constthrow(_com_error);operatordouble()constthrow(_com_error);operatorCY()constthrow(_com_error);operatorbool()constthrow(_com_error);operatorDECIMAL()constthrow(_com_error);operatorBYTE()constthrow(_com_error);operator_bstr_t()constthrow(_com_error);operatorIDispatch*()constthrow(_com_error);operatorIUnknown*()constthrow(_com_error);二:
CString->TCHAR*的转化可以用函数GetBuff()函数原型为:
LPTSTRGetBuffer(intnMinBufLength);CStringstr("CString");TCHAR*szMsg=newTCHAR[100];//其参数为CString字符串的长度szMsg=str.GetBuffer(str.GetLength());str.ReleaseBuffer();delete[]szMsg;szMsg=NULL;TCHAR*->CString的转化TCHARszTchar[18]=L"TCHAR";CStringstr;str.Format(_T("%s"),szTchar);CString和string的互相转换CString->std:
:
string例子:
CStringstrMfc="test";std:
:
stringstrStl;·CString变量str="2008北京奥运";buf=(LPSTR)(LPCTSTR)str;·BSTR变量BSTRbstrValue=:
:
SysAllocString(L"程序员");char*buf=_com_util:
:
ConvertBSTRToString(bstrValue);SysFreeString(bstrValue);AfxMessageBox(buf);delete(buf);·CComBSTR变量CComBSTRbstrVar("test");char*buf=_com_util:
:
ConvertBSTRToString(bstrVar.m_str);AfxMessageBox(buf);delete(buf);·_bstr_t变量_bstr_t类型是对BSTR的封装,因为已经重载了=操作符,所以很容易使用_bstr_tbstrVar("test");constchar*buf=bstrVar;///不要修改buf中的内容AfxMessageBox(buf);·通用方法(针对非COM数据类型)用sprintf完成转换·charbuffer[200];charc='1';inti=35;longj=1000;floatf=
1.f;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变量CStringname=temp;BSTR变量BSTRbstrValue=:
:
SysAllocString(L"程序员");...///完成对bstrValue的使用SysFreeString(bstrValue);·CComBSTR变量CComBSTR类型变量可以直接赋值CComBSTRbstrVar1("test");CComBSTRbstrVar2(temp);·_bstr_t变量_bstr_t类型的变量可以直接赋值_bstr_tbstrVar1("test");_bstr_tbstrVar2(temp);
三、其它数据类型转换到CString使用CString的成员函数Format来转换,例如:
整数(int)str.Format("%d",i);·浮点数(float)str.Format("%f",i);·字符串指针(char*)等已经被CString构造函数支持的数据类型可以直接赋值str=username;·对于Format所不支持的数据类型,可以通过上面所说的关于其它数据类型转化到char*的方法先转到char*,然后赋值给CString变量。
·
四、BSTR、_bstr_t与CComBSTR·CComBSTR是ATL对BSTR的封装,_bstr_t是C++对BSTR的封装,BSTR是32位指针,但并不直接指向字串的缓冲区。
char*转换到BSTR可以这样:
BSTRb=_com_util:
:
ConvertStringToBSTR("数据");///使用前需要加上comutil.h和comsupp.libSysFreeString(bstrValue);反之可以使用char*p=_com_util:
:
ConvertBSTRToString(b);deletep;具体可以参考一,二段落里的具体说明。
CComBSTR与_bstr_t对大量的操作符进行了重载,可以直接进行=,!
=,==等操作,所以使用非常方便。
特别是_bstr_t,建议大家使用它。
五、VARIANT、_variant_t与COleVariant·VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。
对于VARIANT变量的赋值:
首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:
VARIANTva;inta=2001;va.vt=VT_I4;///指明整型数据va.lVal=a;///赋值·_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
使用时需加上#include例如:
longl=222;ingi=100;_variant_tlVal(l);lVal=(long)i;·COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:
COleVariantv3="字符串",v4=(long)1999;CStringstr=(BSTR)v
3.pbstrVal;longi=v
4.lVal;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////·本主题演示如何将各种C++字符串类型转换为其他字符串。
可以转换的字符串类型包括char*、wchar_t*、_bstr_t、CComBSTR、CString、basic_string和System.String。
在所有情况下,在将字符串转换为新类型时,都会创建字符串的副本。
对新字符串进行的任何更改都不会影响原始字符串,反之亦然。
从char*转换示例说明此示例演示如何从char*转换为上面列出的其他字符串类型。
//convert_from_char.cpp//compilewith/clr/linkcomsuppw.lib#include#include#include#include"atlbase.h"#include"atlstr.h"#include"comutil.h"usingnamespacestd;usingnamespaceSystem;intmain(){char*orig="Hello,World!
";cout<