吕鑫MFC学习系列二
来源:互联网 发布:金蝶软件常见问题 编辑:程序博客网 时间:2024/05/16 09:59
第二个学习的是CString的类成员的使用,这个类是非常重要的,重点学习一下。
成员函数学习:
1、CString::GetLength()
2、CString::Format()
在vs2013编译中碰到的问题,汉字的字符长度获取是一个字节和两个字节,要设置为多字节字符集。其他可能出现的字符问题可参考下面:
Windows使用两种字符集ANSI和UNICODE,
前者就是通常使用的单字节方式,但这种方式处理象中文这样的双字节字符不方便,容易出现半个汉字的情况。
而后者是双字节方式,方便处理双字节字符。
Windows NT的所有与字符有关的函数都提供两种方式的版本,而Windows 9x只支持ANSI方式。_T一般同字常数相关,如_T("Hello")。如果你编译一个程序为ANSI方式,_T实际不起任何作用。
而如果编译一个程序为UNICODE方式,则编译器会把"Hello"字符串以UNICODE方式保存。
_T()和_L()的区别在于,_L不管你是以什么方式编译,一律以以 UNICODE方式保存。
Visual C++里边定义字符串的时候,用_T来保证兼容性,VC支持ascii和unicode两种字符类型,用_T可以保证从ascii编码类型转换到unicode编码类型的时候,程序不需要修改。
如果将来你不打算升级到unicode,那么也不需要_T,
unicode,第个字符使用2个字节,包含了世界上几乎所有语言,每种语言的每一个字符在unicode里的值都是惟一的。
ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。标准 ASCII 码也叫基础ASCII码,使用 7 位二进制数来表示所有的大写和小写字母,数字 0 到 9、标点符号, 以及在美式英语中使用的特殊控制字符。不能适用于多语言平台。
按钮的代码实现:
void CstingMFCDlg::OnBnClickedGetlength(){CString str;GetDlgItemText(IDC_LEFT, str);int nLen = str.GetLength();str.Format("长度 = %d", nLen);SetDlgItemText(IDC_Result, str);}3、CString::IsEmpty()
代码实现:
void CstingMFCDlg::OnBnClickedIsempty(){CString str;GetDlgItemText(IDC_LEFT, str);BOOL b=str.IsEmpty();if (b)SetDlgItemText(IDC_Result, "是空字符串");elseSetDlgItemText(IDC_Result, "不是空字符串");}4、CString::operator +
代码实现:
void CstingMFCDlg::OnBnClickedAdd(){CString szLeft,szRight;GetDlgItemText(IDC_LEFT, szLeft);GetDlgItemText(IDC_RIGTH, szRight);SetDlgItemText(IDC_Result, szLeft + szRight);}5、CString::operator ==
代码实现:
void CstingMFCDlg::OnBnClickedEqual(){CString szLeft, szRight;GetDlgItemText(IDC_LEFT, szLeft);GetDlgItemText(IDC_RIGTH, szRight);if (szLeft == szRight)SetDlgItemText(IDC_Result, "相等");elseSetDlgItemText(IDC_Result, "不相等");}后面内容就没有了自己查资料学习实现按钮。
6、CString::Left()
CString
注:
代码实现:
void CstingMFCDlg::OnBnClickedLefft(){CString szLeft,szRight;GetDlgItemText(IDC_LEFT, szLeft);GetDlgItemText(IDC_RIGTH, szRight);int t = _ttoi(szRight);if (szLeft.GetLength() >=t){szLeft = szLeft.Left(t);SetDlgItemText(IDC_Result, szLeft);}elseAfxMessageBox("取出的个数超过了输入字符串的长度!");}7、CString::Mid()
CString
CString
代码实现:
void CstingMFCDlg::OnBnClickedMid(){CString szLeft, szRight;GetDlgItemText(IDC_LEFT, szLeft);GetDlgItemText(IDC_RIGTH, szRight);int t = _ttoi(szRight);if (szLeft.GetLength() >= t){szLeft = szLeft.Mid(t);SetDlgItemText(IDC_Result, szLeft);}elseAfxMessageBox("取出的个数超过了截取的长度!");}8、CString::Right()
CString
代码实现:
void CstingMFCDlg::OnBnClickedRight(){CString szLeft, szRight;GetDlgItemText(IDC_LEFT, szLeft);GetDlgItemText(IDC_RIGTH, szRight);int t = _ttoi(szRight);if (szLeft.GetLength() >= t){szLeft = szLeft.Right(t);SetDlgItemText(IDC_Result, szLeft);}elseAfxMessageBox("取出的个数超过了输入字符串的长度!");}9、CString::LoadString
BOOL LoadString( UINT nID );
throw( CMemoryException );
返回值:如果加载资源成功则返回非零值;否则返回0。
nID 一个Windows字符串资源ID。
说明:此成员函数用来读取一个由nID标识的Windows字符串资源,并放入一个已有CString对象中。
代码实现:
void CstingMFCDlg::OnBnClickedLoad(){CString szLeft;if (!szLeft.LoadString(IDC_LEFT))SetDlgItemText(IDC_Result, "加载成功!");elseSetDlgItemText(IDC_Result, "未加载成功!");}10、CString::MakeLower()
void MakeLower( ); //改变字符的小写
代码实现:
void CstingMFCDlg::OnBnClickedLower(){CString szLeft;GetDlgItemText(IDC_LEFT, szLeft);szLeft.MakeLower();SetDlgItemText(IDC_Result, szLeft);}11、CString::MakeReverse()
void MakeReverse( ); //字符倒置
代码实现:
void CstingMFCDlg::OnBnClickedReverse(){CString szLeft;GetDlgItemText(IDC_LEFT, szLeft);szLeft.MakeReverse();SetDlgItemText(IDC_Result, szLeft);}12、CString::MakeUpper()
void MakeUpper( ); //改变字符的大写
代码实现:void CstingMFCDlg::OnBnClickedUpper(){CString szLeft;GetDlgItemText(IDC_LEFT, szLeft);szLeft.MakeUpper();SetDlgItemText(IDC_Result, szLeft);}13、CString:Getbuffer()和Releasebuffer()
这两个函数比较难用,仔细阅读下面的区别:
CString::GetBuffer
LPTSTR GetBuffer( int nMinBufLength );
throw( CMemoryException );
返回值:一个指向对象的(以空字符结尾的)字符缓冲区的LPTSTR指针。
参数:nMinBufLength 字符缓冲区的以字符数表示的最小容量。这个值不包括一个结尾的空字符的空间。
说明:
此成员函数返回一个指向CString对象的内部字符缓冲区的指针。返回的LPTSTR不是const,因此可以允许直接修改CString的内容。
如果你使用由GetBuffer返回的指针来改变字符串的内容,你必须在使用其它的CString成员函数之前调用ReleaseBuffer函数。
在调用ReleaseBuffer之后,由GetBuffer返回的地址也许就无效了,因为其它的CString操作可能会导致CString缓冲区被重新分配。
如果你没有改变此CString的长度,则缓冲区不会被重新分配。
当此CString对象被销毁时,其缓冲区内存将被自动释放。
注意:如果你自己知道字符串的长度,则你不应该添加结尾的空字符。但是,当你用ReleaseBuffer来释放该缓冲区时,你必须指定最后的字符串长度。如果你添加了结尾的空字符,你应该给ReleaseBuffer的长度参数传递-1,ReleaseBuffer将对该缓冲区执行strlen来确定它的长度。ReleaseBuffer的作用就是更新字符串的长度。 CString内,GetLength获取字符串长度并不是动态计算的,而是在赋值操作后计算并保存在一个int变量内的,当通过GetBuffer直接修改CString时,那个int变量并不可能自动更新,于是便有了ReleaseBuffer.
代码实现:
void CstingMFCDlg::OnBnClickedRebuffer(){CString szLeft, szRight;GetDlgItemText(IDC_LEFT, szLeft);GetDlgItemText(IDC_RIGTH, szRight);LPSTR pf = szLeft.GetBuffer(100);strcpy(pf, szRight);int a = szLeft.GetLength();szLeft.ReleaseBuffer();int b = szLeft.GetLength();szLeft.Format("内容改变,缓存区未释放前的长度:%d", a);AfxMessageBox(szLeft);szLeft.Format("内容改变,缓存区释放后的长度:%d",b);AfxMessageBox(szLeft);}
14、CString::Remove()
int CString::Remove ( TCHAR ch );
返回值:返回从字符串中移走的字符数。如果字符串没有改变则返回零。
参数:ch 要从一个字符串中移走的字符。
说明:此成员函数用来将ch实例从字符串中移走。与这个字符的比较是区分大小写的。
代码实现:void CstingMFCDlg::OnBnClickedRemove(){CString szLeft, szRight;GetDlgItemText(IDC_LEFT, szLeft);GetDlgItemText(IDC_RIGTH, szRight);char *p = szRight.GetBuffer();szLeft.Remove(*p);SetDlgItemText(IDC_Result, szLeft);}15、CString::Replace()
int Replace( TCHAR chOld, TCHAR chNew );
int Replace( LPCTSTR lpszOld, LPCTSTR lpszNew );
返回值:返回被替换的字符数。如果这个字符串没有改变则返回零。
参数:chOld 要被chNew替换的字符。
chNew 要用来替换chOld的字符。
lpszOld 一个指向字符串的指针,该字符串包含了要被lpszNew替换的字符。
LpszNew 一个指向字符串的指针,该字符串包含了要用来替换lpszOld的字符。
说明:此成员函数用一个字符替换另一个字符。函数的第一个原形在字符串中用chNew
现场替换chOld。函数的第二个原形用lpszNew指定的字符串替换lpszOld指定
的子串。
在替换之后,该字符串有可能增长或缩短;那是因为lpszNew和lpszOld的长度
不需要是相等的。两种版本形式都进行区分大小写的匹配。
代码实现:void CstingMFCDlg::OnBnClickedReplace(){CString str,szLeft, szRight;GetDlgItemText(IDC_CHAR, str);GetDlgItemText(IDC_LEFT, szLeft);GetDlgItemText(IDC_RIGTH, szRight);TCHAR *p = szRight.GetBuffer();TCHAR *q = szLeft.GetBuffer();str.Replace(*q, *p);SetDlgItemText(IDC_Result, str);}
16、CString::ReverseFind()
int ReverseFind( TCHAR ch ) const;
返回值:返回此CString对象中与要求的字符匹配的最后一个字符的索引;如果没有找到需要的字符则返回-1。
参数: ch 要搜索的字符。
说明:此成员函数在此CString对象中搜索与一个子串匹配的最后一个字符。此函数类似于运行时函数strrchr。
代码实现:void CstingMFCDlg::OnBnClickedReversefind(){CString szLeft, szRight;GetDlgItemText(IDC_LEFT, szLeft);GetDlgItemText(IDC_RIGTH, szRight);char *p = szRight.GetBuffer();int i = szLeft.ReverseFind(*p);szLeft.Format("找到的最后一个索引为:%d", i);SetDlgItemText(IDC_Result, szLeft);}<span style="font-family:Microsoft YaHei;font-size:12px;"></span>
17、CString:: SetAt()
void SetAt( int nIndex, TCHAR ch );
说明:可以把字符串理解为一个数组,SetAt类似于[].注意nIndex的范围,如果不合适会有调试错误。 Ch 更替字符,把nIndex位置上的字符变成ch。
代码实现:
void CstingMFCDlg::OnBnClickedSetat(){CString str, szLeft, szRight;GetDlgItemText(IDC_CHAR, str);GetDlgItemText(IDC_LEFT, szLeft);GetDlgItemText(IDC_RIGTH, szRight);int t = _ttoi(szLeft);char *p = szRight.GetBuffer();str.SetAt(t, *p);SetDlgItemText(IDC_Result, str);}
18、CString::TrimLeft()
void TrimLeft( );
void CString::TrimLeft( TCHAR chTarget );
说明:TrimLeft方法的意义是:从字符串左边看起,遇到括号中出现的字符(参数)全部截去,直到出现第一个括号中未出现的字符时停止截除,即使后面又出现了参数中有的字符也不会截去了。
void CstingMFCDlg::OnBnClickedTrimleft(){CString szLeft, szRight;GetDlgItemText(IDC_LEFT, szLeft);GetDlgItemText(IDC_RIGTH, szRight);szLeft.TrimLeft(szRight);SetDlgItemText(IDC_Result, szLeft);}19、CString::TrimRight()
void TrimRight( );
void CString::TrimRight( TCHAR chTarget );
void CString::TrimRight( LPCTSTR lpszTargets );
说明:用法类似于上面。
void CstingMFCDlg::OnBnClickedTrimright(){CString szLeft, szRight;GetDlgItemText(IDC_LEFT, szLeft);GetDlgItemText(IDC_RIGTH, szRight);szLeft.TrimRight(szRight);SetDlgItemText(IDC_Result, szLeft);}20、CString::Compare()
int Compare( LPCTSTR lpsz ) const;
返回值:字符串一样返回0,小于lpsz 返回-1,大于lpsz 返回1,区分大小字符
void CstingMFCDlg::OnBnClickedCompare(){CString szLeft, szRight;GetDlgItemText(IDC_LEFT, szLeft);GetDlgItemText(IDC_RIGTH, szRight);int a=szLeft.Compare(szRight);if (a == 0)AfxMessageBox("输入的两个字符串相同!");else if (a == -1)AfxMessageBox("输入第一个字符串小于第二个字符串!");elseAfxMessageBox("输入第一个字符串大于第二个字符串!");}21、CString::CompareNoCase()
int CompareNoCase( LPCTSTR lpsz ) const;
返回值:字符串一样返回0,小于lpsz 返回-1,大于lpsz 返回1,不区分大小字符
代码实现:void CstingMFCDlg::OnBnClickedComparenocase(){CString szLeft, szRight;GetDlgItemText(IDC_LEFT, szLeft);GetDlgItemText(IDC_RIGTH, szRight);int a = szLeft.CompareNoCase(szRight);if (a == 0)AfxMessageBox("输入的两个字符串相同!");else if (a == -1)AfxMessageBox("输入第一个字符串小于第二个字符串!");elseAfxMessageBox("输入第一个字符串大于第二个字符串!");}22、CString::Collate()
int Collate( LPCTSTR lpsz ) const;
同CString::Compare
代码实现:void CstingMFCDlg::OnBnClickedCollate(){CString szLeft, szRight;GetDlgItemText(IDC_LEFT, szLeft);GetDlgItemText(IDC_RIGTH, szRight);int a = szLeft.Collate(szRight);if (a == 0)AfxMessageBox("输入的两个字符串相同!");else if (a == -1)AfxMessageBox("输入第一个字符串小于第二个字符串!");elseAfxMessageBox("输入第一个字符串大于第二个字符串!");}23、CString::Delete()
int Delete( int nIndex, int nCount = 1);
返回值:是被删除前的字符串的长度
nIndex是第一个被删除的字符,nCount是一次删除几个字符。根据我实验得出的结果:当nCount>要删除字符串的最大长度(GetCount() - nIndex)时会出错,当nCount过大,没有足够的字符删除时,此函数不执行。
代码实现:void CstingMFCDlg::OnBnClickedDelete(){CString str, szLeft, szRight;GetDlgItemText(IDC_CHAR, str);GetDlgItemText(IDC_LEFT, szLeft);GetDlgItemText(IDC_RIGTH, szRight);int t = _ttoi(szLeft);int p = _ttoi(szRight);str.Delete(t, p);SetDlgItemText(IDC_Result, str);}24、CString::Find()
int Find( TCHAR ch ) const;
int Find( LPCTSTR lpszSub ) const;
int Find( TCHAR ch, int nStart ) const;
int Find( LPCTSTR lpszSub, int nStart ) const;
返回值: 不匹配的话返回 -1; 索引以0开始; nStar代表以索引值nStart的字符开始搜索 ,
即为包含以索引nStart字符后的字符串.
代码实现:void CstingMFCDlg::OnBnClickedFind(){CString str, szLeft, szRight;GetDlgItemText(IDC_CHAR, str);GetDlgItemText(IDC_LEFT, szLeft);GetDlgItemText(IDC_RIGTH, szRight);int t = _ttoi(szRight);char *p = szLeft.GetBuffer();int n=str.Find(*p, t);str.Format("找出的索引:%d", n);SetDlgItemText(IDC_Result, str);}25、CString::FindOneOf()
int FindOneOf( LPCTSTR lpszCharSet ) const;
返回值: 不匹配的话返回 -1; 索引以0开始
注意::返回此字符串中第一个在lpszCharSet中也包括字符并且从零开始的索引值,查找lpszCharSet中任意一个字符在CString对象中的匹配位置。未找到时返回-1,否则返回字串的开始位置.
Find
用于查找某个字符或者字符串,返回的结果是匹配的第一个的位置
FindOneOf
就是指定多个字符串,然后查找匹配这些字符串其中一个的第一个的位置
void CstingMFCDlg::OnBnClickedFindoneof(){CString szLeft, szRight;GetDlgItemText(IDC_LEFT, szLeft);GetDlgItemText(IDC_RIGTH, szRight);LPCTSTR p = (LPCTSTR)szRight;int n = szLeft.FindOneOf(p);szLeft.Format("找出任意匹配的索引:%d", n);SetDlgItemText(IDC_Result, szLeft);}26、CString::GetAt()
TCHAR GetAt( int nIndex ) const;
返回值:返回标号为nIndex的字符,你可以把字符串理解为一个数组,GetAt类似于[].注意nIndex的范围,如果不合适会有调试错误。
代码实现:void CstingMFCDlg::OnBnClickedGetat(){CString szLeft, szRight;GetDlgItemText(IDC_LEFT, szLeft);GetDlgItemText(IDC_RIGTH, szRight);int t = _ttoi(szRight);char c = szLeft.GetAt(t);szLeft.Format("获取到的字符:%c",c);SetDlgItemText(IDC_Result, szLeft);}27、CString::Insert()
int Insert( int nIndex, TCHAR ch );
int Insert( int nIndex, LPCTSTR pstr );
返回值:返回修改后的长度,nIndex是字符(或字符串)插入后的索引号例子
代码实现:void CstingMFCDlg::OnBnClickedInsert(){CString str, szLeft, szRight;GetDlgItemText(IDC_CHAR, str);GetDlgItemText(IDC_LEFT, szLeft);GetDlgItemText(IDC_RIGTH, szRight);int t = _ttoi(szRight);szLeft.Insert(t, str);SetDlgItemText(IDC_Result, szLeft);}
28、CString::FreeExtra()
void FreeExtra( );
代码实现:
void CstingMFCDlg::OnBnClickedFreeextra(){CString szLeft;GetDlgItemText(IDC_LEFT, szLeft);LPTSTR temp = szLeft.GetBuffer(50);strcpy(temp, "there are 22 character");szLeft.ReleaseBuffer();szLeft.FreeExtra();AfxMessageBox("该字符串指向的长度为22,分配长度为50。执行FreeExtra()时,它会释放所分配的多余的内存。(长度为22,分配长度为22)");}
最后完成一个CString基本百分之八十的函数的调用实现,实现窗口如下图:
设计不是很完善,如有新增的按钮或者按钮的修改新想法,请留言非常感谢!
- 吕鑫MFC学习系列二
- 吕鑫MFC学习系列一
- 吕鑫MFC学习系列三
- 吕鑫MFC学习系列四
- 吕鑫MFC学习系列五
- 吕鑫MFC学习系列六
- 吕鑫MFC学习系列七
- 吕鑫MFC学习系列八
- 吕鑫MFC学习系列九
- 吕鑫MFC学习系列十
- DLL学习系列之二:非MFC动态链接库
- 学习MFC(二)
- MFC学习笔记二
- MFC学习笔记(二)
- MFC学习二
- MFC学习(二)
- VC精华教程MFC入门系列(二)
- MFC技术系列(二)--窗口消息(1)
- AndroidStudio 中使用Xutils3注解
- 二进制和十进制互转算法
- [文章摘要]Constructing knowledge from multivariate spatiotemporal data: integrating geographical visuali
- Python第三讲选择和循环
- iOS工具篇--CocoaPods
- 吕鑫MFC学习系列二
- python访问redis
- ListView setOnItemClickListen 方法无效
- 本地发博客的技巧
- hibernate之5大核心接口详解
- NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象
- Android Studio1.0升级到1.5编译报错的处理
- nginx篇(一)
- Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString cont