基于MFC框架的计算器小程序

发布时间 2023-10-13 15:55:45作者: nijiejie
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();
};