简单MFC计算器(字符串形式,基于vs2017 我的实验报告版本1.3)

上次说到我的MFC作业:
MFC计算器最简单版本(我的计算器1.1,和同学交流的结果)
MFC简单计算器(我的实验报告1.2版本)
实验内容:
可以在多个题目中选择一个:
1、编写一本通信录
2、模拟简单计算器√
3、简单的管理系统的设计:如人事、工资、学生成绩等。(要求部分功能实现)。
4、迷宫生成器

1.对实验结果进行分析
虽然我设计的MFC计算器,这是苦熬的2天3夜后结果,并没有很多花哨的功能,但把所有基本的功能都实现了,从实验的结果来看,实验结果与预期达到一致,实现了一些±*/这些功能,并且都是使用了极为简洁的代码,运用了CStringArray实现了多次计算,并且还注重了程序的完美。
按顺序添加控键代码,方便阅读和使用。这篇价值还是有的,觉得不错给个赞。但是,
其中是由bug的,但没时间和精力搞了,只能留给路过的大佬了,或者只能之后的自己搞了。就是kf 开方,我虽然实现了计算,但不能9kf+1或1+9kf的运算。要是大佬知道教一下小弟。
QQ号:1456084073

2、完成编写相关实验代码
①.整体框架的设计
1)首先,这个就是运行的可视化效果图
在这里插入图片描述

2)功能比较多,设置了2个编辑框,一个存放时间(打开软件的时间),一个是显示计算过程和结果。数据和运算符都是单行显示。最难的是控键的空行设置和传递值。
2)功能比较多,设置了2个编辑框,一个存放时间(打开软件的时间),一个是显示计算过程和结果。数据和运算符都是单行显示。最难的是控键的空行设置和传递值。
②.编写代码前的准备工作

在这里插入图片描述
在右边的编辑框添加变量,m_edit是控件,Cstring类型;m_edit_text是double类型的值。右边编辑框要改一下属性中的MultiLine 改为true,要可以换行。

③.代码的编写(主要的解释会在每个代码段里呈现)

增加头文件:#include<cmath>
控键0-9,按下面代码填写
void CMFCApplication11Dlg::OnBnClickedButton1()
{
	m_edit_text.Append(_T("1"));//编辑框页面增加‘1’
	UpdateData(FALSE);//显示到编辑框了
}
增加了Π和e的控键
void CMFCApplication11Dlg::OnBnClickedButton13()// Π
{
	// TODO: 在此添加控件通知处理程序代码
	m_edit_text.Append(_T("3.14159265359"));
	UpdateData(FALSE);
}

void CMFCApplication11Dlg::OnBnClickedButton11()//    e
{
	// TODO: 在此添加控件通知处理程序代码
	m_edit_text.Append(_T("2.718282"));
	UpdateData(FALSE);
}


小数点’.:

void CMFCApplication11Dlg::OnBnClickedButtonpoint()
{
	if (m_edit_text.Find(_T(".")) == -1) {
/* 加个判断,如果编辑框控键中数据中发现已有小数点,就不增加小数点*/
		m_edit_text.Append(_T("."));
	}
		UpdateData(FALSE);
}

完善功能键
+void CMFCApplication11Dlg::OnBnClickedButtonadd()
{
	m_edit_text.Append(_T("\r\n"));//‘+’和上个数据换行
	m_edit_text.Append(_T("+"));
	m_edit_text.Append(_T("\r\n"));//和下一行数据分隔开
	UpdateData(FALSE);
}
-void CMFCApplication11Dlg::OnBnClickedButtonsub()
{

	m_edit_text.Append(_T("\r\n"));
	m_edit_text.Append(_T("-"));
	m_edit_text.Append(_T("\r\n"));
	UpdateData(FALSE);
}
*void CMFCApplication11Dlg::OnBnClickedButtonmul()
{
	m_edit_text.Append(_T("\r\n"));
	m_edit_text.Append(_T("*"));
	m_edit_text.Append(_T("\r\n"));
	UpdateData(FALSE);
}
/void CMFCApplication11Dlg::OnBnClickedButtondiv()
{
	m_edit_text.Append(_T("\r\n"));
	m_edit_text.Append(_T("/"));
	m_edit_text.Append(_T("\r\n"));
	UpdateData(FALSE);
}

后退:

void CMFCApplication11Dlg::OnBnClickedButtonback()
{
	m_edit_text.Delete(m_edit_text.GetLength() - 1);
	UpdateData(FALSE);
}
清零:

void CMFCApplication11Dlg::OnBnClickedButtonclear()
{
	m_edit_text.Empty();
	UpdateData(false);
}
阶乘:


void CMFCApplication11Dlg::OnBnClickedButtonjiecheng()
{
	m_edit_text.Append(_T("\r\n"));
	m_edit_text.Append(_T("!"));
	UpdateData(FALSE);
}
Sin:

void CMFCApplication11Dlg::OnBnClickedButtonsin()
{
	m_edit_text.Append(_T("sin"));
	m_edit_text.Append(_T("\r\n"));
	UpdateData(FALSE);
}
Cos:
void CMFCApplication11Dlg::OnBnClickedButtoncos()
{
	m_edit_text.Append(_T("cos"));
	m_edit_text.Append(_T("\r\n"));
	UpdateData(FALSE);
}
Tan:

void CMFCApplication11Dlg::OnBnClickedButton31()
{
	m_edit_text.Append(_T("tan"));
	m_edit_text.Append(_T("\r\n"));
	UpdateData(FALSE);
}
%:
void CMFCApplication11Dlg::OnBnClickedButton30()//  %
{
	m_edit_text.Append(_T("\r\n"));
	m_edit_text.Append(_T("%"));
	UpdateData(FALSE);
}
About:

void CMFCApplication11Dlg::OnBnClickedButtonabout()
{
	CAboutDlg dlg;
	dlg.DoModal();
}
开方:
Kf:
void CMFCApplication11Dlg::OnBnClickedButtonkaifang()
{
	m_edit_text.Append(_T("\r\n"));
	m_edit_text.Append(_T("kf "));
	m_edit_text.Append(_T("\r\n"));
	UpdateData(FALSE);
}

开n次方:
Kn:
void CMFCApplication11Dlg::OnBnClickedButton26()
{
	m_edit_text.Append(_T("\r\n"));
	m_edit_text.Append(_T("kn"));
	m_edit_text.Append(_T("\r\n"));
	UpdateData(FALSE);
}
Log:


void CMFCApplication11Dlg::OnBnClickedButtonlog()
{
	m_edit_text.Append(_T("lg"));
	m_edit_text.Append(_T("\r\n"));
	UpdateData(FALSE);
}
Ln:

void CMFCApplication11Dlg::OnBnClickedButtonln()
{
	m_edit_text.Append(_T("ln"));
	m_edit_text.Append(_T("\r\n"));
	UpdateData(FALSE);
}
^:(几次方)

void CMFCApplication11Dlg::OnBnClickedButton12()
{
	m_edit_text.Append(_T("\r\n"));
	m_edit_text.Append(_T("^"));
	m_edit_text.Append(_T("\r\n"));
	UpdateData(FALSE);
}

e^n:
void CMFCApplication11Dlg::OnBnClickedButton29()//e^n
{
	m_edit_text.Append(_T("e^"));
	m_edit_text.Append(_T("\r\n"));
	UpdateData(FALSE);
}

最重要的是’=double a, b, c; CStringArray  arr;
void CMFCApplication11Dlg::OnBnClickedButtonequal()
{
	int i, nLineCount = m_edit.GetLineCount();//m_myEdit是与edit控件关联的变量
	//p = new int[nLineCount];
	/*CString h;
	h.Format(_T("%d"), nLineCount);
	MessageBox(h);*/
	CString strText;//, strLine;
	// Dump every line of text of the edit control.
	for (i = 0; i < nLineCount; i++)
	{
		int len = m_edit.LineLength(m_edit.LineIndex(i));	// length of line i:
		m_edit.GetLine(i, strText.GetBuffer(len), len);
		arr.SetAtGrow(i, strText);
	}

	int nLong = arr.GetSize();

	//  ^  !  sin  cos  tan   %  ^2   kf  kn  log   ln  e^n  

	for (i = 0; i < nLong; i++)
	{
		int len = arr[i].GetLength();
	// CHAR* tr = arr[i].GetBuffer(len);
		TCHAR* tr = arr[i].GetBuffer(len);
	     CString s;
********************************************************************^  !
		if (tr[0] == '^')
		{
			
				a = _ttof(arr[i - 1]);
				b = _ttof(arr[i + 1]);
				c = pow(a, b);
				s.Format(_T("%lf"), c);
				arr[i] = s;
				arr.RemoveAt(i + 1);
				arr.RemoveAt(i - 1);
			i = 0;
		}

		if (tr[0] == '!')
		{
			a = _ttof(arr[i - 1]);
			//b = _ttof(arr[i + 1]);
			double temp=1;
			for (int i = 1; i <= a; i++)
			{
				temp *= i;
			}
			c = temp;
			CString s;
			s.Format(_T("%lf"), c);
			arr[i] = s; //MessageBox(s);
			//arr.RemoveAt(i + 1);
			arr.RemoveAt(i - 1);
			i = 0;
		}

*************************sin cos  tan  % 
		if (tr[0] == 's')//按字符搜索,只能选运算符的第一个字母

		{
			//a = _ttof(arr[i - 1]);
			b = _ttof(arr[i + 1]);
		double	num = (b*3.1415926) / 180; c= sin(num);
			CString s;
			s.Format(_T("%lf"), c);
			arr[i] = s;
			arr.RemoveAt(i + 1); //MessageBox(arr[i]);
			//arr.RemoveAt(i - 1);
			//i = 0;
		}

		if (tr[0] == 'c')		{
			//a = _ttof(arr[i - 1]);
			b = _ttof(arr[i + 1]);
			double	num = (b*3.1415926) / 180; c = cos(num);
			CString s;
			s.Format(_T("%lf"), c);
			arr[i] = s; 
			arr.RemoveAt(i + 1);
			//arr.RemoveAt(i - 1);
			i = 0;
		}


		if (tr[0] == 't')
		{
			//a = _ttof(arr[i - 1]);
			b = _ttof(arr[i + 1]);
			double	num = (b*3.1415926) / 180; c = sin(num)/cos(num);
			CString s;
			s.Format(_T("%lf"), c);
			arr[i] = s; //MessageBox(arr[i]);
			arr.RemoveAt(i + 1);
			//arr.RemoveAt(i - 1);
			i = 0;
		}


		if (tr[0] == '%')
		{
			a = _ttof(arr[i - 1]);
			//b = _ttof(arr[i + 1]);
			c = a *0.01;
			CString s;
			s.Format(_T("%lf"), c);
			arr[i] = s;
			//arr.RemoveAt(i + 1);
			arr.RemoveAt(i - 1);
			i = 0;
		}
		
		
		*******************************kf kn 

		if (tr[0] == 'k'&&tr[1]=='f')
/*因为kf 和kn存在第一个字符一样会导致二义性,所以还要判断第二个字符*/
		{
			a = _ttof(arr[i - 1]);
		m_edit_text.Empty();	
		double f = _ttof(arr[0]);
			CString g;
			if (f - int(f) <= 1e-5)
			{
				g.Format(_T("%d"), (int)f);
			}
			else
			{
				g.Format(_T(" %f"), f);
			}
			m_edit_text.Append(g);
			m_edit_text.Append(_T("\r\n"));
			m_edit_text.Append(_T("kf"));
			UpdateData(FALSE);
			c = sqrt(a);
			CString s;
			s.Format(_T("%lf"), c);
			//arr[i-1] = s;
			//arr.RemoveAt(i + 1);
			arr.RemoveAll();
			arr.SetAtGrow(0, s);
			//arr.RemoveAt(i+1);
		}
		if (tr[0] == 'k'&&tr[1]=='n')
		{
			a = _ttof(arr[i - 1]);
			b = _ttof(arr[i + 1]);
			c = pow(a, 1/b);
			CString s;
			s.Format(_T("%lf"), c);
			arr[i] = s; 
			arr.RemoveAt(i + 1);
			arr.RemoveAt(i - 1);
			i = 0;
		}
******************ln和Ln
		if (tr[1] == 'g'&&tr[0]=='l')
		{
			//a = _ttof(arr[i - 1]);
			b = _ttof(arr[i + 1]);
			c = log10(b);
			CString s;
			s.Format(_T("%lf"), c);
			arr[i] = s;
			arr.RemoveAt(i + 1);
			//arr.RemoveAt(i - 1);
			
		}
		if (tr[1] == 'n'&&tr[0]=='l')
		{
			//a = _ttof(arr[i - 1]);
			b = _ttof(arr[i + 1]);
			c = log(b);
			CString s;
			s.Format(_T("%lf"), c);
			arr[i] = s;
			arr.RemoveAt(i + 1);
			//arr.RemoveAt(i - 1);
			i = 0;
		}

*******************************e^n
		if (tr[0] == 'e')
		{
			//a = _ttof(arr[i - 1]);
			b = _ttof(arr[i + 1]);
			c = exp(b);
			CString s;
			s.Format(_T("%lf"), c);
			arr[i] = s;
			arr.RemoveAt(i + 1);
			//arr.RemoveAt(i - 1);
			i = 0;
		}
		nLong = arr.GetSize();


	}
	
//  * 和/运算符

*********************************  * /
	for (i = 0; i < nLong; i++)
	{
		int len = arr[i].GetLength();
		TCHAR* tr = arr[i].GetBuffer(len);
		if (tr[0] == '*')
		{
			a = _ttof(arr[i - 1]);
			b = _ttof(arr[i + 1]);
			c = a * b;
			CString s;
			s.Format(_T("%lf"), c);
			arr[i] = s;
			arr.RemoveAt(i + 1);
			arr.RemoveAt(i - 1);
			i = 0;
		}
		if (tr[0] == '/')
		{
			a = _ttof(arr[i - 1]);
			b = _ttof(arr[i + 1]);
			if (b ==0) {
				MessageBox(_T("分母不为0"));
				c = 0;
			}
			c = a / b;
			CString s;
			s.Format(_T("%lf"), c);
			arr[i] = s;
			arr.RemoveAt(i + 1);
			arr.RemoveAt(i - 1);
			i = 0;
		}
		nLong = arr.GetSize();
	}


	//  +和-运算


	for (i = 0; i < nLong; i++)
	{
		int len = arr[i].GetLength();
		TCHAR* tr = arr[i].GetBuffer(len);
		arr[i].ReleaseBuffer();
		if (tr[0] == '+')
		{
			a = _ttof(arr[i - 1]);
			b = _ttof(arr[i + 1]);
			c = a + b;
			CString s;
			s.Format(_T("%lf"), c);
			arr[i] = s;
			arr.RemoveAt(i + 1);
			arr.RemoveAt(i - 1);
			arr.FreeExtra();
			i = 0;
		}
		if (tr[0] == '-')
		{
			a = _ttof(arr[i - 1]);
			b = _ttof(arr[i + 1]);
			c = a - b;
			CString s;
			s.Format(_T("%lf"), c);
			arr[i] = s;
			arr.RemoveAt(i + 1);
			arr.RemoveAt(i - 1);
			arr.FreeExtra();
			i = 0;
		}
		nLong = arr.GetSize();
	

		if (nLong == 1)//计算器编辑框数据只剩一位时,显示换行再“=”再换行显示结果
		{
			m_edit_text.Append(_T("\r\n"));
			m_edit_text.Append(_T("="));
			m_edit_text.Append(_T("\r\n"));
			CString s; 
			s = arr[0];
			double result = _ttof(s);
			if (result- int(result) <= 1e-5)
			{
				s.Format(_T("%d"), (int)result);
			}
			else
			{
				s.Format(_T(" %f"), result);
			}
			arr[0] = s;
			m_edit_text.Append(arr[0]);
			UpdateData(FALSE);
		}
	}
}

特效1:最小化:

void CMFCApplication11Dlg::OnBnClickedButton14()
{
	AfxGetMainWnd()->CloseWindow();
}

在这里插入图片描述
在这里插入图片描述

特效2:显示时间:
1.找到BOOL CMFCApplication11Dlg::OnInitDialog()函数,增加代码

BOOL CMFCApplication11Dlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	CString strTime;
	CTime tm;
	tm = CTime::GetCurrentTime();         //获取当前系统时间
	strTime = tm.Format("%y年%m月%d日 %X");   //格式化系统时间。即使系统时 间按照Format中设置的格式显示
	SetDlgItemText(IDC_EDIT4, strTime);        //初始化编辑框显示
	SetTimer(1, 1000, NULL);         //启动定时器

2.CMFCApplication11Dlg.h头文件里增加

afx_msg void CMFCApplication11Dlg::OnTimer(UINT_PTR nIDEvent);

在这里插入图片描述
3.再回到CMFCApplication11Dlg.cpp文件里

void CMFCApplication11Dlg ::OnTimer(UINT_PTR nIDEvent)
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值
	CString strTime;
	CTime tm;
	tm = CTime::GetCurrentTime();
	strTime = tm.Format("%Y-%m-%d %H:%M:%S");
	SetDlgItemText(IDC_EDIT4, strTime);        //显示系统时间
	CMFCApplication11Dlg::OnTimer(nIDEvent);
}

在这里插入图片描述
特效3:退出

void CMFCApplication11Dlg::OnBnClickedButtonononcancel()
{
	if (MessageBox(_T("确认退出"), _T(""), MB_YESNO | MB_ICONQUESTION) == IDYES) {
		this->SendMessage(WM_CLOSE);
	}
}

在这里插入图片描述

3、对本次实验要有总结
注意:要求在系统设计阶段对数据结构(主要是类的结构及类之间的联系)进行分析研究,充分利用面向对象的特性,使类结构尽可能合理和高效。
重要的函数:

1.m_edit_text.Append(_T("\r\n"));
2.m_edit_text.Delete(m_edit_text.GetLength() - 1);
3.m_edit_text.Empty();
4.int nLineCount = m_edit.GetLineCount();
5.Int  len = m_edit.LineLength(m_edit.LineIndex(i));//length of line i:
		6.m_edit.GetLine(i, strText.GetBuffer(len), len);
		7.arr.SetAtGrow(i, strText);
8.arr.RemoveAt(i + 1);
			arr.RemoveAt(i - 1);
9.arr.FreeExtra();

如文中:
for (i = 0; i < nLineCount; i++)
	{
		int len = m_edit.LineLength(m_edit.LineIndex(i));	// length of line i:
		m_edit.GetLine(i, strText.GetBuffer(len), len);
		arr.SetAtGrow(i, strText);
	}
10.if (f - int(f) <= 1e-5)
			{
				g.Format(_T("%d"), (int)f);
			}
			else
			{
				g.Format(_T(" %f"), f);
			}
把结果好看化,不需要“.000000”就去掉后面的,直接int化输出

按行字符串,存储再arr[i]中,CStringArray  arr;

——————————————————————————————————————
相关知识:(方便自己以后看的)

CStringArray--字符串数组类
CStringArray类支持CString对象数组。
在使用一个数组之前,使用SetSize来建立它的大小并给它分配内存。如果你不使用SetSize,则向数组中添加元素时将导致数组被频繁地拷贝和分配内存。频繁分配内存和拷贝会导致效率低和内存零碎。
如果你需要数组中个别字符串元素的转储,则应该将转储环境的深度设置为1或更大。当一个CString数组被删除时,或当其中的个别元素被删除时,字符串内存被根据需要释放。
CStringArray类成员
构造
CStringArray构造一个空的CString对象数组
绑定
GetSize 获取这个数组中的元素数目
SetSize 设置这个数组中包含的元素数目
GetUpperBound 返回最大的有效索引
操作符
FreeExtra 释放当前数组边界之外的未使用的所有内存
RemoveAll 从数组中删除所有元素
元素访问
GetAt 返回位于给定索引处的值
SetAt 设置给定索引处的元素的值;不得将数组增大
ElementAt 返回对数组中的某一元素指针的临时引用
GetData 对数组中的元素允许的访问。可以是NULL
扩大数组
SetAtGrow 设置给定索引处的值,如果必要的话可以增长数组
Add 在数组的末尾添加一个元素;可根据需要增长数组
Append 向数组中添加另一个数组;如果必要的话可增长数组
Copy 将另一个数组拷贝到此数组中;如果必要的话可增长数组
插入/删除
InsertAt 在指定索引处插入一个元素(或者是另一个数组中的所有元素)
RemoveAt 删除指定索引处的一个元素
操作符
operator [] 设置或获取在指定索引处的元素

相关函数:
1、构造函数(常用)

  CString( const unsigned char* psz );
  例:char s[]="abcdef";
          char* sp=s;
          CString csStr(sp);
  //csStr="abcdef"
  CString( LPCSTR lpsz );
  例:CString csStr("abcdef");
  //csStr="abcdef"
 CString( LPCWSTR lpsz );
 例: CString csStr(L"abcdef");
 //csStr=L"abcdef"
 CString( LPCTSTR lpsz );
 例: CString csStr(_T("abcdef"));
 //csStr=_T("abcdef")
 CString( LPCTSTR lpch,  int nLength );
 例:CString csStr("abcdef", 3);
 //csStr="abc"
 CString( TCHAR ch,  int nRepeat = 1 );
 例:CString csStr(_T('a'), 5);
 //csStr="aaaaa"

2、

int GetLength( ) const;
      unicode字符集下返回字符个数,ansi字符集下返回字符长度,不包含结尾的空字符。
      例:csStr="AB中文12";
      printf("%d",csStr.GetLength());       //UNICODE下为6,ANSI下为8

3、

int Find( TCHAR ch ) const;
      int Find( LPCTSTR lpszSub ) const;
      int Find( TCHAR ch, int nStart ) const;
      int Find( LPCTSTR pstr, int nStart ) const;
      查找字串,nStart为开始查找的位置。未找到匹配时返回-1,否则返回字串的开始位置
      例:csStr="abcdef";
              cout<<csStr.Find('b');       //1
              cout<<csStr.Find("de");      //3
              cout<<csStr.Find('b',3);     //-1
              cout<<csStr.Find('b',0);     //1
              cout<<csStr.Find("de",4);    //-1
              cout<<csStr.Find("de",0);    //3
      //当nStart超出对象末尾时,返回-1。
      //当nStart为负数时,返回-1。
      int FindOneOf( LPCTSTR lpszCharSet ) const;
      查找lpszCharSet中任意一个字符在CString对象中的匹配位置。未找到时返回-1,否则返回字串的开始位置
      例:csStr="abcdef";
              cout<<csStr.FindOneOf("cxy");      //2
      int ReverseFind( TCHAR ch ) const;
      从后向前查找第一个匹配,找到时返回下标。没找到时返回-1
      例:csStr="abba";
              cout<<csStr.ReverseFind('a');        //3

4、

CString SpanExcluding( LPCTSTR lpszCharSet ) const;
      返回与lpszCharSet中任意字符匹配的字符之前的子串(找到第一个匹配的字符就返回)
      例:csStr="abcdef";
              cout<<csStr.SpanExcluding("cf");    //ab
      CString SpanIncluding( LPCTSTR lpszCharSet ) const;
      查找与lpszCharSe中任意字符不匹配的字符,并返回不匹配字符之前的字串(找到第一个不匹配的字符就返回)
      例:csStr="abcdef";
              cout<<csStr.SpanIncluding("fdcba");    //abcd
      可以利用SpanIncluding这个特性来判断字符串的合法性,是否是我们要求的字符,比如是否全是数字构成的字符串:
      CString strTarget;
......
if ( strTarget == strTarget.SpanIncluding( _T("0123456789") ) ) 
{
// 字符串由数字构成,符合要求
......
}

5、

TCHAR GetAt( int nIndex ) const;
      返回下标为nIndex的字符,与字符串的[]用法相同
      例:csStr="abcdef";
              cout<<csStr.GetAt(2);             //c
      //当nIndex为负数或超出对象末尾时,会发生无法预料的结果。
      void SetAt( int nIndex, TCHAR ch );
      给下标为nIndex的字符重新赋值
      例:csStr="abcdef";
              csStr.SetAt(2,'x');
              cout<<csStr;                      //abxdef
      //当nIndex为负数或超出对象末尾时,会发生无法预料的结果。

6、

CString Left( int nCount ) const;
      从左取字串
      例:csStr="abcdef";
              cout<<csStr.Left(3);          //abc
      //当nCount等于0时,返回空。
      //当nCount为负数时,返回空。
      //当nCount大于对象长度时,返回值与对象相同。
      CString Right( int nCount ) const;
      从右取字串
      例:csStr="abcdef";
              cout<<csStr.Right(3);           //def
      //当nCount等于0时,返回空。
      //当nCount为负数时,返回空。
      //当nCount大于对象长度时,返回值与对象相同。
      CString Mid( int nFirst ) const;
      CString Mid( int nFirst, int nCount ) const;
      从中间开始取字串
      例:csStr="abcdef";
              cout<<csStr.Mid(2);           //cdef
              csStr="abcdef";
              cout<<csStr.Mid(2,3);         //cde
      //当nFirst为0和为负数时,从第一个字符开始取。
      //当nFirst等于对象末尾时,返回空字串。
      //当nFirst超出对象末尾时,会发生无法预料的结果。
      //当nCount超出对象末尾时,返回从nFirst开始一直到对象末尾的字串
      //当nCount为0和为负数时,返回空字串

7、

void Format( LPCTSTR lpszFormat, ... );
      void Format( UINT nFormatID, ... );
      格式化数据到CString对象,与C语言的sprintf函数用法类似
      例:csStr.Format("%d",13);
              cout<<csStr;                       //13

8、

void Empty( );
      清空
      例:csStr="abcdef";
              csStr.Empty();
              printf("%d",csStr.GetLength());    //0
      BOOL IsEmpty( ) const;
      测试对象是否为空,为空时返回零,不为空时返回非零
      例:csStr="abc";
              cout<<csStr.IsEmpty();         //0;
              csStr.Empty();
              cout<<csStr.IsEmpty();         //1;

9、

void MakeReverse( );
      颠倒字符串的顺序
      例:csStr="ABCDEF中文123456";
              csStr.MakeReverse();
              cout<<csStr;                  //654321文中FEDCBA
      void MakeUpper( );
      将小写字母转换为大写字母
      例:csStr="abcdef中文123456";
              csStr.MakeUpper();
              cout<<csStr;                  //ABCDEF中文123456
      void MakeLower( );
      将大写字母转换为小写字母
      例:csStr="ABCDEF中文123456";
              csStr.MakeLower();
              cout<<csStr;                  //abcdef中文123456

10、

int Compare( LPCTSTR lpsz ) const;
        区分大小写比较两个字符串,相等时返回0,大于时返回1,小于时返回-1
        例:csStr="abcdef中文123456";
                csStr2="ABCDEF中文123456";
                cout<<csStr.CompareNoCase(csStr2);             //0
        int CompareNoCase( LPCTSTR lpsz ) const;
        不区分大小写比较两个字符串,相等时返回0,大于时返回1,小于时返回-1
        例:csStr="abcdef中文123456";
        csStr2="ABCDEF中文123456";
        cout<<csStr.CompareNoCase(csStr2);             //-1
        CString对象的比较还可以通过==、!=<;、>;、<=>=等重载运算符实现。

11、

int Delete( int nIndex, int nCount = 1 )
        删除字符,删除从下标nIndex开始的nCount个字符
        例:csStr="ABCDEF";
                csStr.Delete(2,3);
                cout<<csStr;              // ABF
        //当nIndex过大,超出对像所在内存区域时,函数没有任何操作。
        //当nIndex为负数时,从第一个字符开始删除。
        //当nCount过大,导致删除字符超出对像所在内存区域时,会发生无法预料的结果。
        //当nCount为负数时,函数没有任何操作。

        int Insert( int nIndex, TCHAR ch )
        int Insert( int nIndex, LPCTSTR pstr )
        在下标为nIndex的位置,插入字符或字符串。返回插入后对象的长度
        例:csStr="abc";
                csStr.Insert(2,'x');
                cout<<csStr;                    //abxc
                csStr="abc";
                csStr.Insert(2,"xyz");
                cout<<csStr;                    //abxyzc
       //当nIndex为负数时,插入在对象开头
       //当nIndex超出对象末尾时,插入在对象末尾

       int Remove( TCHAR ch );
       移除对象内的指定字符。返回移除的数目
       例:csStr="aabbaacc";
               csStr.Remove('a');                cout<<csStr;                    //bbcc

        int Replace( TCHAR chOld, TCHAR chNew );
        int Replace( LPCTSTR lpszOld, LPCTSTR lpszNew );
        替换字串
        例:csStr="abcdef";
                csStr.Replace('a','x');
                cout<<csStr;                    //xbcdef
                csStr="abcdef";
                csStr.Replace("abc","xyz");
                cout<<csStr;                    //xyzdef

  12void TrimLeft( );
          void TrimLeft( TCHAR chTarget );
          void TrimLeft( LPCTSTR lpszTargets );
          从左删除字符,被删的字符与chTarget或lpszTargets中字符匹配,一直删到第一个不匹配的字符为止
          例:csStr="aaabaacdef";
                  csStr.TrimLeft('a');
                  cout<<csStr;                //baacdef
                  csStr="aaabaacdef";
                  csStr.TrimLeft("ab");
                  cout<<csStr;                //cdef
         //无参数时删除换行、空格、制表符。

         void TrimRight( );
         void TrimRight( TCHAR chTarget );
         void TrimRight( LPCTSTR lpszTargets );
         从右删除字符,被删的字符与chTarget或lpszTargets中字符匹配,一直删到第一个不匹配的字符为止
         例:csStr="abcdeaafaaa";
         csStr.TrimRight('a');
         cout<<csStr;               //abcdeaaf
         csStr="abcdeaafaaa";
         csStr.TrimRight("fa");
         cout<<csStr;                //abcde
        //无参数时删除换行、空格、制表符。
        void Trim( );
        void Trim( TCHAR chTarget );
        void Trim( LPCTSTR lpszTargets );
        从左和右删除字符,被删的字符与chTarget或lpszTargets中字符匹配,一直删到第一个不匹配的字符为止
        //无参数时删除换行、空格、制表符。

13、

LPTSTR GetBuffer( int nMinBufLength );
        获取内部字符缓冲区.返回LPTSTR类型指针。参数nMinBufLength指定缓冲区大小,参数为空则为原内部缓冲区大小。
        例:CString str;
               LPTSTR p = str.GetBuffer(100);
               _tcscpy(p, L"abc");
               str.ReleaseBuffer();
               int nLength = str.GetLength();//3
               cout << str;//"abc"
        //使用完GetBuffer后必须使用ReleaseBuffer以更新对象内部数据,CString对象的任 何方法都应在ReleaseBuffer之后调用。与GetBufferSetLength不同的是如果分配的空间大于实际保存的字符串('\0'结尾), ReleaseBuffer会把多余申请的空间释放。
       void ReleaseBuffer( int nNewLength = -1 );
       使用GetBuffer后必须使用ReleaseBuffer以更新对象内部数据,CString对象的任 何方法都应在ReleaseBuffer之后调用
       LPTSTR GetBufferSetLength( int nNewLength );
         获取内部字符缓冲区.返回LPTSTR类型指针。
    例: CString str;
           LPTSTR p = str.GetBufferSetLength(100);
           _tcscpy(p, L"abc");
           str.ReleaseBuffer();
           int nLength = str.GetLength();//3
           cout << str;//"abc"
    //使用完GetBuffer后不必再调用ReleaseBuffer
CStringArray类
CStringArray类支持CString对象数组,其类似于CObArray类,你可以参考关于CObArray的参考文件来获取CStringArray成员函数的详细说明。如果在说明中看到某一函数的返回值是一个指向CObject对象的指针,则可以用一个CString来代替它。

(函数查找来自https://www.cnblogs.com/milanleon/p/5623074.html)

编写一个如示例WinMain的Windows应用程序,其中窗口的背景色、光标、图标等属性可以设置成自己喜欢的风格。作为该示例的扩展,要求编程实现当在该窗口中单击右键时,播放一曲自己喜欢的音乐。(4学时) 编写一个如示例ExDlgCtl的MFC对话框应用程序,其中必须实现的功能包括: “对话框”菜单下的模态对话框、非模态对话框和文件对话框; “控件”菜单下的计算器、动态创建按钮、上网问卷调查、调整对话框背景色等四个对话框。 示例中的其它功能可以根据实际情况决定是否编写。(4学时) 3)编写一个如示例ExMenu的MFC菜单、工具栏和状态栏的应用程序,编写该实验时注意功能的完整性,包括两个菜单的切换、右键弹出式菜单、工具栏的切换、状态栏信息格的添加等功能。(4学时) 4)编写一个如示例ExDraw的MFC绘图应用程序,实现画点、线、矩形、椭圆等图形,并可以根据用户选择的画笔和画刷进行绘制,最后要求实现画笔的功能。(4学时) LRESULT CALLBACK WinProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ); int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // pointer to command line int nCmdShow // show state of window ) { WNDCLASS wndclas; wndclas.cbClsExtra=0; wndclas.cbWndExtra=0; wndclas.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wndclas.hCursor=LoadCursor(NULL,IDC_ARROW); wndclas.hIcon=LoadIcon(NULL,IDI_EXCLAMATION); wndclas.hInstance=hInstance; wndclas.lpfnWndProc=WinProc; wndclas.lpszClassName="ABCD"; wndclas.lpszMenuName=NULL; wndclas.style=CS_HREDRAW | CS_VREDRAW; RegisterClass(&wndclas;); void CTestView::OnDialogModal() //模态对话框 { // TODO: Add your command handler code here CTestDlg1 dlg; dlg.DoModal(); } void CTestView::OnDialogModalless()//非模态对话框 { // TODO: Add your command handler code here CTestDlg2 *pd=new CTestDlg2(); pd->Create(IDD_DIALOG2,this); pd->ShowWindow(SW_SHOW); } void CTestView::OnDialogFile() //文件对话框 {
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

广大菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值