第一天,看了好多别人的,发现代码好多,有点晕,这个不会,只是不能简单计算,但是交作业是够了,要想深究,我下一篇博客是这个的改良版。上一篇是另一种方式。
效果还是有的,用到的函数很少,简单化,不需要设置控键相关的
一.代码区:
在打控键代码前,设置3个变量
double num1=0.0;
double num2=0.0;
double result = 0.0; int opt=0;
0-9的代码:参考下列改动:
void CMFCApplication10Dlg::OnBnClickedButton1()
{
CString cs;
GetDlgItemText(IDC_EDIT1, cs);
SetDlgItemText(IDC_EDIT1,cs+_T("1"));
}
功能键:
+:
void CMFCApplication10Dlg::OnBnClickedButton13()//+
{
// TODO: 在此添加控件通知处理程序代码
CString cs;
GetDlgItemText(IDC_EDIT1, cs);
num1 = _ttof(cs);//_tstoi(cs);
opt = 1; //"+";
SetDlgItemText(IDC_EDIT1, _T(" "));
}
-:
void CMFCApplication10Dlg::OnBnClickedButton14()//-
{
CString cs;
GetDlgItemText(IDC_EDIT1, cs);
num1 = _ttof(cs);//_tstoi(cs);
opt = 2; //"-";
SetDlgItemText(IDC_EDIT1, _T(" "));
}
void CMFCApplication10Dlg::OnBnClickedButton15()// *
{
// TODO: 在此添加控件通知处理程序代码
CString cs;
GetDlgItemText(IDC_EDIT1, cs);
num1 = _wtof(cs);//_tstoi(cs);
opt = 3;
SetDlgItemText(IDC_EDIT1, _T(" "));
}
/:
void CMFCApplication10Dlg::OnBnClickedButton16()// /
{
// TODO: 在此添加控件通知处理程序代码
CString cs;
GetDlgItemText(IDC_EDIT1, cs);
num1 = _ttof(cs);//_tstoi(cs);
opt = 4;
SetDlgItemText(IDC_EDIT1, _T(" "));
}
后退:
void CMFCApplication10Dlg::OnBnClickedButton10()//后退
{
CString cs;
GetDlgItemText(IDC_EDIT1, cs);
cs.Delete(cs.GetLength() - 1);
SetDlgItemText(IDC_EDIT1, cs);
}
清零:
void CMFCApplication10Dlg::OnBnClickedButton18()// AC 全清
{
CString cs;
num1 = 0.0; num2 = 0.0; result = 0.0;
SetDlgItemText(IDC_EDIT1, _T(" "));
UpdateData(false);
}
小数点:
void CMFCApplication10Dlg::OnBnClickedButton12()//小数点
{
CString cs;
GetDlgItemText(IDC_EDIT1, cs);
num1 = _ttof(cs);
if (cs.Find(_T(".")) == -1) {
SetDlgItemText(IDC_EDIT1, cs + _T("."));
}
opt = 8;
cs.Format(_T("%d"), num1);
}
void CMFCApplication10Dlg::OnBnClickedButton2pingfang()//平方
{
// TODO: 在此添加控件通知处理程序代码
CString cs;
GetDlgItemText(IDC_EDIT1, cs);
num1 = _ttof(cs); opt = 5;
double f = pow(num1,2);
//如果浮点数其实是个整数,就显示为整数
if (f - int(f) <= 1e-5)
{
cs.Format(L"%d", (int)f);
}
else
{
cs.Format(L"%f", f);
}
//SetDlgItemText(IDC_EDIT1, _T(" "));
num1 = f;
num2 = 0.0f;
}
开方:
void CMFCApplication10Dlg::OnBnClickedButtonkaifang()//开方
{
// TODO: 在此添加控件通知处理程序代码
CString cs;
GetDlgItemText(IDC_EDIT1, cs);
num1 = _ttof(cs); opt = 5;
double f = sqrt(num1);
//如果浮点数其实是个整数,就显示为整数
if (f - int(f) <= 1e-5)
{
cs.Format(L"%d", (int)f);
}
else
{
cs.Format(L"%f", f);
}
//SetDlgItemText(IDC_EDIT1, _T(" "));
num1 = f;
num2 = 0.0f;
}
Π:
void CMFCApplication10Dlg::OnBnClickedButton20()//pai
{
CString cs;
GetDlgItemText(IDC_EDIT1, cs);
SetDlgItemText(IDC_EDIT1, cs + _T("3.14159265359"));
}
关于:
void CMFCApplication10Dlg::OnBnClickedButtonabout()//关于
{
// TODO: 在此添加控件通知处理程序代码
CAboutDlg dlg;
dlg.DoModal();
}
^:
void CMFCApplication10Dlg::OnBnClickedButtonncifang()//^
{
// TODO: 在此添加控件通知处理程序代码
CString cs;
GetDlgItemText(IDC_EDIT1, cs);
num1 = _ttof(cs); opt = 6;
SetDlgItemText(IDC_EDIT1, _T(" "));
}
%:
void CMFCApplication10Dlg::OnBnClickedButton19()//%
{
CString cs;
GetDlgItemText(IDC_EDIT1, cs);
num1 = _ttof(cs); opt = 7;
}
开几次方:
void CMFCApplication10Dlg::OnBnClickedButton22()//开几次方
{
// TODO: 在此添加控件通知处理程序代码
CString cs;
GetDlgItemText(IDC_EDIT1, cs);
num1 = _ttof(cs); opt = 10;
SetDlgItemText(IDC_EDIT1, _T(""));
}
log:
void CMFCApplication10Dlg::OnBnClickedButton23()//log
{
// TODO: 在此添加控件通知处理程序代码
CString cs;
GetDlgItemText(IDC_EDIT1, cs); double num;
num1 = _ttof(cs); opt = 5; num = log10(num1); num1 = num;
SetDlgItemText(IDC_EDIT1, _T(" "));
}
ln:
void CMFCApplication10Dlg::OnBnClickedButton25()// ln
{
// TODO: 在此添加控件通知处理程序代码
CString cs;
GetDlgItemText(IDC_EDIT1, cs); double num;
num1 = _ttof(cs); opt = 5; num = log(num1); num1 = num;
SetDlgItemText(IDC_EDIT1, _T(" "));
}
e^n:
void CMFCApplication10Dlg::OnBnClickedButton24()//e^n
{
// TODO: 在此添加控件通知处理程序代码
CString cs;
GetDlgItemText(IDC_EDIT1, cs); double num;
num1 = _ttof(cs); opt = 5; num = exp(num1); num1 = num;
SetDlgItemText(IDC_EDIT1, _T(" "));
}
sin:
void CMFCApplication10Dlg::OnBnClickedButton27()//sin
{
// TODO: 在此添加控件通知处理程序代码
CString cs;
GetDlgItemText(IDC_EDIT1, cs); double num;
num1 = _ttof(cs); opt = 5; num = (num1*3.1415926)/180; num1 = sin(num);
SetDlgItemText(IDC_EDIT1, _T(" "));
}
cos:
void CMFCApplication10Dlg::OnBnClickedButton28()//cos
{
// TODO: 在此添加控件通知处理程序代码
CString cs;
GetDlgItemText(IDC_EDIT1, cs); double num;
num1 = _ttof(cs); opt = 5; num = (num1*3.1415926) / 180; num1 = cos(num);
SetDlgItemText(IDC_EDIT1, _T(" "));
}
n!:
void CMFCApplication10Dlg::OnBnClickedButton26()// n!
{
// TODO: 在此添加控件通知处理程序代码
CString cs;
GetDlgItemText(IDC_EDIT1, cs);
num1 = _ttof(cs); double num=1;
for (int i = 1; i <= num1; i++)
num *= i;
num1 = num;
opt = 5;
SetDlgItemText(IDC_EDIT1, _T(" "));
}
void CMFCApplication10Dlg::OnBnClickedButton17()// =
{
// TODO: 在此添加控件通知处理程序代码
CString cs;
GetDlgItemText(IDC_EDIT1, cs);
num2 = _ttof(cs);
switch (opt)
{
case 1: { result = num1 + num2; break; }
case 2:result = num1 - num2; break;
case 3:result = num1 * num2; break;
case 4:if (num2 == 0) {
result = num1;
MessageBox(_T("输入无效!"));
}
else {
result = num1 / num2;
}
break;
case 5:result = num1; break;
case 6: {
double f = pow(num1, num2);
//如果浮点数其实是个整数,就显示为整数
if (f - int(f) <= 1e-5)
{
cs.Format(L"%d", (int)f);
}
else
{
cs.Format(L"%f", f);
}
//SetDlgItemText(IDC_EDIT1, _T(" "));
num1 = f;
num2 = 0.0f;
result = num1;
} break;
case 7: result = num1 / 100; break;
case 8:
result = num2;
case 9:
result = num1;
break;
case 10:
result = pow(num1, 1 / num2);
default:break;
}
num1 = result; num2 = 0;
if (result - int(result) <= 1e-5)
{
cs.Format(L"%d", (int)result);
}
else
{
cs.Format(_T(" = %f"), result);
}
SetDlgItemText(IDC_EDIT1, cs);
num1 = 0;
num2 = 0; result =0.0;
}
退出键:
删掉确定键,把取消键名换成退出键名
分析:代码多,功能多,主要函数:
1. CString cs;
GetDlgItemText(IDC_EDIT1, cs);
num1 = _ttof(cs); double num=1;
SetDlgItemText(IDC_EDIT1, _T(" "));
中的GetDlgItemText()和SetDlgItemText()
原型:
*1* 、 int GetDlgItemText( HWND hDlg , int nID, LPTSTR lpStr, int nMaxCount) const;
*2* 、int GetDlgItemText( int nID, CString& rString) const;
分析函数结构:
GetDlgItemText 函数 用于获取对话框中指定控件的标题或文本。
UINT GetDlgItemText(HWND hDlg, int nIDDlgItem, LPTSTR lpString, int nMaxCount);
hDlg 窗口的句柄。
nIDDlgItem 指定控件的标识符(ID)。
lpString 指向用于接收获取结果的缓冲区的指针。
nMaxCount 指定允许拷贝到上述缓冲中的最大字符数(按 TCHAR 字符类型),如果字符串的长度(包含结束空字符)大于指定的最大字符数,则会被截断。
返回值
如果函数调用成功,返回值为拷贝到缓冲区中的 TCHAR 字符个数(不包括结束空字符)。
如果函数调用失败,返回值为 0 。要获取更多错误信息,请调用 GetLastError 函数。
说明 如果字符串的长度大于缓冲区的长度,则会被截断,并以空字符结束。GetDlgItemText 函数向控件发送一条 WM_GETTEXT 消息。在 ANSI 版本中,长度指的是字节数,在 Unicode 版本中,长度指的是字符的个数。
系统要求
动态链接库:user32.dll
头文件:在Winuser.h中定义,需包含Windows.h文件
库文件:User32.lib
GetDlgItemInt(int nID,BOOL *lpTrans=NULL,BOOL bSigned=TRUE)
第一个参数nID是控件的ID,
第二个参数,主要是为了接收错误信息
可能出现的错误信息有: ID无效,并且超过指定大小,比如说:ID为12345677,这个就不行.
还有就是输入不能解析为一个int类型的,比如输入:"bvbvbvbv","3.5666",
当然后面可以解析为一个浮点型,在这里取得的值为3,但是还是会有错误信息
如果不指定第二个参数,就不会获得任何错误信息,这个参数很有用的,对输入的判断是否可以解析为int类型或者是否有效,很有用的,我们经常有这个参数来判断用户的输入是否合法
参数3:默认的为true,主要是针对"-123",像这样的字符,它可以把前面的"-"解析为负号,那么就是标准的int类型了,如果设置为false,那么它不可以有
负数,因为在这里的"-"号,被认为是不合法的
用途如下:
BOOL flag;
UINT ui=GetDlgItemInt(IDC_EDIT1,&flag,true);
CString cs;
cs.Format("%d,%d",ui,flag);
MessageBox(cs);
(来自https://blog.csdn.net/zacklin/article/details/7454735)
*3* 、BOOLSetDlgltemText(HWND hDlg,int nlDDlgltem,LPCTSTR IpString);
参数编辑
hDlg:指定含有控件的对话框。
nlDDlgltem:标识带有将被设置的标题和文本的控件。
IpString:指向一个以NULL结尾的字符串指针,该字符串指针包含了将被复制到控件的文本。
返回值:如果函数调用成功,则返回值为非零值。如果函数调用失败,则返回值为零。若想获得更多的错误信息,请调用GetLastError函数。
使用例子编辑
CTime ctime=CTime::GetCurrentTime(); //得到当前系统时间
CString strTime=time.Format("%H:%M:%S");
::SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_TIME,strTime); //送到指定控件
在vc6.0以后的版本中不支持AfxGetMainWnd()->m_hWnd来获取HWND,所以需要把这一句改为:
SetDlgItemText(AfxGetApp()->m_pMainWnd->m_hWnd,IDC_TIME, strTime);
在VS中需要去掉第一个参数,直接SetDlgItemText(IDC_TIME, strTime);
备注:SetDlgltem函数把一个WM_SETTEXT消息发送到指定的控件。
(来自百度百科https://baike.baidu.com/item/SetDlgItemText/1856099?fr=aladdin)
2.cs.Format(L"%d", (int)f); num2 = _ttof(cs);类型转换,可以看我前2篇,有详解
3.num = exp(num1); 为e^n计算函数
后改进的版本: