mfc类型转换.docx

上传人:b****6 文档编号:15510301 上传时间:2023-07-05 格式:DOCX 页数:15 大小:19.36KB
下载 相关 举报
mfc类型转换.docx_第1页
第1页 / 共15页
mfc类型转换.docx_第2页
第2页 / 共15页
mfc类型转换.docx_第3页
第3页 / 共15页
mfc类型转换.docx_第4页
第4页 / 共15页
mfc类型转换.docx_第5页
第5页 / 共15页
mfc类型转换.docx_第6页
第6页 / 共15页
mfc类型转换.docx_第7页
第7页 / 共15页
mfc类型转换.docx_第8页
第8页 / 共15页
mfc类型转换.docx_第9页
第9页 / 共15页
mfc类型转换.docx_第10页
第10页 / 共15页
mfc类型转换.docx_第11页
第11页 / 共15页
mfc类型转换.docx_第12页
第12页 / 共15页
mfc类型转换.docx_第13页
第13页 / 共15页
mfc类型转换.docx_第14页
第14页 / 共15页
mfc类型转换.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

mfc类型转换.docx

《mfc类型转换.docx》由会员分享,可在线阅读,更多相关《mfc类型转换.docx(15页珍藏版)》请在冰点文库上搜索。

mfc类型转换.docx

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<

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2