基于MFC框架的计算器小程序
MFC介绍:
MFC(Microsoft Foundation Classes)是微软公司开发的一组C++类库,旨在简化Windows应用程序的开发。它提供了一系列用于创建和管理图形用户界面(GUI)的类和函数,为开发人员提供了丰富的工具和资源,用于构建功能强大的Windows应用程序。
我使用Visual Studio 2022的MFC模板开发的我的计算器.exe应用程序。老师让加减乘除,自作了主张,多添加了一些计算方式。因为这样就感觉比较完整了。
流程图:
在visual studio 上创建项目
就可以创建一个空白的MFC应用了。
源码链接:https://cowtransfer.com/s/c974df66cb5346
口令:33cp7m
1.首先在控件头文件test_computerDlg.h中用枚举创建一些符号常量指代各种运算。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | enum Calculator_Flag { FLAG_JIA, FLAG_JIAN, FLAG_CHENG, FLAG_CHU, FLAG_NFANG, //n方 FLAG_KAINFANG, //开n方 FLAG_PINGFANG, //平方 FLAG_KAIFANG, //开方 FLAG_LIFANG, //立方 FLAG_KAILIFANG, //开立方 FLAG_EX, //e的x次方 FLAG_SIN, //正弦 FLAG_COS, //余弦 FLAG_TAN, //正切 FLAG_MOD, //模运算 FLAG_N, //n的阶乘 FLAG_LNX, //以10为低的对数 FLAG_LOGNX, //对数运算 FLAG_HD, //十六进制到十进制 FLAG_OD, //八进制到十进制 FLAG_BD, //二进制到十进制 FlAG_HEX, //十六进制 FLAG_OCT, //八进制 FLAG_BIN //二进制 }; |
2.接着在控件类CtestcomputerDlg声明输入框的变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | private : //将变量声明在private中体现了类的封装特性 CString mStr; //编辑框1内的字符串 CString mStr1; //编辑框2内的字符串 CString mStr2; CString mStr3; CString mStr4; CString mStr5; CString mStr6; CString mStr7; CString mStr8; CString mTempStr; ///中间变量 double mNum1; //运算数 double mNum2; Calculator_Flag mFlag; //运算符号 |
3.接着在CtestcomputerDlg::DoDataExchange函数中将用户界面的输入框与变量相关联
1 2 3 4 5 6 7 8 9 10 11 12 13 | void CtestcomputerDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, mStr); //将mStr变量与输入框IDC_EDIT1关联 DDX_Text(pDX, IDC_EDIT2, mStr1); DDX_Text(pDX, IDC_EDIT3, mStr2); DDX_Text(pDX, IDC_EDIT4, mStr3); DDX_Text(pDX, IDC_EDIT5, mStr4); DDX_Text(pDX, IDC_EDIT6, mStr5); DDX_Text(pDX, IDC_EDIT7, mStr6); DDX_Text(pDX, IDC_EDIT8, mStr7); DDX_Text(pDX, IDC_EDIT9, mStr8); } |
4.定义每个按钮的点击函数
直接在这个界面上拖动来实现页面布局。
其中主要用到了工具箱里面的Button,Edit Control这两个,有8个Edit Control编辑框和45个按钮以及一个Static text用于显示历史记录四个静态文本。
在上面页面的每个按钮控件上双击,就自动在class CtestcomputerDlg : public CDialogEx这个类里面的public部分生成了相应的函数声明。
然后自己就需要在text_computerDlg.cpp控件实现文件中实现这些函数的定义。
例如双击 返回 这个按钮。将会在text_computerDlg.h文件的class CtestcomputerDlg : public CDialogEx类里面的public部分(函数是类对外部提供的接口)生成一个afx_msg void OnBnClickedButton1();的声明。
现在就需要在text_computerDlg.cpp中定义这个函数:
1 2 3 4 5 6 7 8 9 | void CtestcomputerDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); if (!mStr.IsEmpty()) { //判断是否为空,若不空,则 mStr = mStr.Left(mStr.GetLength() - 1); //去掉字符串最后一个字符,left从左边开始取 } UpdateData(FALSE); } |
以次完成45个函数的声明以及定义,。
5.声明并定义下面这两个函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | void SaveFirstValue(); //保存第一个输入值--------------------------------------------在控件类头文件中声明 void CtestcomputerDlg::SaveFirstValue()------------------------在控件类的实现文件中定义 { UpdateData(TRUE); mNum1 = _wtof(mStr); //第一个运算数 mTempStr = mStr; //中间变量 为了构建历史记录 mStr = L "" ; //至空输入框 为了输入第二个运算数 UpdateData(FALSE); } void Calculator(); //计算 ---------------------------------------在控件类头文件中声明 void CtestcomputerDlg::Calculator()---------------------------在控件类的实现文件中定义 { UpdateData(TRUE); mNum2 = _wtof(mStr); //第二个运算数 _wtof把字符串内容转换为浮点数 double result = 0.0f; //用来存放计算结果 switch (mFlag) { case FLAG_JIA: //加 result = mNum1 + mNum2; //进行加运算 mTempStr = mTempStr + _T( "+" ) + mStr + _T( "=" ); //历史记录中 break ; case FLAG_JIAN: //减 result = mNum1 - mNum2; mTempStr = mTempStr + _T( "-" ) + mStr + _T( "=" ); break ; case FLAG_CHENG: //乘 result = mNum1 * mNum2; mTempStr = mTempStr + _T( "*" ) + mStr + _T( "=" ); break ; case FLAG_CHU: //除 if (mNum2 = 0) { mTempStr = _T( "除0错误" ); } else { result = mNum1 / mNum2; mTempStr = mTempStr + _T( "/" ) + mStr + _T( "=" ); } break ; case FLAG_NFANG: // n次方 result = pow (mNum1, 1.0/mNum2); mTempStr = mTempStr + _T( "^" ) + mStr + _T( "=" ); break ; case FLAG_KAINFANG: //开n方 result = pow (mNum1, mNum2); mTempStr = mTempStr + _T( "^" ) + mStr + _T( "=" ); break ; case FLAG_MOD: //模运算 result = ( int )mNum1 % ( int )mNum2; //模运算必须是整数 mTempStr = mTempStr + _T( "%" ) + mStr + _T( "=" ); break ; case FLAG_LOGNX: //对数运算 result = log (mNum2) / log (mNum1); mTempStr = _T( "log" ) + mTempStr + _T( "(" ) + mStr + _T( ")" ) + _T( "=" ); break ; case FLAG_PINGFANG: //平方 result = mNum2 * mNum2; mTempStr = mStr + _T( "^2=" ); break ; case FLAG_KAIFANG: //开平方 result = sqrt (mNum2); mTempStr = _T( "根号" ) + mStr + _T( "=" ); break ; case FLAG_LIFANG: //立方 result = mNum2 * mNum2 * mNum2; mTempStr = mStr + _T( "^3=" ); break ; case FLAG_KAILIFANG: //开立方 result = pow (mNum2, 1.0 / 3); mTempStr = _T( "开立方" ) + mStr + _T( "=" ); break ; case FLAG_SIN: // 正弦 result = sin (mNum2); mTempStr = _T( "sin(" ) + mStr + _T( ")=" ); break ; case FLAG_COS: //余弦 result = cos (mNum2); mTempStr = _T( "cos(" ) + mStr + _T( ")=" ); break ; case FLAG_TAN: //正切 result = tan (mNum2); mTempStr = _T( "tan(" ) + mStr + _T( ")=" ); break ; case FLAG_EX: //e的x次方 { double e = exp (1.0); result = pow (e, mNum2); mTempStr = _T( "e^" ) + mStr + _T( "=" ); } break ; case FLAG_N: //计算n的阶乘 { int n = ( int )mNum2; if (n == 0) { result = 1; mTempStr = mStr + _T( "!=" ); } else if (n < 0) { mTempStr = _T( "负数没有阶乘" ); } else { result = 1; for ( int i = 1; i <= n; i++) { result *= i; } mTempStr = mStr + _T( "!=" ); } } break ; default : break ; } if (result - ( int )result <= 1e-5) //如果结果是整数 { mStr.Format(L "%d" , ( int )result); //以整数形式显示 } else { mStr.Format(L "%f" , result); //以小数形式显示 } mTempStr += mStr; //将结果与表达式拼接 mStr8 = mStr7; mStr7 = mStr6; mStr6 = mStr5; mStr5 = mStr4; mStr4 = mStr3; mStr3 = mStr2; mStr2 = mStr1; mStr1 = mTempStr; UpdateData(FALSE); mNum1 = result; mNum2 = 0.0f; } |
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
在编写时需要注意的是单目运算符与双目运算符的区别就可以了:单目运算在点击一个数字后,在点击运算符,然后点击第二个数字。双目运算符需要先输入第一个数字,再输入运算符,然后点击=按钮。这个等于按钮会调用 ”计算” 函数。单目运算符点击后只执行 mFlag = 运算符代表的枚举量,而双目运算符点击后会先获取第一个数字“SaveFirstValue()”,然后执行mFlag = 运算符代表的枚举量。
通过以上步骤就基本完成了基于MFC框架的用C++语言实现的计算器小程序。太多了,,,,,主要计算过程都是在最后这个”计算“函数中实现的。对于老师说的那个什么牛顿的还没有实现。另外进制
之间的转换还未完成。以下是实际情况。
页面左边是历史记录,最近计算结果会优先显示再第一行,右边是计算器主要按钮。
由于开平方的这个根号键盘上没法输入,就利用 “/” 代替,,第一行是进制转换,第二行是十六进制数。第三行是幂运算与开方运算。
以下是主要实现代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 | // test_computerDlg.cpp: 实现文件 // #include "pch.h" #include "framework.h" #include "test_computer.h" #include "test_computerDlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public : CAboutDlg(); // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_ABOUTBOX }; #endif protected : virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected : DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX) { } //关于对话框 void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CtestcomputerDlg 对话框 CtestcomputerDlg::CtestcomputerDlg(CWnd* pParent /*=nullptr*/ ) : CDialogEx(IDD_TEST_COMPUTER_DIALOG, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } //用户界面中的输入框与其变量关联 void CtestcomputerDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, mStr); //将mStr变量与输入框IDC_EDIT1关联 DDX_Text(pDX, IDC_EDIT2, mStr1); DDX_Text(pDX, IDC_EDIT3, mStr2); DDX_Text(pDX, IDC_EDIT4, mStr3); DDX_Text(pDX, IDC_EDIT5, mStr4); DDX_Text(pDX, IDC_EDIT6, mStr5); DDX_Text(pDX, IDC_EDIT7, mStr6); DDX_Text(pDX, IDC_EDIT8, mStr7); DDX_Text(pDX, IDC_EDIT9, mStr8); } BEGIN_MESSAGE_MAP(CtestcomputerDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON6, &CtestcomputerDlg::OnBnClickedButton6) ON_BN_CLICKED(IDC_BUTTON43, &CtestcomputerDlg::OnBnClickedButton43) ON_BN_CLICKED(IDC_BUTTON42, &CtestcomputerDlg::OnBnClickedButton42) ON_BN_CLICKED(IDC_BUTTON36, &CtestcomputerDlg::OnBnClickedButton36) ON_BN_CLICKED(IDC_BUTTON37, &CtestcomputerDlg::OnBnClickedButton37) ON_BN_CLICKED(IDC_BUTTON38, &CtestcomputerDlg::OnBnClickedButton38) ON_BN_CLICKED(IDC_BUTTON30, &CtestcomputerDlg::OnBnClickedButton30) ON_BN_CLICKED(IDC_BUTTON31, &CtestcomputerDlg::OnBnClickedButton31) ON_BN_CLICKED(IDC_BUTTON32, &CtestcomputerDlg::OnBnClickedButton32) ON_BN_CLICKED(IDC_BUTTON24, &CtestcomputerDlg::OnBnClickedButton24) ON_BN_CLICKED(IDC_BUTTON25, &CtestcomputerDlg::OnBnClickedButton25) ON_BN_CLICKED(IDC_BUTTON26, &CtestcomputerDlg::OnBnClickedButton26) ON_BN_CLICKED(IDC_BUTTON1, &CtestcomputerDlg::OnBnClickedButton1) ON_BN_CLICKED(IDC_BUTTON3, &CtestcomputerDlg::OnBnClickedButton3) ON_BN_CLICKED(IDC_BUTTON2, &CtestcomputerDlg::OnBnClickedButton2) ON_BN_CLICKED(IDC_BUTTON45, &CtestcomputerDlg::OnBnClickedButton45) ON_BN_CLICKED(IDC_BUTTON44, &CtestcomputerDlg::OnBnClickedButton44) ON_BN_CLICKED(IDC_BUTTON10, &CtestcomputerDlg::OnBnClickedButton10) ON_BN_CLICKED(IDC_BUTTON11, &CtestcomputerDlg::OnBnClickedButton11) ON_BN_CLICKED(IDC_BUTTON12, &CtestcomputerDlg::OnBnClickedButton12) ON_BN_CLICKED(IDC_BUTTON13, &CtestcomputerDlg::OnBnClickedButton13) ON_BN_CLICKED(IDC_BUTTON14, &CtestcomputerDlg::OnBnClickedButton14) ON_BN_CLICKED(IDC_BUTTON15, &CtestcomputerDlg::OnBnClickedButton15) ON_BN_CLICKED(IDC_BUTTON39, &CtestcomputerDlg::OnBnClickedButton39) ON_BN_CLICKED(IDC_BUTTON33, &CtestcomputerDlg::OnBnClickedButton33) ON_BN_CLICKED(IDC_BUTTON27, &CtestcomputerDlg::OnBnClickedButton27) ON_BN_CLICKED(IDC_BUTTON21, &CtestcomputerDlg::OnBnClickedButton21) ON_BN_CLICKED(IDC_BUTTON20, &CtestcomputerDlg::OnBnClickedButton20) ON_BN_CLICKED(IDC_BUTTON19, &CtestcomputerDlg::OnBnClickedButton19) ON_BN_CLICKED(IDC_BUTTON18, &CtestcomputerDlg::OnBnClickedButton18) ON_BN_CLICKED(IDC_BUTTON17, &CtestcomputerDlg::OnBnClickedButton17) ON_BN_CLICKED(IDC_BUTTON16, &CtestcomputerDlg::OnBnClickedButton16) ON_BN_CLICKED(IDC_BUTTON23, &CtestcomputerDlg::OnBnClickedButton23) ON_BN_CLICKED(IDC_BUTTON34, &CtestcomputerDlg::OnBnClickedButton34) ON_BN_CLICKED(IDC_BUTTON41, &CtestcomputerDlg::OnBnClickedButton41) ON_BN_CLICKED(IDC_BUTTON35, &CtestcomputerDlg::OnBnClickedButton35) ON_BN_CLICKED(IDC_BUTTON29, &CtestcomputerDlg::OnBnClickedButton29) ON_BN_CLICKED(IDC_BUTTON28, &CtestcomputerDlg::OnBnClickedButton28) ON_BN_CLICKED(IDC_BUTTON40, &CtestcomputerDlg::OnBnClickedButton40) ON_BN_CLICKED(IDC_BUTTON22, &CtestcomputerDlg::OnBnClickedButton22) ON_BN_CLICKED(IDC_BUTTON4, &CtestcomputerDlg::OnBnClickedButton4) ON_BN_CLICKED(IDC_BUTTON5, &CtestcomputerDlg::OnBnClickedButton5) ON_BN_CLICKED(IDC_BUTTON7, &CtestcomputerDlg::OnBnClickedButton7) ON_BN_CLICKED(IDC_BUTTON8, &CtestcomputerDlg::OnBnClickedButton8) ON_BN_CLICKED(IDC_BUTTON9, &CtestcomputerDlg::OnBnClickedButton9) END_MESSAGE_MAP() // CtestcomputerDlg 消息处理程序 BOOL CtestcomputerDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != nullptr ) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CtestcomputerDlg::OnSysCommand( UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CtestcomputerDlg::OnPaint() { if (IsIconic()) { CPaintDC dc( this ); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast < WPARAM >(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CtestcomputerDlg::OnQueryDragIcon() { return static_cast < HCURSOR >(m_hIcon); } //B->D按钮 void CtestcomputerDlg::OnBnClickedButton6() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_BD; } //按钮0 void CtestcomputerDlg::OnBnClickedButton43() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); //获取输入框中的值并且赋值给输入框关联的变量 mStr += L "0" ; UpdateData(FALSE); //将更改后的值返回给输入框 } //按钮“.” void CtestcomputerDlg::OnBnClickedButton42() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); //如果没有小鼠点,则加上小数点,如果找到小鼠点,则忽略此次点击 if (-1 == mStr.Find(L '.' )) { mStr += _T( "." ); } UpdateData(FALSE); } //按钮1 void CtestcomputerDlg::OnBnClickedButton36() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L "1" ; UpdateData(FALSE); } //按钮2 void CtestcomputerDlg::OnBnClickedButton37() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L "2" ; UpdateData(FALSE); } //按钮3 void CtestcomputerDlg::OnBnClickedButton38() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L "3" ; UpdateData(FALSE); } //按钮4 void CtestcomputerDlg::OnBnClickedButton30() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L "4" ; UpdateData(FALSE); } void CtestcomputerDlg::OnBnClickedButton31() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L "5" ; UpdateData(FALSE); } void CtestcomputerDlg::OnBnClickedButton32() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L "6" ; UpdateData(FALSE); } void CtestcomputerDlg::OnBnClickedButton24() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L "7" ; UpdateData(FALSE); } void CtestcomputerDlg::OnBnClickedButton25() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L "8" ; UpdateData(FALSE); } void CtestcomputerDlg::OnBnClickedButton26() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L "9" ; UpdateData(FALSE); } //返回按钮(消去输入框中最后一个字符) void CtestcomputerDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); if (!mStr.IsEmpty()) { //判断是否为空,若不空,则 mStr = mStr.Left(mStr.GetLength() - 1); //去掉字符串最后一个字符,left从左边开始取 } UpdateData(FALSE); } //清除按钮 void CtestcomputerDlg::OnBnClickedButton3() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); //获取输入框 mStr = L "" ; mNum1 = 0.0f; mNum2 = 0.0f; mFlag = FLAG_JIA; UpdateData(FALSE); //输出到输入框 } //清除所有按钮 void CtestcomputerDlg::OnBnClickedButton2() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); //获取输入框 mStr1 = L "" ; mStr2 = L "" ; mStr3 = L "" ; mStr4 = L "" ; mStr5 = L "" ; mStr6 = L "" ; mStr7 = L "" ; mStr8 = L "" ; mStr = L "" ; mNum1 = 0.0f; mNum2 = 0.0f; mFlag = FLAG_JIA; UpdateData(FALSE); //输出到输入框 } //保存第一个输入值 void CtestcomputerDlg::SaveFirstValue() { UpdateData(TRUE); mNum1 = _wtof(mStr); //第一个运算数 mTempStr = mStr; //中间变量 为了构建历史记录 mStr = L "" ; //至空输入框 为了输入第二个运算数 UpdateData(FALSE); } //计算 void CtestcomputerDlg::Calculator() { UpdateData(TRUE); mNum2 = _wtof(mStr); //第二个运算数 _wtof把字符串内容转换为浮点数 double result = 0.0f; //用来存放计算结果 switch (mFlag) { case FLAG_JIA: //加 result = mNum1 + mNum2; //进行加运算 mTempStr = mTempStr + _T( "+" ) + mStr + _T( "=" ); //历史记录中 break ; case FLAG_JIAN: //减 result = mNum1 - mNum2; mTempStr = mTempStr + _T( "-" ) + mStr + _T( "=" ); break ; case FLAG_CHENG: //乘 result = mNum1 * mNum2; mTempStr = mTempStr + _T( "*" ) + mStr + _T( "=" ); break ; case FLAG_CHU: //除 if (mNum2 = 0) { mTempStr = _T( "除0错误" ); } else { result = mNum1 / mNum2; mTempStr = mTempStr + _T( "/" ) + mStr + _T( "=" ); } break ; case FLAG_NFANG: // n次方 result = pow (mNum1, 1.0/mNum2); mTempStr = mTempStr + _T( "^" ) + mStr + _T( "=" ); break ; case FLAG_KAINFANG: //开n方 result = pow (mNum1, mNum2); mTempStr = mTempStr + _T( "^" ) + mStr + _T( "=" ); break ; case FLAG_MOD: //模运算 result = ( int )mNum1 % ( int )mNum2; //模运算必须是整数 mTempStr = mTempStr + _T( "%" ) + mStr + _T( "=" ); break ; case FLAG_LOGNX: //对数运算 result = log (mNum2) / log (mNum1); mTempStr = _T( "log" ) + mTempStr + _T( "(" ) + mStr + _T( ")" ) + _T( "=" ); break ; case FLAG_PINGFANG: //平方 result = mNum2 * mNum2; mTempStr = mStr + _T( "^2=" ); break ; case FLAG_KAIFANG: //开平方 result = sqrt (mNum2); mTempStr = _T( "根号" ) + mStr + _T( "=" ); break ; case FLAG_LIFANG: //立方 result = mNum2 * mNum2 * mNum2; mTempStr = mStr + _T( "^3=" ); break ; case FLAG_KAILIFANG: //开立方 result = pow (mNum2, 1.0 / 3); mTempStr = _T( "开立方" ) + mStr + _T( "=" ); break ; case FLAG_SIN: // 正弦 result = sin (mNum2); mTempStr = _T( "sin(" ) + mStr + _T( ")=" ); break ; case FLAG_COS: //余弦 result = cos (mNum2); mTempStr = _T( "cos(" ) + mStr + _T( ")=" ); break ; case FLAG_TAN: //正切 result = tan (mNum2); mTempStr = _T( "tan(" ) + mStr + _T( ")=" ); break ; case FLAG_EX: //e的x次方 { double e = exp (1.0); result = pow (e, mNum2); mTempStr = _T( "e^" ) + mStr + _T( "=" ); } break ; case FLAG_N: //计算n的阶乘 { int n = ( int )mNum2; if (n == 0) { result = 1; mTempStr = mStr + _T( "!=" ); } else if (n < 0) { mTempStr = _T( "负数没有阶乘" ); } else { result = 1; for ( int i = 1; i <= n; i++) { result *= i; } mTempStr = mStr + _T( "!=" ); } } break ; default : break ; } if (result - ( int )result <= 1e-5) //如果结果是整数 { mStr.Format(L "%d" , ( int )result); //以整数形式显示 } else { mStr.Format(L "%f" , result); //以小数形式显示 } mTempStr += mStr; //将结果与表达式拼接 mStr8 = mStr7; mStr7 = mStr6; mStr6 = mStr5; mStr5 = mStr4; mStr4 = mStr3; mStr3 = mStr2; mStr2 = mStr1; mStr1 = mTempStr; UpdateData(FALSE); mNum1 = result; mNum2 = 0.0f; } //点击+按钮 void CtestcomputerDlg::OnBnClickedButton45() { // TODO: 在此添加控件通知处理程序代码 SaveFirstValue(); //保存第一个运算数 mFlag = FLAG_JIA; //设置运算符 } //点击=按钮 void CtestcomputerDlg::OnBnClickedButton44() { // TODO: 在此添加控件通知处理程序代码 Calculator(); //调用运算方法 } //点击A按钮 void CtestcomputerDlg::OnBnClickedButton10() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L "A" ; UpdateData(FALSE); } //点击B按钮 void CtestcomputerDlg::OnBnClickedButton11() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L "B" ; UpdateData(FALSE); } //点击C按钮 void CtestcomputerDlg::OnBnClickedButton12() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L "C" ; UpdateData(FALSE); } //点击D按钮 void CtestcomputerDlg::OnBnClickedButton13() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L "D" ; UpdateData(FALSE); } //点击E按钮 void CtestcomputerDlg::OnBnClickedButton14() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L "E" ; UpdateData(FALSE); } //点击F按钮 void CtestcomputerDlg::OnBnClickedButton15() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L "F" ; UpdateData(FALSE); } //点击-按钮 void CtestcomputerDlg::OnBnClickedButton39() { // TODO: 在此添加控件通知处理程序代码 SaveFirstValue(); //保存第一个运算数 mFlag = FLAG_JIAN; //设置运算符 } //点击x按钮 void CtestcomputerDlg::OnBnClickedButton33() { // TODO: 在此添加控件通知处理程序代码 SaveFirstValue(); //保存第一个运算数 mFlag = FLAG_CHENG; //设置运算符 } //点击/按钮 void CtestcomputerDlg::OnBnClickedButton27() { //双目运算符 // TODO: 在此添加控件通知处理程序代码 SaveFirstValue(); //保存第一个运算数 mFlag = FLAG_CHU; //设置运算符 } //点击x^2按钮 void CtestcomputerDlg::OnBnClickedButton21() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_PINGFANG; //设置运算符 } //点击2/x按钮 void CtestcomputerDlg::OnBnClickedButton20() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_KAIFANG; } //点击x^3按钮 void CtestcomputerDlg::OnBnClickedButton19() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_LIFANG; //单目运算符 } //点击3/x按钮 void CtestcomputerDlg::OnBnClickedButton18() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_KAILIFANG; } //点击x^n void CtestcomputerDlg::OnBnClickedButton17() { // TODO: 在此添加控件通知处理程序代码 SaveFirstValue(); mFlag = FLAG_KAINFANG; } //点击n/x void CtestcomputerDlg::OnBnClickedButton16() { // TODO: 在此添加控件通知处理程序代码 SaveFirstValue(); //双目运算符,先保存第一个运算数 mFlag = FLAG_NFANG; } //点击%按钮 void CtestcomputerDlg::OnBnClickedButton23() { // TODO: 在此添加控件通知处理程序代码 SaveFirstValue(); mFlag = FLAG_MOD; } //点击lognX void CtestcomputerDlg::OnBnClickedButton34() { // TODO: 在此添加控件通知处理程序代码 SaveFirstValue(); mFlag = FLAG_LOGNX; } //点击tanX void CtestcomputerDlg::OnBnClickedButton41() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_TAN; } //点击cosX void CtestcomputerDlg::OnBnClickedButton35() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_COS; } //点击sinX void CtestcomputerDlg::OnBnClickedButton29() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_SIN; } //点击lnX void CtestcomputerDlg::OnBnClickedButton28() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_LNX; } //点击e^x void CtestcomputerDlg::OnBnClickedButton40() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_EX; } //点击n!按钮 void CtestcomputerDlg::OnBnClickedButton22() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_N; } //H->D按钮 void CtestcomputerDlg::OnBnClickedButton4() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_HD; } //O->D void CtestcomputerDlg::OnBnClickedButton5() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_OD; } //Hex void CtestcomputerDlg::OnBnClickedButton7() { // TODO: 在此添加控件通知处理程序代码 } //Oct void CtestcomputerDlg::OnBnClickedButton8() { // TODO: 在此添加控件通知处理程序代码 } //Bin void CtestcomputerDlg::OnBnClickedButton9() { // TODO: 在此添加控件通知处理程序代码 } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | // test_computerDlg.h: 头文件 // #pragma once //运算符 enum Calculator_Flag { FLAG_JIA, FLAG_JIAN, FLAG_CHENG, FLAG_CHU, FLAG_NFANG, //n方 FLAG_KAINFANG, //开n方 FLAG_PINGFANG, //平方 FLAG_KAIFANG, //开方 FLAG_LIFANG, //立方 FLAG_KAILIFANG, //开立方 FLAG_EX, //e的x次方 FLAG_SIN, //正弦 FLAG_COS, //余弦 FLAG_TAN, //正切 FLAG_MOD, //模运算 FLAG_N, //n的阶乘 FLAG_LNX, //以10为低的对数 FLAG_LOGNX, //对数运算 FLAG_HD, //十六进制到十进制 FLAG_OD, //八进制到十进制 FLAG_BD, //二进制到十进制 FlAG_HEX, //十六进制 FLAG_OCT, //八进制 FLAG_BIN //二进制 }; // CtestcomputerDlg 对话框 用户界面类以及类中的函数和变量 class CtestcomputerDlg : public CDialogEx { // 构造 public : CtestcomputerDlg(CWnd* pParent = nullptr ); // 标准构造函数 void SaveFirstValue(); //保存第一个输入值 void Calculator(); //计算 // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_TEST_COMPUTER_DIALOG }; #endif protected : virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected : HICON m_hIcon; // 生成的消息映射函数 virtual BOOL OnInitDialog(); afx_msg void OnSysCommand( UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() //控件的变量,,,即输入框的变量 在这里声明后需要在test_computerDlg.cpp文件中关联 private : CString mStr; //编辑框1内的字符串 CString mStr1; //编辑框2内的字符串 CString mStr2; CString mStr3; CString mStr4; CString mStr5; CString mStr6; CString mStr7; CString mStr8; CString mTempStr; ///中间变量 double mNum1; //运算数 double mNum2; Calculator_Flag mFlag; //运算符号 public : //点击按钮自动生成的函数声明,函数原型在test_computerDlg.cpp文件中 //这些都是按钮你的消息处理函数 afx_msg void OnBnClickedButton6(); afx_msg void OnBnClickedButton43(); afx_msg void OnBnClickedButton42(); afx_msg void OnBnClickedButton36(); afx_msg void OnBnClickedButton37(); afx_msg void OnBnClickedButton38(); afx_msg void OnBnClickedButton30(); afx_msg void OnBnClickedButton31(); afx_msg void OnBnClickedButton32(); afx_msg void OnBnClickedButton24(); afx_msg void OnBnClickedButton25(); afx_msg void OnBnClickedButton26(); afx_msg void OnBnClickedButton1(); afx_msg void OnBnClickedButton3(); afx_msg void OnBnClickedButton2(); afx_msg void OnBnClickedButton45(); afx_msg void OnBnClickedButton44(); afx_msg void OnBnClickedButton10(); afx_msg void OnBnClickedButton11(); afx_msg void OnBnClickedButton12(); afx_msg void OnBnClickedButton13(); afx_msg void OnBnClickedButton14(); afx_msg void OnBnClickedButton15(); afx_msg void OnBnClickedButton39(); afx_msg void OnBnClickedButton33(); afx_msg void OnBnClickedButton27(); afx_msg void OnBnClickedButton21(); afx_msg void OnBnClickedButton20(); afx_msg void OnBnClickedButton19(); afx_msg void OnBnClickedButton18(); afx_msg void OnBnClickedButton17(); afx_msg void OnBnClickedButton16(); afx_msg void OnBnClickedButton23(); afx_msg void OnBnClickedButton34(); afx_msg void OnBnClickedButton41(); afx_msg void OnBnClickedButton35(); afx_msg void OnBnClickedButton29(); afx_msg void OnBnClickedButton28(); afx_msg void OnBnClickedButton40(); afx_msg void OnBnClickedButton22(); afx_msg void OnBnClickedButton4(); afx_msg void OnBnClickedButton5(); afx_msg void OnBnClickedButton7(); afx_msg void OnBnClickedButton8(); afx_msg void OnBnClickedButton9(); }; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下