吕鑫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 Left( int nCount const;  //从左边1开始获取前 nCount 个字符

注:

     在函数后面加 const 的意思是:

     如果一个类声明了一个常量对象,这个对象只能使用后边带 const 这个的方法.

代码实现:

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 Mid( int nCountconst;                      //从左边第 nCount+1 个字符开始,获取后面所有的字符

CString Mid( int nFirst, int nCount const;    //从左边第 nFirst+1 个字符开始,获取后面  nCount 个字符

代码实现:

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 Right( int nCount const;                  //从右边1开始获取从右向左前 nCount 个字符
代码实现:

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函数。 
在调用Release
Buffer之后,由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( );

释放CString对象之前声明的不在使用的多余的内存空间,

代码实现:

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基本百分之八十的函数的调用实现,实现窗口如下图:


设计不是很完善,如有新增的按钮或者按钮的修改新想法,请留言非常感谢!


0 1
原创粉丝点击