MFC+类型转换
- 格式:doc
- 大小:122.50 KB
- 文档页数:23
MFC中⽇期字符串的转换⼀、将字符串2011-08-1800:00:00转换为字符串2011-8-18,通过以下的函数CString DataDeleteZero(CString DATA){CStringstrmonth,strday,stryear;intyear=0,month=0,day=0;year=atoi(DATA.Mid(0,4));month=atoi(DATA.Mid(5,2));day=atoi(DATA.Mid(8,2));if(month<10)month=atoi(DATA.Mid(6,2));if(day<10)day=atoi(DATA.Mid(9,2));stryear.Format("%d",year);strmonth.Format("%d",month);strday.Format("%d",day);DATA=stryear+"-"+strmonth+"-"+strday;returnDATA;}⼆、MFC获得⽇期控件时间的cstring格式变量定义:CString strDate;COleDateTime ole_time;CTime c_time;1、CString转换为COleDateTimestrDate = "2009-4-25 12:30:29";ole_time.ParseDateTime(strDate);2、COleDateTime转换为CStringstrDate = ole_time.Format("%Y-%m-%d %H:%M:%S");3、COleDateTime转换为CTimeSYSTEMTIME sys_time;ole_time.GetAsSystemTime(sys_time);c_time = CTime(sys_time);4、CTime转换为COleDateTimeSYSTEMTIME sys_time;c_time.GetAsSystemTime(sys_time);ole_time = COleDateTime(sys_time);5、CTime转换为CStringCTime Time;Time.Format(“%Y-%m-%d”);得到的是2011-08-18格式的字符串时间Time.Format(“%y-%m-%d”);得到的是11-08-18格式的字符串时间,年份和上⾯不⼀样了Time.Format(“%Y-%#m-%#d”);得到的是2011-8-18格式的字符串时间,可以把⽉份与⽇的“0”去掉Time.Format("%Y-%m-%d %H:%M:%S");得到的是2011-8-18 00:00:00格式的字符串时间。
色彩鲜艳漂亮的高品质图像,一个个形象的Windows图标,高速运动、活灵活现的三维动画,这些生动的图形无一不显示着程序设计者的艺术才华。
在程序设计中,图像处理已经成了每个程序员的必修课,所以,对于每个程序员来说,熟悉“BMP”、“GIF”、“JPEG”图像格式及具体应用、调色板、图像文件头格式、图像压缩算法等概念似乎已经成了工作中不可缺少的基础知识。
面对如此多的图像格式,如果要全部掌握其具体细节,好像这对程序员有些不公。
在VC中编程显示一幅位图,下列的步骤是不可少的:装入位图、获得位图的大小信息、启用设备环境、位传输,所需的程序代码显得千篇一律的冗长。
如果想要装入的位图另存为其他格式的图像文件……?两个字:头疼!而这一切都是因为GDI本身的局限性所造成。
随着Windows2000的推出,上面的情况有了大大的改观:你可以不必了解每种图像格式的具体含义,照样可以写出多格式图像浏览或转换程序,这一切,全部都依赖于Windows 2000及后继版中所使用的GDI+技术。
首先来看看GDI+的具体技术细节及GDI+编程特点。
Windows2000在用户界面方面包括了几个重大的改进,可能你已经注意到了有阴影的鼠标、渐入的工具条快速提示、透明的窗口、平滑地窗口变化等。
Windows 2000在界面上之所以有这么大的改进,完全是因为Windows2000采用了一种GDI(graphicsdeviceinterface:图形设备接口)。
这种GDI,以前叫GDI2k,现在有了一个更好听的名字:GDI+。
GDI+是一种新型的图形设备接口,它的主要特点在于它能够创建全新的用户桌面体系、能够轻易地完成二维或三维的图形处理,为桌面带来一种数字化的图片。
GDI 同时也提供了增强的图形处理技术,如常见的:alphablending、纹理、贴图、增强的文本及图片显示技术。
实际上,GDI 主要的特色就在于强调通过硬件加速来达到良好的视觉感受!同传统的GDI不同,GDI+中引入了对COM(组件对象模型)技术的支持,通过COM技术,GDI+简化了对图像文件的访问(打开、保存)程序:通过调用COM组件来实现的,GDI+扮演的只是指挥者,而非操作员。
MFC视图切换全总结交流的朋友请加我QQ:451072182我的百度空间:/%BB%B6stephen/home单纯视图之间的切换单文档多视图切换是我在学习MFC中遇到的一个老大难问题,在今天总算是一一破解了。
我觉得视图切换分为三个等级,第一是在未切分窗格的情况下切换视图类;第二是在分割窗格的一个窗格内实行视图切换;第三是在分割窗格和未分割之间的切换和视图切换。
在MFC创建SDI的伊始,MFC默认的视图类是CView,如果CView 满足你的需求,可以直接单击finish,如果你不想让CView成为你的默认视图类,你可以在下图这个地方修改。
如果你忘记了修改默认的视图类这也没关系,我们可以在代码中改变:在App类里面有个函数叫InitInstance(),在这里面有一段代码CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(Cprogram8Doc),RUNTIME_CLASS(CMainFrame),RUNTIME_CLASS(CView1)); //这里更改你的默认视图类,注意不要忘记包含头文件哦if (!pDocTemplate)return FALSE;AddDocTemplate(pDocTemplate);说完了默认视图类的更改,我们现在进入主题。
1、首先创建你需要切换的视图类,AddClass进入或者创建一个控件然后AddClass创建控件关联类,后者适用于Form之类的控件。
2、控制之处,比如菜单项单击、单击鼠标什么的,我是使用菜单项来切换窗口的void CMainFrame::OnView1(){// TODO: Add your command handler code hereSwitchToForm(IDD_FORMVIEW1);}void CMainFrame::OnView2(){// TODO: Add your command handler code hereSwitchToForm(IDD_FORMVIEW2);}3、SwitchToForm这个函数主要用于视图切换在这个函数中主要做以下几个动作:1、获得当前视图类指针和需要转换的视图类指针,如果是第一次使用需要New一个,并且与文档类关联;2、改变活动视图;3、显示新视图和隐藏旧视图;4、设置控件ID;5、调整框架视图。
如何在MFC中其他类访问和交换文档Doc类与视图View类的数据在MFC的单文档里,每个类都有获得其他类指针的一套方法每个类都有获得其他类指针的一套方法.现归纳如下.为方便说明,现假设已用app wizard生成了一个SDI应用程序test,包含如下几个类: CT estApp,CTestDoc,CTestView,CMaimFrame 1:从视图类获得文档类指针如前所述,在视图类中需要引用文档类的地方之前,使用如下语句: CTestDoc *pDoc=(CTestDoc *)GetDocument();以后便可使用pDoc指针访问文档类.此处的强制类型转换在test应用程序中并不需要,因为该程序只有一个视图类,并且在InitInstance()重用SDI文档模板进行了装配.你可以在Test.cpp种的InitInstance()方法中看到如下语句:CSingleDocTemplate *pDocTemplate;pDocTemplate=newCSingleDocTemplate(IDR_MAINRAME,RUNTIME_CLASS(CTe stDoc),RUNTIME_CLASS(CMainFrame),RUNTIME_CLASS(CTestView));AddDocTemplate(pDocTemplate);以及TestView.h中的定义:inline CTestDoc *CTestView::GetDocument(){return (CTestDoc *)m_pDocument;}简而言之,就是说CT estView的GetDocument()函数自然而然的认为CTestDoc是与它"相配"的.当生成了一个具有多个视图类的应用程序时,(如用CSplitterWnd将窗口分为两栏,但这两栏并非从同一种视图类派生就属于这种情况。
具体实现在本文讨论范围之外),只有一个视图类能与唯一的文档类用文档模板进行装配,那么在另外一个未经装配的类中要取得文档类的指针,则需进行强制类型转换。
当我们谈到MFC(Microsoft Foundation Class)的十六进制字符串转十六进制数时,我们需要先了解MFC框架的作用和概念。
MFC是微软公司开发的一种应用程序框架,用于开发基于Windows操作系统的C++应用程序。
MFC提供了大量的类和函数,以便开发者能够更容易地创建Windows应用程序。
而十六进制字符串转十六进制数是在这个框架下的一个具体应用,它涉及到了字符转换、数值计算和字符串处理等方面。
让我们从简单的概念开始,了解什么是十六进制字符串和十六进制数。
十六进制字符串是由0-9和A-F组成的字符串,其中A-F分别代表10-15这六个数字。
而十六进制数则是用这些数字表示的数值。
在MFC框架下,我们通常会遇到需要将十六进制字符串转换为十六进制数的情况,这就需要我们对MFC中相关的函数和方法进行深入了解。
在MFC中进行十六进制字符串转十六进制数的操作,通常会借助于CString类或者CByteArray类的一些方法来实现。
而在具体的实现过程中,我们可能需要考虑到字符编码、格式验证、异常处理等方面的问题。
在处理十六进制字符串时,还需要注意其长度、前缀0x的处理、大小写的区分等情况。
这个过程涉及到了字符串的处理、十六进制的转换、数据的类型转换等多个方面的知识。
对于这个主题,我个人认为最重要的是深入理解MFC中提供的字符处理和数值处理相关的类和方法,掌握其使用方法和注意事项。
我在实际应用中也经常遇到这个问题,因此有着丰富的实践经验和心得体会。
我希望通过这篇文章,能够帮助读者更好地理解MFC框架下的十六进制字符串转十六进制数,并掌握相关的实际应用技巧。
在文章的我会总结和回顾这些技巧,并结合我的经验,提出一些建议和注意事项。
让读者在学习的能够更深刻地领悟这一知识点。
在整篇文章中,我将详细介绍相应的MFC类和方法,以及具体的代码实现,以便读者能够更具体地理解。
我也会结合一些实际的案例和应用场景,来帮助读者更好地掌握这一知识。
VC/MFC 时间格式转换和比较大小CString转为COleDateTime弄了好久终于完成了时间格式转换比较的问题,在这里分享下我的一点点经验吧,嘿嘿我用的数据库是SQL Server2005,数据库表中有一类型为smalldatetime的数据,用于存放发车时间(比如:2010-1-1 10:00:00)要求在VC++里面提取该时间并和当前系统时间进行比较,判断大小void CSaleDlg::OnBtnSurebuy(){// TODO: Add your control notification handler code hereUpdateData(TRUE);m_Editbc.TrimLeft();m_Editbc.TrimRight();CBus lt;if(!lt.IfExistId(m_Editbc)){MessageBox("该班次不存在,请重新输入!");return;}//////////////////////////////获得该班次发车时间CBus it;it.GetData(m_Editbc);CString str1 = "";str1+=it.GetRunTime();/////////////////////////////获得系统当前时间COleDateTime;COleDateTime datetime;datetime=COleDateTime::GetCurrentTime();CString str2=datetime.Format("%Y-%m-%d %H:%M:%S"); //设置系统时间格式,为了和数据库里时间格式一致////////////////////////////时间格式转换比较CString转为COleDateTime,COleDateTime类型的时间可以直接比较大小COleDateTime t;t.ParseDateTime( str1 ); //将表里的CString类型时间转换为COleDateTimeCOleDateTime p;p.ParseDateTime( str2 ); //将获得的系统时间CString型转为COleDateTime if( t<=p) //直接判断大小{MessageBox("该班次已发车!无法购票!");return;}。
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位指针。
MFC 替换的相关知识Edit by songshu E-Mail:pineyf@ QQ:120166808半导体设备中MFC 的应用非常多。
一般的时候,如果需要更换MFC ,直接用同厂家,同型号,同标定气体,同量程的MFC 就行了。
但是,如果遇到特殊情况,例如:手头上暂时没有同厂家的MFC 了(有相同标定气体,相同量程的其它厂家的MFC );或者有相同厂家,相同型号,相同量程,但是标定气体不同的MFC 。
或者其它情况。
那么,遇到这样的情况,作为EE ,大家应该如何解决?本人从事半导体设备维修,积累了一些经验。
与大家分享。
欢迎大家讨论。
如果有不对的地方请指教。
一般来说,MFC 的替换主要有以下两种情况:1.标定气体相同,量程相同。
但是不同的厂家。
需要解决的是接线问题。
因为不同厂家的MFC 的引脚和内部电路结构不同。
2.厂家相同,量程相同。
但是标定气体不同。
需要解决的问题是,不同气体的转换系数造成流量不同,所以要实际调节。
如图所示:两个MFC 为不同厂家生产,标定的气体不同(一个为N2,另一个为O2)。
量程也不同。
以下就MFC 替换的两种情况分别进行说明。
U n Re gi s t e r e d1.标定气体相同,量程相同。
但是不同的厂家。
有两个工作要做:1.因为不同厂家的MFC的引脚定义不同。
要把9针的D型插头里的引线进行改变。
2.由于不同厂家的MFC的内部电路结构不同。
必须要注意的是电源地的问题。
例如:设备原配的MFC是UNIT的。
由于UNIT MFC的电路结构,所以连接线只有5根:+15V -15V Set point (0-5V) Output (0-5V) Signal Common 0V。
但是,如果用STEC的MFC做替换,就必须把STEC MFC的Power Common 0V(电源地)接在Signal Common 0V (信号地)上。
如果STEC MFC的Power Common 0V(电源地)悬空,那么STEC MFC就不工作。
在MFC程序中,使用CString来处理字符串是一个很不错的选择。
CString既可以处理Unicode标准的字符串,也可以处理ANSI标准的字符串。
CString的Format 方法给我们进行字符串的转换带来了很大的方便,比如常见的int、float和double 这些数字类型转换为CString字符串只需一行代码就可以实现。
先看看Format用于转换的格式字符:%c 单个字符%d 十进制整数(int)%ld 十进制整数(long)%f 十进制浮点数(float)%lf 十进制浮点数(double)%o 八进制数%s 字符串%u 无符号十进制数%x 十六进制数1、int转换为CString:CString str;int number=15;//str="15"str.Format(_T("%d"),number);//str=" 15"(前面有两个空格;4表示将占用4位,如果数字超过4位将输出所有数字,不会截断)str.Format(_T("%4d"),number);//str="0015"(.4表示将占用4位,如果数字超过4位将输出所有数字,不会截断)str.Format(_T("%.4d"),number);long转换为CString的方法与上面相似,只需要把%d改为%ld就可以了。
2、double转换为CString:CString str;double num=1.46;//str="1.46"str.Format(_T("%lf"),num);//str="1.5"(.1表示小数点后留1位,小数点后超过1位则四舍五入)str.Format(_T("%.1lf"),num);//str="1.4600"str.Format(_T("%.4f"),num);//str=" 1.4600"(前面有1个空格)str.Format(_T("%7.4f"),num);float转换为CString的方法也同上面相似,将lf%改为f%就可以了。
MFC打开一个文件第1个回答CFileDialog文件选择对话框的使用:首先构造一个对象并提供相应的参数,构造函数原型如下:CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );参数意义如下:bOpenFileDialog 为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框。
lpszDefExt 指定默认的文件扩展名。
lpszFileName 指定默认的文件名。
dwFlags 指明一些特定风格。
lpszFilter 是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。
参数格式如:"Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";文件类型说明和扩展名间用| 分隔,同种类型文件的扩展名间可以用; 分割,每种文件类型间用| 分隔,末尾用|| 指明。
pParentWnd 为父窗口指针。
创建文件对话框可以使用DoModal(),在返回后可以利用下面的函数得到用户选择:CString CFileDialog::GetPathName( ) 得到完整的文件名,包括目录名和扩展名如:c: est est1.txt CString CFileDialog::GetFileName( ) 得到完整的文件名,包括扩展名如:test1.txtCString CFileDialog::GetExtName( ) 得到完整的文件扩展名,如:txtCString CFileDialog::GetFileTitle ( ) 得到完整的文件名,不包括目录名和扩展名如:test1 POSITION CFileDialog::GetStartPosition( ) 对于选择了多个文件的情况得到第一个文件位置。
mfc浮点数转字符串-回复题目:MFC浮点数转字符串:探索转化的实现与应用引言:在MFC开发中,将浮点数转化为字符串是一项常见的需求。
无论是用于显示数据、日志记录,还是进行数值计算,将浮点数转换为字符串格式都十分重要。
本文将提供一种基于MFC的解决方案,详细讲解浮点数转字符串的实现过程,并介绍在实际应用中的一些注意事项。
第一部分:理解浮点数在开始讨论浮点数转字符串的过程之前,我们首先需要理解浮点数的概念。
浮点数是一种表示实数的数据类型,由一个符号位、一定数量的有效数字位和一个表示量纲的指数位组成,一般可表示为a * 10^b的形式,其中a为有效数字,b为指数。
浮点数广泛应用于科学计算和工程领域,具有较高的精度和范围。
第二部分:浮点数转字符串的需求在MFC开发中,常常需要将浮点数转换为字符串以供显示、记录或计算。
例如,在开发绘图应用程序中,需要将坐标的浮点数表示转换为字符串以在界面上展示。
当进行日志记录时,也需要将浮点数转换为字符串以便于存储。
此外,在进行数值计算过程中,可能需要将结果转换为字符串格式以便于打印输出或后续处理。
第三部分:浮点数转字符串的实现步骤1. 导入MFC相关的头文件在MFC开发中,首先需要导入相关的头文件以便使用MFC提供的函数和类。
常见的头文件包括afx.h、atlstr.h等。
2. 定义浮点数变量在转换过程中,需要定义相应的浮点数变量,并赋予其初始值。
3. 使用format函数格式化转换MFC提供了CString类,其中的Format函数可用于将浮点数转换为字符串。
具体使用方式为:CString变量.Format(格式化字符串, 浮点数变量)。
例如,假设需要将浮点数d转换为字符串,可使用:CString str; str.Format("lf", d);4. 输出转换结果将转换后的字符串进行输出,并进行相关处理。
可以使用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变量。