计算器的界面制作mfc 简单

合集下载

mfc的原理、机制与开发实例

mfc的原理、机制与开发实例

mfc的原理、机制与开发实例MFC(Microsoft Foundation Class)是微软公司开发的一套面向对象的应用程序框架,用于简化Windows操作系统上的图形用户界面(GUI)应用程序的开发。

MFC提供了一系列的类和函数,使开发者能够更加方便地创建、管理和操作窗口、对话框、控件等GUI元素。

MFC的原理和机制主要基于C++语言和Windows操作系统的API (Application Programming Interface)。

MFC的核心类是CObject类,所有的MFC类都是从CObject类派生而来的。

MFC使用了一种称为消息映射(Message Mapping)的机制来处理用户界面的事件和消息。

当用户进行操作时,例如点击按钮、输入文本等,Windows操作系统会生成相应的消息,并将其发送给应用程序。

MFC通过消息映射将这些消息与相应的处理函数关联起来,从而实现对用户操作的响应。

MFC的开发实例可以通过一个简单的计算器程序来说明。

首先,我们需要创建一个对话框,用于显示计算器的界面。

在MFC中,可以使用CDialog类来创建对话框。

然后,我们需要在对话框中添加一些控件,例如按钮、文本框等,用于用户输入和显示计算结果。

在MFC中,可以使用CButton、CEdit等类来创建这些控件。

接下来,我们需要处理用户的操作。

例如,当用户点击按钮时,我们需要执行相应的计算操作。

在MFC中,可以通过消息映射来实现。

首先,我们需要在对话框类中添加一个消息映射函数,用于处理按钮的点击事件。

然后,我们需要在消息映射函数中编写相应的代码,例如获取用户输入的数字、进行计算等。

最后,我们需要将消息映射函数与按钮关联起来,以便在用户点击按钮时调用相应的函数。

除了处理用户的操作,MFC还提供了许多其他功能,例如文件操作、数据库访问、图形绘制等。

开发者可以根据自己的需求选择相应的MFC类和函数来实现这些功能。

mfc 简单例程

mfc 简单例程

mfc 简单例程摘要:1.MFC 简单例程概述2.MFC 简单例程的实现步骤3.MFC 简单例程的应用示例正文:一、MFC 简单例程概述MFC(Microsoft Foundation Class)是微软提供的一个用于开发Windows 应用程序的类库。

它包含了大量预定义的类和函数,可以帮助开发者快速、简便地创建Windows 应用程序。

MFC 简单例程是指使用MFC 类库创建的一个简单的程序实例,通常用于演示MFC 的基本功能和操作方法。

二、MFC 简单例程的实现步骤1.打开Visual Studio,创建一个新的MFC 应用程序项目。

2.在Visual Studio 中,选择“File”>“New”>“MFC AppWizard”,然后点击“Next”。

3.在“AppWizard”对话框中,选择“A simple MFC application”,然后点击“Next”。

4.输入项目名称、选择项目位置,然后点击“Finish”。

5.在“Solution Explorer”窗口中,双击“MainFrame.cpp”文件,打开代码编辑器。

6.在代码编辑器中,可以编写MFC 简单例程的代码。

例如,可以创建一个窗口,添加按钮和文本框等控件,以及实现按钮点击事件的处理函数等。

三、MFC 简单例程的应用示例以下是一个MFC 简单例程的应用示例,它实现了一个简单的计算器功能:1.创建一个MFC 应用程序项目,并添加一个名为“Calculator”的窗口。

2.在“Calculator”窗口中,添加两个文本框(Text1 和Text2),用于输入两个数字;添加一个按钮(Button1),用于执行计算操作。

3.为“Button1”按钮添加一个点击事件处理函数(ON_BN_CLICKED)。

在函数中,编写计算两个文本框中数字之和的代码,并将结果显示在文本框(Text1)中。

4.编译并运行程序,可以看到一个简单的计算器界面。

mfc计算器程序设计详细

mfc计算器程序设计详细

mfc计算器程序设计详细
MFC是Microsoft基础类的缩写,用于Windows下的GUI程序开发,封装了许多常用的功能,其中包括控件、多线程、消息传递等等。

下面我们将基于MFC来编写一个简单的计算器程序。

首先,我们需要创建一个MFC应用程序并添加一个对话框。

然后,我们需要在对话框中添加各种控件,比如按钮、文本框、标签等等。

在这个例子中,我们需要添加数字按钮、运算符按钮和一个显示结果
的文本框。

接着,我们需要定义各种事件函数,比如数字按钮的点击事件、
运算符按钮的点击事件等等。

在这些事件函数中,我们需要根据相应
的操作完成对应的计算,并将结果显示到文本框中。

当然,我们还需
要处理一些特殊情况,比如输入非法字符、除以0等等。

最后,我们需要将所有的控件和事件函数进行绑定,使得程序能
够正常地运行。

这个过程中,我们将使用MFC提供的消息映射机制来
处理鼠标和键盘事件,以及相应的消息传递机制来更新界面。

总之,在MFC的帮助下编写一个计算器程序不仅方便快捷,而且
代码逻辑清晰,可读性好。

使用VC6编写一个计算器MFC

使用VC6编写一个计算器MFC

使用VC6编写一个计算器MFC回答如下:要使用VC6编写一个计算器MFC应用程序,首先需要创建一个新的MFC项目。

在VC6中,选择“创建一个新的工程”,然后选择“MFC应用程序”,并命名该项目为“Calculator”。

接下来,在“CalculatorDlg.h”文件中,可以编写计算器对话框类的代码。

在该类中,需要声明所有添加到对话框中的控件的成员变量。

例如,可以声明一个`CEdit`类型的指针变量来引用屏幕上的文本框控件。

此外,还可以声明其他成员变量来存储计算器的状态和当前操作数的值。

然后,在“CalculatorDlg.cpp”文件中,可以实现计算器对话框类的代码。

在该文件中,需要实现对话框的初始化、按钮单击事件的处理等功能。

例如,可以在对话框的`OnInitDialog`函数中初始化计算器的状态,并将其他控件的消息映射到对应的成员函数上。

然后,在对应的成员函数中,可以编写相应的代码来处理按钮单击事件,进行计算,并将结果显示在屏幕上。

在编写计算器的核心功能时,可以使用`+`、`-`、`*`和`/`等运算符来实现加法、减法、乘法和除法。

此外,还可以添加其他功能,如取余、开方等。

为了实现这些功能,可以在对话框类中添加成员函数,然后在相应的按钮单击事件中调用这些函数。

最后,在项目的构建选项中,将“字符集”设置为“使用Unicode字符集”,以支持使用中文。

然后,编译并运行该项目,就可以看到一个MFC计算器应用程序在屏幕上显示出来。

总结起来,在VC6中编写一个计算器MFC应用程序需要完成以下步骤:1.创建新的MFC项目,并添加所需的控件。

2.在对话框类中声明和实现计算器界面的成员变量和函数。

3.在对应的按钮单击事件处理函数中编写计算器的核心功能。

4. 在项目的构建选项中设置字符集为Unicode字符集。

5.编译并运行项目,测试计算器应用程序。

以上是一个简单的使用VC6编写一个计算器MFC的步骤。

当然,具体的实现还有很多细节需要注意和完成,如错误处理、界面美化等。

mfc窗口创建过程

mfc窗口创建过程

mfc窗口创建过程
MFC窗口的创建过程包括以下几个步骤:
1. 定义窗口类:首先需要定义一个派生自CWnd类的窗口类,该类是窗口的实例。

可以在应用程序的头文件中声明该类,并在源文件中实现其成员函数。

2. 注册窗口类:在应用程序的初始化阶段,需要调用AfxRegisterClass函数来注册窗口类,该函数会将窗口类的信息添加到注册表中。

3. 创建窗口:在初始化阶段,还需要创建窗口实例。

可以通过调用Create函数来创建一个新的窗口。

在调用Create函数之前,需要设置一些窗口的属性,如标题、大小、样式等。

4. 响应消息:窗口创建后,会进入一个消息循环。

在消息循环中,窗口会不断接收和处理消息。

可以通过覆盖窗口类的OnXXX函数来响应不同的消息,如OnPaint函数来处理窗口绘制消息。

5. 显示窗口:当窗口创建并响应消息后,需要调用ShowWindow 函数来显示窗口。

可以通过传入SW_SHOW参数来显示窗口。

以上就是MFC窗口的创建过程,通过这些步骤可以创建和管理窗口的实例,并实现窗口的功能。

自编计算器步骤

自编计算器步骤

自编计算器步骤1、打开VC++程序;2、点击文件下“新建”;3、选择“工程”属性页中的“MFC AppWizard(exe)”选项,在“工程”中输入工程名称,在“位置”中设置文件存放位置,如下图;4、点击“确定”按钮,进入下级界面,如下所示:选择“D基本对话”,点击“完成”按钮。

5、 如下图,建立程序界面;6、 用鼠标选择任意个输入对话框,按回车键,为每个输入框确定ID 值;如下:将每个输入框的ID 设置为易于识别的代号,如X 变量可设为IDC_EDIT_X ,流量Q 可设为IDC_EDIT_Q 等等;设置标签添加输入框7、建立好界面及自变量和因变量的ID之后,按Ctrl+W组合键,打开“建立类向导”对话框,或点击“查看”下的“建立类向导”,如下图:8、选择“Member Variables”属性页,为界面中所建立的输入框绑定程序中可以使用的变量。

用鼠标选择其中列出的Control IDs,然后点击右侧的“Add Variable…”按钮,为所选的输入框绑定变量,如下图所示:在Member variable name:中输入变量的名称,如m_x,m_前缀表示是变量。

Category选项选Value,表示该变量是值的形式,Variable type:选择该变量所属的数据类型,如float。

9、为每个界面中所建的输入框绑定各自的变量后,结果如下图:10、然后选择“新建类向导”中的“Message maps”属性页,如下:选择“Object IDs:”类表中的“IDOK”项,然后选择右侧的“BN_CLICKED”,单击右侧的“Add Function”按钮,为ID值IDOK 的按钮(即界面中的确定)添加单击时所要执行的函数。

11、点击“Add Function”按钮后显示如下对话框,单击即可。

12、然后单击“Edit Code”按钮,如下图:13、单击“Edit code”按钮后,屏幕显示如下:14、删除OnOK()函数中原有的“CDialog::OnOK()”一行。

如何使用visualstudio2019创建简单的MFC窗口(使用C++)

如何使用visualstudio2019创建简单的MFC窗口(使用C++)

如何使⽤visualstudio2019创建简单的MFC窗⼝(使⽤C++)本⽂介绍了如何使⽤visual studio2019创建简单的MFC窗⼝(使⽤C++)```cpp使⽤visual studio 2019 创建过程请参考Bili的上⼀篇⽂章⬇⬇→!使⽤visual studio 2019 创建简单的MFC窗⼝「使⽤底层的C语⾔」#include<windows.h> //底层实现窗⼝的头⽂件//6.处理窗⼝过程//CALLBACK 代表_stdcall 参数的传递顺序:从右到左依次⼊栈,并且函数返回前清空堆栈LRESULT CALLBACK WindowProc(HWND hand, //消息所属窗⼝句柄UINT uMsg, //具体消息名称 WM_XXXX消息名WPARAM wParam, //键盘附加消息LPARAM lParam) { //⿏标附加消息switch (uMsg){case WM_CLOSE://所有以XXXXWindow为结尾的⽅法,都不会进⼊到消息队列中,⽽是直接执⾏DestroyWindow(hand);//发送另⼀个消息WM_DESTROYbreak;case WM_DESTROY:PostQuitMessage(0);break;case WM_LBUTTONDOWN://⿏标左键按下{int xPos = LOWORD(lParam);int yPos = HIWORD(lParam);char buf[1024];wsprintf(buf, TEXT("x = %d,y = %d"),xPos,yPos);MessageBox(hand, buf, TEXT("按下⿏标左键"), MB_OK);break;}case WM_KEYDOWN: //键盘{MessageBox(hand, TEXT("键盘"), TEXT("按下键盘"), MB_OK);break;}case WM_PAINT: //画图{PAINTSTRUCT ps; //画图结构体HDC hdc = BeginPaint(hand, &ps);TextOut(hdc, 100, 100,TEXT("hello"), strlen("hello"));EndPaint(hand, &ps);break;}default:break;}//返回值⽤默认处理⽅式return DefWindowProc(hand, uMsg, wParam, lParam);}/*程序⼊⼝函数_In_ HINSTANCE hInstance,//应⽤程序实例句柄_In_opt_ HINSTANCE hPrevInstance,//上⼀个应⽤程序句柄,在WIN32环境下⼀般为NULL,不起作⽤了_In_ LPSTR lpCmdLine,//char * argv[]_In_ int nShowCmd//显⽰命令最⼤化、最⼩化、正常WINAPI 代表_stdcall 参数的传递顺序:从右到左依次⼊栈,并且函数返回前清空堆栈*/int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) {/*1.设计窗⼝2.注册窗⼝3.创建窗⼝4.显⽰和更新5.通过循环取消息6.处理消息(窗⼝过程)*///1.设计窗⼝WNDCLASS wc;wc.cbClsExtra = 0; //类的额外的内存wc.cbWndExtra = 0; //窗⼝额外的内存wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //设置背景wc.hCursor = LoadCursor(NULL, IDC_HAND); //设置光标,如果第⼀个参数为null,代表使⽤系统提供的光标wc.hIcon = LoadIcon(NULL, IDI_ERROR); //图标,如果第⼀个参数为null,代表使⽤系统提供的图标wc.hInstance = hInstance; //应⽤程序的实例句柄,传⼊winmain的形参即可wc.lpfnWndProc = WindowProc; //回调函数窗⼝过程wc.lpszClassName = TEXT("WIN"); //指定窗⼝名称wc.lpszMenuName = NULL; //菜单名称wc.style = 0; //显⽰风格,0代表默认//2.注册窗⼝RegisterClass(&wc);//3.创建窗⼝/*lpszClassName,//类名lpWindowName, //标题名dwStyle, //风格 WC_OVERLAPPEDWINDOWx, //坐标 CW_USERDEFAULTy, //坐标nWidth, //宽nHeight, //⾼hWndParent, //⽗窗⼝ nullhMenu, //菜单 nullhInstance, //实例句柄lpParam //附加值⿏标附加值*/HWND hwnd = CreateWindow(wc.lpszClassName, TEXT("WINDOWS"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); //4.显⽰和更新ShowWindow(hwnd, SW_SHOWNORMAL);UpdateWindow(hwnd);/*HWND hwnd; //主窗⼝句柄UINT message; //具体消息名称WPARAM wParam; //附加消息键盘消息LPARAM lParam; //附加消息⿏标消息DWORD time; //消息产⽣时间POINT pt;*/ //附加消息⿏标消息 x,y//5.通过循环取消息MSG msg;/*_Out_ LPMSG lpMsg, //消息_In_opt_ HWND hWnd, //捕获窗⼝填null表⽰捕获所有窗⼝_In_ UINT wMsgFilterMin, //最⼤和最⼩的过滤消息⼀般填0_In_ UINT wMsgFilterMax);*/while (GetMessage(&msg, NULL, 0, 0)){/*if (GetMessage(&msg, NULL, 0, 0) == FALSE) {break;}*///翻译消息TranslateMessage(&msg);//不是false//分发消息DispatchMessage(&msg);}return 0;}划重点:项⽬->属性->常规->⾼级->将MFC的使⽤设置为在“共享dll中使⽤mfc”头⽂件mfc.h#include <afxwin.h>//mfc头⽂件class MyApp:public CWinApp{public:virtual BOOL InitInstance();};class MyFrame :public CFrameWnd {//窗⼝框架类public:MyFrame();//声明宏提⽰消息映射机制DECLARE_MESSAGE_MAP();afx_msg void OnLButtonDown(UINT,CPoint);afx_msg void OnChar(UINT,UINT,UINT);afx_msg void OnPaint();};源⽂件mfc.cpp#include “mfc.h”MyApp app;BOOL MyApp::InitInstance() {//创建窗⼝MyFrame* frame = new MyFrame;//显⽰和更新frame->ShowWindow(SW_SHOWNORMAL);frame->UpdateWindow();m_pMainWnd = frame;//保存指向应⽤程序的主窗⼝的指针return TRUE;//返回正常初始化}//分界宏BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)ON_WM_LBUTTONDOWN()//⿏标左键按下ON_WM_CHAR()ON_WM_PAINT()END_MESSAGE_MAP()MyFrame::MyFrame(){Create(NULL,TEXT(“windows”));}void MyFrame::OnLButtonDown(UINT, CPoint point){//TCHAR buf[1024];//wsprintf(buf, TEXT(“x = %d,y = %d”), point.x, point.y);//MessageBox(buf);CString str;str.Format(TEXT(“x = %d,y = %d”),point.x,point.y);MessageBox(str);}void MyFrame::OnChar(UINT key, UINT, UINT){CString str;str.Format(TEXT(“按下了%c键”),key);MessageBox(str);}void MyFrame::OnPaint(){CPaintDC dc(this);dc.TextOutW(100,100,TEXT(“为了部落”));dc.Ellipse(10,10,100,100);}到此这篇关于如何使⽤visual studio2019创建简单的MFC窗⼝(使⽤C++)的⽂章就介绍到这了,更多相关vs2019创建MFC窗⼝内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

可视化编程课程设计(含源码)计算器系统实现

可视化编程课程设计(含源码)计算器系统实现

设计题目:计算器系统实现1.分别用API与MFC编程来实现计算器的以下功能。

2.实现计算器的基本功能:连续数据的无优先级混合运算(加减乘除)3.可以实现其他附加功能:优先级运算,加入括号,加入其他函数运算功能等。

(不在要求范围之内)4.要求界面良好,功能完整。

一.基于MFC的简单计算器1.设计思路打开MFC应用操作界面,布局计算器界面,利用组框将计算器界面分为三个部分,一个是编辑输入,一个是数字界面,一个是功能键部分。

利用布局参考线对齐按钮,使界面美观。

然后就是对各个按钮进行属性设置,关联类设置,接着对各个按钮进行源代码编程。

最后,调试找出问题,解决问题,运行MFC成品计算器。

2.简单操作以及功能说明由于本人技术有限,所以本程序只能按照正确的计算运算顺序进行,该简单计算器能进行四则混合运算,除了加减乘除外,添加了一个括号,对于有些未知的错误,由于时间有限,并未来得及全面测试使用。

该简单计算器能实现四则运算,退格运算,清零运算,并且支持输出的结果保留给直接的下一个运算。

3.系统实现的各个模块1)编辑框模块由于编辑框模块需要连续输入字符串,所以在给编辑框建立类向导时,给编辑框定义的成员变量应该是字符串(String)变量。

编辑框模块用于运算算式的输入,以及结果的输出。

2)数字键模块数字键模块比较简单,该简单计算器数字键模块设置有0~9数字,还设置有小数点,以及正负数转换实现按钮。

数字键模块按钮在建立类向导时无需定义成员变量,但是需要定义按钮响应链接,用于实现点击按钮,在编辑框上显示点击按钮信息。

3)功能键模块功能键模块包括加减乘除基本按钮,以及一个输入错误是后能用于退格功能的退格键按钮,还有一个用于区别优先级运算的括号功能,当然有最重要的计算结果输入按钮,等于号按钮。

在编辑框附近还有一个功能键,就是清除功能键,用于清除编辑框,以便实现下一轮输入。

4.设计过程1)设计总流程图2)界面的设计3)建立的变量,控件的命名,对应的消息处理函数对应表ID CAPTION MessageHandler IDD_JISUANQI_DIALOG 简易计算器N/AIDC_NUM0 0 OnNum0IDC_NUM1 1 OnNum1IDC_NUM2 2 OnNum2IDC_NUM3 3 OnNum3IDC_NUM4 4 OnNum4IDC_NUM5 5 OnNum5IDC_NUM6 6 OnNum6IDC_NUM7 7 OnNum7IDC_NUM8 8 OnNum8IDC_NUM9 9 OnNum9IDC_OPER_ADD + OnOperAdd IDC_OPER_SUB - OnOperSub IDC_OPER_MULTI * OnOperMulti IDC_OPER_DIV / OnOperDiv IDC_ADD_SUB +/- OnAddSubIDC_POINT . OnPointIDC_EQUAL = OnEqualIDC_LBRACKET ( OnLbracket1)数字键模块void CJiSuanQiDlg::OnNum0(){if(calculated == TRUE) //已经按了等号,不让其再接受字符return;UpdateData(TRUE);//刷新编辑框界面calcutateString += "0";//存储输入的数字m_data += "0";//显示输入的数字UpdateData(FALSE);}2)功能键模块①加法功能键源程序void CJiSuanQiDlg::OnOperAdd(){if(calculated == TRUE)///其前一步按了= 号{calculated = FALSE;m_data = oldResult;double temp = atof(oldResult);//定义临时变量存储上一步结果if(temp < 0){calcutateString = "0" + oldResult;}else{calcutateString = oldResult;}calcutateString += "+";//存储做完该功能后的结果m_data += "+";//显示该步骤完成的结果UpdateData(FALSE);}else ///前一步不是={UpdateData(TRUE);calcutateString += "+";//直接存储此步操作m_data += "+";//直接显示此步操作UpdateData(FALSE);}}②退格功能键源程序void CJiSuanQiDlg::OnBackspeace(){if(calculated == FALSE){UpdateData(TRUE);int count = m_data.GetLength();if(count >= 1)//判断是否能执行退格操作{m_data = m_data.Left(count -1);count = calcutateString.GetLength();calcutateString = calcutateString.Left(count -1);UpdateData(FALSE);}}}③清除功能键源程序void CJiSuanQiDlg::OnClear(){// TODO: Add your control notification handler code herem_data = "";oldResult = "";calcutateString = "";calculated = FALSE;UpdateData(FALSE);}④括号功能键源程序void CJiSuanQiDlg::OnLbracket(){// TODO: Add your control notification handler code hereif(calculated == TRUE) ///已经按了等号,不让其再接受字符return;UpdateData(TRUE);calcutateString += "(";m_data += "(";UpdateData(FALSE);}⑤正负转换功能键源程序void CJiSuanQiDlg::OnAddSub(){// TODO: Add your control notification handler code hereif(calculated == FALSE){UpdateData(TRUE);calcutateString = calcutateString + "0" + "-";m_data += "-";UpdateData(FALSE);}}6.运行结果界面截图7.制作过程中所遇问题以及解决方法过程1)源代码编写错误通过查阅资料,请教同学,逐步一一解决。

基于MFC的一个简单计算器

基于MFC的一个简单计算器

基于MFC的⼀个简单计算器写⼀个简单的计算器并不是什么很难的事,主要⽬的是要通过这个程序来学习和分析其中的核⼼算法。

这个简易计算器的核⼼部分就是对输⼊的表达式的正确性判断与求值,其中包括对表达式的解析、中缀表达式转后缀表达式、后缀表达式求值等等⼏个⽅⾯。

⼀、封装核⼼代码《》和《》这两篇⽂章已经对核⼼算法部分进⾏了讲解,并附有源码。

在此基础上制作⼀个简单计算器,我们要做的仅仅是封装核⼼代码并加⼊MFC⼯程中。

下⾯是我封装的⼀个 Expression 类:Expression.h#pragma once#include <iostream>#include <sstream>#include <string>#include <vector>#include <stack>#include <utility>using namespace std;class Expression{public:Expression(string str);bool test(); // 外部接⼝,判断表达式是否合法double calculate(); // 外部接⼝,计算表达式的值private:vector<pair<string, int>> word;string expr; // 算术表达式int idx; // word下标int sym; // 单词种别编码int err; // 错误int word_analysis(vector<pair<string, int>>& , const string);void Next();void E();void T();void F();bool Right; // 保存表达式test结果private:int prior(int); // 获取运算符的优先级bool isOperator(int); // 通过种别编码判定是否是运算符vector<pair<string,int>> getPostfix(const vector<pair<string,int>>&); // 中缀转后缀void popTwoNumbers(stack<double>&, double&, double&); // 从栈中连续弹出两个操作数double stringToDouble(const string&); // 把string转换为doubledouble expCalculate(const vector<pair<string, int>>&); // 计算后缀表达式的值};Expression.cpp#include "Expression.h"// 构造函数Expression::Expression( string str ):expr(str),idx(0),err(0),Right(true){}// 外部接⼝bool Expression::test(){return Right;}int err_num = word_analysis(word, expr);if (-1 == err_num){Right = false;}else{// 词法正确,进⾏语法分析Next();E();if (sym == 0 && err == 0) // 注意要判断两个条件Right = true;elseRight = false;}return Right;}// 外部接⼝double Expression::calculate(){if (test()){return expCalculate(getPostfix(word));}else{exit(0);}}/*--------------------------------词法分析----------------------------*/int Expression::word_analysis(vector<pair<string, int>>& word, const string expr) {for(int i=0; i<expr.length(); ++i){// 如果是 + - x ÷ ( )if(expr[i] == '(' || expr[i] == ')' || expr[i] == '+'|| expr[i] == '-' || expr[i] == '*' || expr[i] == '/'){string tmp;tmp.push_back(expr[i]);switch (expr[i]){case '+':word.push_back(make_pair(tmp, 1));break;case '-':word.push_back(make_pair(tmp, 2));break;case '*':word.push_back(make_pair(tmp, 3));break;case '/':word.push_back(make_pair(tmp, 4));break;case '(':word.push_back(make_pair(tmp, 6));break;case ')':word.push_back(make_pair(tmp, 7));break;}}// 如果是数字开头else if(expr[i]>='0' && expr[i]<='9'){string tmp;while(expr[i]>='0' && expr[i]<='9'){tmp.push_back(expr[i]);++i;}if(expr[i] == '.'){++i;if(expr[i]>='0' && expr[i]<='9'){tmp.push_back('.');tmp.push_back(expr[i]);++i;}}else{return -1; // .后⾯不是数字,词法错误}}word.push_back(make_pair(tmp, 5));--i;}// 如果以.开头else{return -1; // 以.开头,词法错误}}return 0;}/*--------------------------------语法分析----------------------------*/ // 读下⼀单词的种别编码void Expression::Next(){if(idx < word.size())sym = word[idx++].second;elsesym = 0;}// E → T { +T | -T }void Expression::E(){T();while(sym == 1 || sym == 2){Next();T();}}// T → F { *F | /F }void Expression::T(){F();while(sym == 3 || sym == 4){Next();F();}}// F → (E) | dvoid Expression::F(){if (sym == 5){Next();}else if(sym == 6){Next();E();if (sym == 7){Next();}else{err = -1;}}else{err = -1;}}/*--------------------------------求值部分----------------------------*/ int Expression::prior(int sym){case 1:case 2:return 1;case 3:case 4:return 2;default:return 0;}}bool Expression::isOperator(int sym){switch (sym){case 1:case 2:case 3:case 4:return true;default:return false;}}vector<pair<string,int>> Expression::getPostfix( const vector<pair<string,int>>& expr){vector<pair<string, int>> output; // 输出stack<pair<string, int>> s; // 操作符栈for(int i=0; i<expr.size(); ++i){pair<string, int> p = expr[i];if(isOperator(p.second)){while(!s.empty() && isOperator(s.top().second) && prior(s.top().second)>=prior(p.second)) {output.push_back(s.top());s.pop();}s.push(p);}else if(p.second == 6){s.push(p);}else if(p.second == 7){while(s.top().second != 6){output.push_back(s.top());s.pop();}s.pop();}else{output.push_back(p);}}while (!s.empty()){output.push_back(s.top());s.pop();}return output;}void Expression::popTwoNumbers( stack<double>& s, double& first, double& second ){first = s.top();s.pop();second = s.top();s.pop();}double Expression::stringToDouble( const string& str ){double d;stringstream ss;ss << str;ss >> d;return d;double Expression::expCalculate( const vector<pair<string,int>>& postfix ){double first,second;stack<double> s;for(int i=0; i<postfix.size(); ++i){pair<string,int> p = postfix[i];switch (p.second){case 1:popTwoNumbers(s, first, second);s.push(second+first);break;case 2:popTwoNumbers(s, first, second);s.push(second-first);break;case 3:popTwoNumbers(s, first, second);s.push(second*first);break;case 4:popTwoNumbers(s, first, second);s.push(second/first);break;default:s.push(stringToDouble(p.first));break;}}double result = s.top();s.pop();return result;}使⽤⽅法(测试):int main(){Expression e("(1.5+2.5)*2+0.53");if(e.test()) // 判断表达式是否合法cout << e.calculate() << endl;return 0;}⼆、加⼊MFC⼯程OK,核⼼代码(表达式的合法性判断与求值)已经封装到 Expression 类中,下⾯要做的就是新建⼀个 MFC ⼯程,并把 Expression 类加⼊⼯程⾥,并实现按钮的功能就⾏了。

c++面向对象程序设计MFC简单计算器实验报告.doc

c++面向对象程序设计MFC简单计算器实验报告.doc

计算机与信息工程学院《程序设计基础》课程设计报告题目名称:60.编写一个能实现简单功能的计算器学生姓名:刘沛东学生学号:2011508154专业班级:电子信息工程(1)班指导教师:高攀1 课程设计的题目编写一个能实现简单功能的计算器2 题目要求1. 有一个计算器图形。

2. 能实现加、减、乘、除及乘方的运算。

3. 当输入题目时,屏幕上要在指定位置上显示出相应的题目内容,且相应的数字键要改变颜色 例如:输入数字1 时,在计算器图形上的1键变为红色。

4. 屏幕、图形颜色、形状自定3 总体设计3.1 总体框架图1 系统框架开始结束键入第一个按钮键入第二个按钮 显 示 结 果加 法减 法乘 法除 法乘 方清 零3.2 系统功能说明在VC++6.0中绘制计算器界面,各控件的设置对0~9控件设定相应的ID和其他属性:图2 “1”控件设置对“+、-、*、\”控件设定相应的ID和其他属性:图2 “+”控件设置对其它控件设定相应的ID和其他属性:图3 其它控件设置主要使用到Layout菜单中的Align功能对各个按钮进行对其,使界面更加整洁。

拖出的控件有上面的一个Edit控件用于显示数字,Button控件用于处理鼠标的消息。

4 程序详细设计4.1系统主调模块图5 程序流程图4.2各模块详细设计 4.2.1 建立的变量,控件的命名,对应的消息处理函数对应表IDCAPTION Message Handler IDD_CALC_DIALOG 简易计算器 N/A IDC_NUM0 0 OnNum0 IDC_NUM1 1 OnNum1 IDC_NUM2 2 OnNum2 IDC_NUM3 3 OnNum3 IDC_NUM4 4 OnNum4 IDC_NUM5 5 OnNum5 IDC_NUM66OnNum6实现文件.cpp显示计算器界面开始执行工程全局对象资源文件.rc 模块定义文件.def头文件.h执行Afxmain()创建窗口实现窗口类注册SetwindowVoidVoid点击鼠标发出消息Void等待消息处理Void Void clc::onAdd()文本框中显示结果 程序运行结IDC_NUM7 7 OnNum7IDC_NUM8 8 OnNum8IDC_NUM9 9 OnNum9IDC_NEG +/- OnNegIDC_PT .OnPtIDC_DIV / OnDivIDC_MUL * OnMulIDC_MIN - OnMinIDC_ADD + OnAddIDC_BACKSPACE BACK OnBackspaceIDC_CE CE OnCeIDC_CLEAR C OnClearIDC_EQU = OnEquIDC_DIS N/A N/AOnCal(double num)变量定义:double poz; //保存小数点的位置,初始化为1,表示poz-1个小数点。

MFC入门教程之简易计算器制作

MFC入门教程之简易计算器制作

MFC入门之简易计算器制作最近自学MFC,入门的时候走了不少弯路,所以特做此教程,希望能帮助一些人能够快速入门,少走一些弯路。

这个教程就是通过一个简易计算器的制作让大家了解MFC界面编程的基本步骤和几个常用控件的使用方法。

使用软件Visual C++ 6.0.首先,新建一个MFC基于对话框的工程。

点击文件-新建,在工程选项卡里选择MFC AppWizard[exe],给工程命名Jisuan。

点击确定。

在接下来的向导里选择基于对话框,其他选项使用默认即可,之间点击完成。

先给大家介绍一下Visual C++ 6.0的界面。

左边框起来的是文件资源控制区,默认有三个选项卡,分别是ClassView、ResourceView和FileView。

分别用来显示类、资源和文件。

中间这个主要操作区呢,就是我们用来设计界面和编程的窗口了。

现在这个是IDD_JISUAN_DIALOG资源,如图所示。

右边那个是控件工具箱,如果没有显示的话可以右击菜单栏空白区域,把控件前打上对号即可。

然后给大家介绍一下今天需要用到的控件。

如左图所示,今天主要需要用到四个控件。

第一个是静态文本控件,就是可以往对话框上放一些静态的文字。

第二个是编辑框,它是可以往里面输入文字的。

第三个是组合框,它是把用来给对话框分区,使界面更加美观明了。

第四个是按钮控件,是用来点一下产生某个操作的。

上面那个是编辑框,下面这个是按钮控件。

点一下控件,拖到对话框上,即可使用。

下面我们可以这样布局:上面两个编辑框里输入数字,中间四个按钮分别是+ - * /,然后下面编辑框里显示数字。

下面开始给大家介绍第一个最重要的操作,就是属性操作。

我们想让这些控件的显示文字改变,就需要修改它的属性。

选定某个控件,右击,选择属性,即可来改变它们的属性了。

我们挨个控件介绍。

首先是组合框。

组合框的属性,我们看到有一个ID,一个标题。

首先说明一点,每个控件都必须有一个ID值,而且一般每个控件的ID值不能相同。

VC++制作一个入门的计算器软件

VC++制作一个入门的计算器软件

VC++整理入门计算器本文档是运用VC++6.0整理一个入门计算器的过程。

由于时间和知识技能原因,只能简单的做一个入门级的计算器(只实现加减乘除功能),以后的内容再追加。

一、建立工程启动VC++6.0,然后“文件”新建一个工程,选择“MFC AppWizard(exe)”选项,输入工程名,确定。

(如下图)弹出“MFC应用程序向导-步骤1”选择“基本对话框”,语言选“中文”,点击完成。

在弹出的控件界面,把按钮先删除。

二、设计计算器界面根据自己的喜好设计计算器的界面,(下图是我设计的简易的界面)。

用控件里面的布局计算器的界面,修改按钮显示,先右击要修改的按钮,选择“属性”,修改对应的“标题”。

按钮设计好之后,设置对应的类,加减乘除四个运算符分别如下设置,右击选“建立类向导”,在“Message Maps”选项内,选对应的“IDC_BUTTON1”,设置Messages:BN_CLICKED,然后“Add Function”,一次选择其他三个按钮,按确定。

(如下图)编辑框如下类,同样是右击编辑框,右击选“建立类向导”,选择第二个选项,选择IDC_EDIT1,然后选Add Variable...,在弹出的对话框中名字中输入m_num1,类型选数字Double,对应设置剩下的编辑框,然后确定。

下一步是输入代码。

三、代码的输入双击“+”按钮,然后点击确定,在对应的代码语句中输入下面的语句:void CMyDlg::OnButton1(){UpdateData(1);m_num3=m_num1+m_num2;UpdateData(0);}双击“-”按钮,然后点击确定,在对应的代码语句中输入下面的语句:void CMyDlg::OnButton2(){UpdateData(1);m_num3=m_num1-m_num2;UpdateData(0);}双击“X”按钮,然后点击确定,在对应的代码语句中输入下面的语句:void CMyDlg::OnButton3(){UpdateData(1);m_num3=m_num1*m_num2;UpdateData(0);}双击“/”按钮,然后点击确定,在对应的代码语句中输入下面的语句:void CMyDlg::OnButton4(){UpdateData(1);if(m_num2==0)MessageBox("除数不能为0,请重新输入除数!");elsem_num3=m_num1/m_num2;UpdateData(0);}四:测试到此软件设置完成,运行看看。

MFC下的科学计算器

MFC下的科学计算器

MFC下的科学计算器MFC (Microsoft Foundation Classes) 是Microsoft在windows上用于构建图形用户界面 (GUI) 的一套类库。

在MFC下开发一个科学计算器,可以实现基本的数学运算,包括加、减、乘、除,以及科学计数、平方、开方等功能。

首先,我们需要创建一个新的MFC应用程序项目。

在Visual Studio中选择“新建项目”,然后选择“MFC应用程序”。

在项目向导中,选择“单文档”视图,点击“完成”创建项目。

在代码视图中,我们可以使用Class Wizard来添加的响应函数。

打开Class Wizard,切换到“消息映射”选项卡,在列表中选择“控件”和“消息”,然后点击“添加函数”来添加事件处理函数。

除了基本的加减乘除功能,我们还可以添加其他的科学计算功能,例如平方、开方、三角函数等。

这些功能使用C++的数学库函数实现。

在完成功能的设计和实现后,我们可以进行调试和优化。

在调试期间,我们可以使用断点来跟踪代码的执行过程,检查变量的值和程序的状态。

如果遇到错误或异常情况,可以使用调试工具和日志功能来定位和解决问题。

同时,我们还可以根据用户的反馈和需求,对功能和界面进行优化和改进。

最后,我们可以将应用程序编译成可执行文件,方便用户安装和使用。

可以使用发布功能来生成安装程序,然后将可执行文件和相关文件打包,发布给用户。

总结一下,使用MFC开发一个科学计算器需要以下几个步骤:创建MFC应用程序项目、设计用户界面、实现计算功能、调试和优化、发布应用程序。

通过这个过程,我们可以了解和掌握MFC开发的基本流程和技巧,进一步提升编程能力和开发经验。

简单计算器可视化程序编程

简单计算器可视化程序编程
{
doublex2,y,x1=StoN(strExp);
strExp=m_strTmp;
charop=strExp.GetAt(0);
strExp.Delete(0);
x2=StoN(strExp);
if(m_strTmp!="")return"ERROR_"+m_strTmp+"未知符号_";
if(op=='+'){y=x1+x2;}
IDC_BUTTON38
sqrt
按钮
IDC_BUTTON30
%
按钮
IDC_BUTTON25
^
按钮
IDC_BUTTON31
sin
按钮
IDC_BUTTON32
cos
按钮
IDC_BUTTON33
tan
按钮
IDC_BUTTON34
cot
按钮
IDC_BUTTON40
sin~1
按钮
IDC_BUTTON41
cos~1
{
intlen=strExp.GetLength();
intpos=-1;
for(inti=0;i<len;i++)
{
if(pos>=0&&strExp.GetAt(i)==')')break;
if(strExp.GetAt(i)=='(')
{
pos=i;
}
}
returnpos;
}
voidCCalculation::DelBracket(CString*strExp)

简易计算器MFC程序

简易计算器MFC程序

1、编写一个对话框应用程序,添加三按钮,三文本编辑框,实现加、减、乘、除简单运算,并实现编辑框的文本复制、粘贴、清空;程序代码:实验4View.cppvoid C实验4View::OnModelDialog(){CMyDlg dlg;dlg.DoModal();}void C实验4View::OnModellessDialog(){CMyDlg *pDlg=new CMyDlg;pDlg->Create(IDD_DIALOG1,this);pDlg->ShowWindow(SW_SHOW);}MyDlg.hpublic:CEdit m_edit1;CEdit m_edit2;CEdit m_edit3;CEdit m_edit4;CEdit m_edit5;afx_msg void OnBnClickedAdd();afx_msg void OnBnClickedSubtact();afx_msg void OnBnClickedMultiply();afx_msg void OnBnClickedDivide();afx_msg void OnBnClickedClearwrite();afx_msg void OnBnClickedClearsave();afx_msg void OnBnClickedCopy();afx_msg void OnBnClickedPaste();afx_msg void OnEnSetfocusEdit4();afx_msg void OnEnSetfocusEdit5();};MyDlg.cppint nEDITtemp;//全局变量BEGIN_MESSAGE_MAP(CMyDlg, CDialog)ON_BN_CLICKED(IDM_ADD, &CMyDlg::OnBnClickedAdd)ON_BN_CLICKED(IDM_SUBTACT, &CMyDlg::OnBnClickedSubtact)ON_BN_CLICKED(IDM_MULTIPLY, &CMyDlg::OnBnClickedMultiply)ON_BN_CLICKED(IDM_DIVIDE, &CMyDlg::OnBnClickedDivide)ON_BN_CLICKED(IDM_CLEARWRITE, &CMyDlg::OnBnClickedClearwrite) ON_BN_CLICKED(IDM_CLEARSAVE, &CMyDlg::OnBnClickedClearsave) ON_BN_CLICKED(IDM_COPY, &CMyDlg::OnBnClickedCopy)ON_BN_CLICKED(IIDM_PASTE, &CMyDlg::OnBnClickedPaste)ON_EN_SETFOCUS(IDC_EDIT4, &CMyDlg::OnEnSetfocusEdit4)ON_EN_SETFOCUS(IDC_EDIT5, &CMyDlg::OnEnSetfocusEdit5)END_MESSAGE_MAP()// CMyDlg 消息处理程序void CMyDlg::OnBnClickedAdd()//加法{// TODO: 在此添加控件通知处理程序代码double num1, num2, num3;int i=0;CString ch1, ch2, ch3;m_edit1.GetWindowText(ch1);m_edit2.GetWindowText(ch2);num1 =_tstof(ch1);num2 =_tstof(ch2);num3 = num1 + num2;ch3.Format(_T("%g"), num3);m_edit3.SetWindowText(ch3);}void CMyDlg::OnBnClickedSubtact()//减法{// TODO: 在此添加控件通知处理程序代码double num1, num2, num3;CString ch1, ch2, ch3;m_edit1.GetWindowText(ch1);m_edit2.GetWindowText(ch2);num1 = _tstof(ch1);num2 = _tstof(ch2);num3 = num1 - num2;ch3.Format(_T("%g"), num3);m_edit3.SetWindowText(ch3);}void CMyDlg::OnBnClickedMultiply()//乘法// TODO: 在此添加控件通知处理程序代码double num1, num2, num3;CString ch1, ch2, ch3;m_edit1.GetWindowText(ch1);m_edit2.GetWindowText(ch2);num1 = _tstof(ch1);num2 = _tstof(ch2);num3 = num1 * num2;ch3.Format(_T("%g"), num3);m_edit3.SetWindowText(ch3);}void CMyDlg::OnBnClickedDivide()//除法{// TODO: 在此添加控件通知处理程序代码double num1, num2, num3;CString ch1, ch2, ch3;m_edit1.GetWindowText(ch1);m_edit2.GetWindowText(ch2);num1 = _tstof(ch1);num2 = _tstof(ch2);num3 = num1 / num2;ch3.Format(_T("%g"), num3);m_edit3.SetWindowText(ch3);}void CMyDlg::OnBnClickedClearwrite()//初始化编辑框数据{// TODO: 在此添加控件通知处理程序代码m_edit1.SetSel(0,-1);m_edit1.Clear();m_edit2.SetSel(0,-1);m_edit2.Clear();m_edit3.SetSel(0,-1);m_edit3.Clear();}void CMyDlg::OnBnClickedClearsave()//初始化保存框数据{// TODO: 在此添加控件通知处理程序代码m_edit4.SetSel(0,-1);m_edit4.Clear();m_edit5.SetSel(0,-1);m_edit5.Clear();}void CMyDlg::OnBnClickedCopy()//复制// TODO: 在此添加控件通知处理程序代码m_edit3.SetSel(0,-1);m_edit3.Copy();}void CMyDlg::OnBnClickedPaste()//粘贴{// TODO: 在此添加控件通知处理程序代码if (nEDITtemp==1)m_edit4.Paste();else if(nEDITtemp==2)m_edit5.Paste();}void CMyDlg::OnEnSetfocusEdit4()//判断光标是否在SAVEREASULT1指示框中{// TODO: 在此添加控件通知处理程序代码nEDITtemp=1;}void CMyDlg::OnEnSetfocusEdit5()//判断光标是否在SAVEREASULT2指示框中{// TODO: 在此添加控件通知处理程序代码nEDITtemp=2;}运行结果:。

MFC计算器的实现

MFC计算器的实现

MFC计算器的实现MFC是Microsoft Foundation Classes的缩写,是一个框架,用于开发Windows平台上的应用程序。

在MFC框架下,我们可以很方便地实现计算器应用程序。

以下是一个基于MFC框架的简单计算器应用程序的实现。

1.首先,创建一个新的MFC应用程序项目,并选择创建一个对话框为基础的应用程序。

4. 创建一个新的类(例如名为CalculatorDlg)作为对话框的类派生自CDialog。

在类头文件中声明需要的成员变量和函数。

```cppclass CalculatorDlg : public CDialogpublic:CalculatorDlg(CWnd* pParent = nullptr);enum { IDD = IDD_DLG_CALC };protected:virtual void DoDataExchange(CDataExchange* pDX);protected:afx_msg void OnBnClickedButtonNumber(UINT nID); // 数字按钮点击事件处理函数afx_msg void OnBnClickedButtonOperator(UINT nID); // 运算符按钮点击事件处理函数afx_msg void OnBnClickedButtonClear(; // 清零按钮点击事件处理函数afx_msg void OnBnClickedButtonEqual(; //等于按钮点击事件处理函数DECLARE_MESSAGE_MAP};```5. 在类的.cpp文件中实现需要的成员函数和消息映射。

```cppIMPLEMENT_DYNAMIC(CalculatorDlg, CDialog)CalculatorDlg::CalculatorDlg(CWnd* pParent) :CDialog(IDD_DLG_CALC, pParent)//初始化成员变量m_hResultEdit = nullptr;void CalculatorDlg::DoDataExchange(CDataExchange* pDX)CDialog::DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CalculatorDlg, CDialog)ON_BN_CLICKED(IDC_BUTTON_0,&CalculatorDlg::OnBnClickedButtonNumber) ON_BN_CLICKED(IDC_BUTTON_1,&CalculatorDlg::OnBnClickedButtonNumber) ON_BN_CLICKED(IDC_BUTTON_2,&CalculatorDlg::OnBnClickedButtonNumber) ON_BN_CLICKED(IDC_BUTTON_3,&CalculatorDlg::OnBnClickedButtonNumber) ON_BN_CLICKED(IDC_BUTTON_4,&CalculatorDlg::OnBnClickedButtonNumber) ON_BN_CLICKED(IDC_BUTTON_5,&CalculatorDlg::OnBnClickedButtonNumber) ON_BN_CLICKED(IDC_BUTTON_6,&CalculatorDlg::OnBnClickedButtonNumber) ON_BN_CLICKED(IDC_BUTTON_7,&CalculatorDlg::OnBnClickedButtonNumber) ON_BN_CLICKED(IDC_BUTTON_8,&CalculatorDlg::OnBnClickedButtonNumber) ON_BN_CLICKED(IDC_BUTTON_9,&CalculatorDlg::OnBnClickedButtonNumber) ON_BN_CLICKED(IDC_BUTTON_ADD,&CalculatorDlg::OnBnClickedButtonOperator)ON_BN_CLICKED(IDC_BUTTON_SUBTRACT,&CalculatorDlg::OnBnClickedButtonOperator)ON_BN_CLICKED(IDC_BUTTON_MULTIPLY,&CalculatorDlg::OnBnClickedButtonOperator)ON_BN_CLICKED(IDC_BUTTON_DIVIDE,&CalculatorDlg::OnBnClickedButtonOperator)ON_BN_CLICKED(IDC_BUTTON_CLEAR,&CalculatorDlg::OnBnClickedButtonClear)ON_BN_CLICKED(IDC_BUTTON_EQUAL,&CalculatorDlg::OnBnClickedButtonEqual)END_MESSAGE_MAP``````cppvoid CalculatorDlg::OnBnClickedButtonNumber(UINT nID)//获取按钮上的数字CString strNumber;strNumber.Format(_T("%d"), nID - IDC_BUTTON_0);::SetWindowText(m_hResultEdit, strNumber);void CalculatorDlg::OnBnClickedButtonOperator(UINT nID) //获取按钮上的运算符TCHAR chOperator = '+';switch (nID)case IDC_BUTTON_ADD:chOperator = '+';break;case IDC_BUTTON_SUBTRACT:chOperator = '-';break;case IDC_BUTTON_MULTIPLY:chOperator = '*';break;case IDC_BUTTON_DIVIDE:chOperator = '/';break;}CString strOperator;strOperator.Format(_T("%c"), chOperator); ::SetWindowText(m_hResultEdit, strOperator); void CalculatorDlg::OnBnClickedButtonClear::SetWindowText(m_hResultEdit, _T(""));void CalculatorDlg::OnBnClickedButtonEqual//执行运算CString strExpression;::GetWindowText(m_hResultEdit, strExpression);//2.使用字符串解析和计算函数,计算结果//...//3.显示结果CString strResult;strResult.Format(_T("%f"), 123.456); // 替换为实际的计算结果::SetWindowText(m_hResultEdit, strResult);```请注意,在实际的计算过程中,您需要实现字符串解析和数学计算部分的代码。

VS2024下计算器的MFC编程实现

VS2024下计算器的MFC编程实现

VS2024下计算器的MFC编程实现MFC(Microsoft Foundation Classes)是Windows 平台上的一个基础类库,用于创建界面友好的Windows应用程序。

通过MFC,我们可以使用C++语言来编写Windows应用程序,并且能够充分利用Windows操作系统的各种功能。

计算器是一个经典的应用程序,可以通过MFC来实现。

下面我们将通过以下步骤来编写一个简单的计算器程序。

1.创建一个新的MFC应用程序项目在Visual Studio 2024中,选择File -> New -> Project,然后选择Visual C++ -> MFC -> MFC Application,并设置相应的项目名称和位置。

点击OK按钮创建项目。

2.设计界面在资源视图中,打开Dialog文件夹,双击IDD_CALCULATOR_DIALOG查看对话框。

在对话框中,我们可以添加按钮、文本框等控件来设计计算器的界面。

3.添加控件和事件处理函数在对话框中添加控件,如按钮、文本框等。

为按钮添加事件处理函数,在事件处理函数中实现计算器的相应功能。

例如,我们可以添加以下按钮:-数字按钮0-9-运算符按钮+、-、*、/-清空按钮C-等号按钮=-小数点按钮.对于数字按钮0-9,我们可以为每个按钮添加一个点击事件处理函数,将对应的数字添加到文本框中。

对于运算符按钮,我们可以为每个按钮添加一个点击事件处理函数,根据当前点击的运算符更新计算器的状态。

对于清空按钮C,我们可以为其添加一个点击事件处理函数,在事件处理函数中清空文本框的内容。

对于等号按钮=,我们可以为其添加一个点击事件处理函数,在事件处理函数中根据计算器的状态进行相应的计算,并将结果显示在文本框中。

对于小数点按钮.,我们可以为其添加一个点击事件处理函数,在事件处理函数中向文本框中添加一个小数点。

4.实现计算功能在事件处理函数中,我们可以使用字符串转换函数和数学运算函数来实现计算器的相应功能。

基于MFC的简易计算器课程设计

基于MFC的简易计算器课程设计
{
switch(nID)
{
case IDCumber;
if(NumberState==1)
number1=m_number;
else number2=m_number;
UpdateData(FALSE);
break;
case IDC_NUMBER12:
m_number=(int)m_number/10;
case IDC_NUMBER3:n=3;break;
case IDC_NUMBER4:n=4;break;
case IDC_NUMBER5:n=5;break;
case IDC_NUMBER6:n=6;break;
case IDC_NUMBER7:n=7;break;
case IDC_NUMBER8:n=8;break;
if(NumberState==1)
number1=m_number;
else number2=m_number;
UpdateData(FALSE);
break;
case IDC_NUMBER13:
OperationState=1;m_number=0;UpdateData(FALSE);NumberState=2;break;
case IDC_NUMBER9:n=9;break;
case IDC_NUMBER10:n=0;break;
}
if (NumberState==1)
{
if(point_1==1)
{
m_number=m_number+n*pow(0.1,point_1);
point_1++;
number1=m_number;
number1=m_number;break;

C语言编写一个计算器界面(可视化界面和多功能)

C语言编写一个计算器界面(可视化界面和多功能)

C语⾔编写⼀个计算器界⾯(可视化界⾯和多功能)⽬录引⾔计算器总结引⾔在⼤学期间,C 语⾔或者数据结构等课程,⽼师会要求学⽣编写⼀个⼩项⽬练⼿,或者期末编写⼀个⼩软件等课程设计。

今天在电脑看到⼤⼀学C语⾔时,实验课上写的计算器功能,挺有意思。

所以在此分享给学C语⾔的学弟学妹,记得收藏保留!计算器简单版本计算器,主要实现的是简单两个数的加法,减法,乘法,除法,求余功能。

⽤户可以在主菜单选择需要计算的功能,然后根据⽤户输⼊的数字,进⾏计算,输出结果。

⾸先,我们定义五个⽅法,实现两个数的加法,减法,乘法,除法,求余功能。

代码如下:// 加法float add(float a, float b) {return a + b;}// 减法float sub(float a, float b) {return a - b;}// 乘法float mul(float a, float b) {return a * b;}// 除法float mod(float a, float b) {return a / b;}// 求余int com(int a, int b) {return a % b;}然后定义⼀个打印主菜单界⾯的函数,使⽤简介美观的菜单界⾯,供⽤户选择要计算的功能,代码如下:// 打印主功能菜单void printMenu() {// 清屏// system("cls");printf("|----------------------- 计算器 -----------------------|\n");printf("| |\n");printf("| By -- 陈⽪的JavaLib |\n");printf("| |\n");printf("|---------------------- 1:加法 -----------------------|\n");printf("|---------------------- 2:减法 -----------------------|\n");printf("|---------------------- 3:乘法 -----------------------|\n");printf("|---------------------- 4:除法 -----------------------|\n");printf("|---------------------- 5:求余 -----------------------|\n");printf("|---------------------- 6:退出 -----------------------|\n");printf("| |\n");printf("|----------------------- 计算器 -----------------------|\n");}最后,我们在主函数 main 中,定义⼀个 while 循环代码块,不断读取⽤户输⼊的内容,进⾏数字计算,代码如下:int main() {// 选择的功能int select = 0;// 定义算术的两个数float a, b;while (select != 6){select = 0;// 打印主菜单printMenu();// 只允许选择菜单栏内的数字,不是则重新选择while (select < 1 || select > 6) {printf("请输⼊菜单功能(1-6):");scanf("%d", &select);}if (6 == select) {printf("\n|----------------- 欢迎使⽤计算器!再见!-----------------|\n"); return 0;}printf("\n请输⼊两个数(⽤空格隔开两个数):");scanf("%f %f", &a, &b);switch (select) {case 1:printf("%f+%f=%f\n\n", a, b, add(a, b));break;case 2:printf("%f-%f=%f\n\n", a, b, sub(a, b));break;case 3:printf("%f*%f=%f\n\n", a, b, mul(a, b));break;case 4:printf("%f/%f=%f\n\n", a, b, mod(a, b));break;case 5:printf("%f/%f=%d\n\n", a, b, com((int)a, (int)b));break;case 6:default:break;}}}下⾯我们演⽰⼏个例⼦,能更加直观体验计算器的功能:菜单功能选择错误,会提⽰重新选择加法除法退出简单版本计算器,完整代码如下:#include <stdio.h>#include <stdlib.h>// 加法float add(float a, float b) {return a + b;}// 减法float sub(float a, float b) {return a - b;}// 乘法float mul(float a, float b) {return a * b;}// 除法float mod(float a, float b) {return a / b;}// 求余int com(int a, int b) {return a % b;}// 打印主功能菜单void printMenu() {// 清屏// system("cls");printf("|----------------------- 计算器 -----------------------|\n");printf("| |\n");printf("| By -- 陈⽪的JavaLib |\n"); printf("| |\n");printf("|---------------------- 1:加法 -----------------------|\n");printf("|---------------------- 2:减法 -----------------------|\n");printf("|---------------------- 3:乘法 -----------------------|\n");printf("|---------------------- 4:除法 -----------------------|\n");printf("|---------------------- 5:求余 -----------------------|\n");printf("|---------------------- 6:退出 -----------------------|\n");printf("| |\n");printf("|----------------------- 计算器 -----------------------|\n");}/*** 简单版本计算器功能 By -- 陈⽪的JavaLib* @return*/int main() {// 选择的功能int select = 0;// 定义算术的两个数float a, b;while (select != 6){select = 0;// 打印主菜单printMenu();// 只允许选择菜单栏内的数字,不是则重新选择while (select < 1 || select > 6) {printf("请输⼊菜单功能(1-6):");scanf("%d", &select);}if (6 == select) {printf("\n|----------------- 欢迎使⽤计算器!再见!-----------------|\n");return 0;}printf("\n请输⼊两个数(⽤空格隔开两个数):");scanf("%f %f", &a, &b);switch (select) {case 1:printf("%f+%f=%f\n\n", a, b, add(a, b));break;case 2:printf("%f-%f=%f\n\n", a, b, sub(a, b));break;case 3:printf("%f*%f=%f\n\n", a, b, mul(a, b));break;case 4:printf("%f/%f=%f\n\n", a, b, mod(a, b));break;case 5:printf("%f/%f=%d\n\n", a, b, com((int)a, (int)b));break;case 6:default:break;}}}总结在⼤学期间,如果是计算机类的专业,⼀般都会学习 C 语⾔,作为编程⼊门语⾔,⼤家⼀定要学习好此门语⾔,⽽且如果学好了,其实学习其他编程语⾔就很容器上⼿的,不同语⾔其实⼤同⼩异,只要你编程思维提升了,基础语法掌握了,才能学习更加深⼊的知识。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算器的界面制作简单下面是我以前看过的一个程序,现在提供出来供你参考:建议自己动手将下面的代码组织运行一遍,你会受益的!祝你好运!简易计算器(MFC)1.设计目标了解Windows应用程序的结构与DOS程序的不同,掌握应用MFC类库编写Windows应用程序的基本模式。

2.设计内容以简易计算器为例,通过对简单应用软件计算器的设计,编制、调试,实现简单的加,减,乘,除等运算,以学习应用MFC库类编写对话框的原理,加深对C++类的学习及应用。

3. 设计思想基于MFC库类对对话框界面的设计,通过创建类成员函数成员变量,编辑控件创建消息映射,调用消息函数完成数据的输入输出,实现计算功能。

生成简单的应用软件。

4. 设计说明(1)包含的功能有:加、减、乘、除运算,开方、平方等功能。

(2)计算器上数字0—9为一个控件数组,加、减、乘、除为一个控件数组,其余为单一的控件。

(3)输入的原始数据、运算中间数据和结果都显示在窗口顶部的同一个标签中。

(4)计算功能基本上是用系统内部函数。

(5)程序可以能自动判断输入数据的正确性,保证不出现多于一个小数点、以0开头等不正常现象。

(6)“CE”按钮可以清除所有已输入的数据从头计算5. 设计步骤(1)选择FileNewlProject命令,选择MFC AppWizard(exe)创建Project名为Caa,按确定。

在弹出界面选择创建对话框,单击Finish按钮(2)在生成的设计界面中加入控件,得到计算器应用界面。

如图:(3)为控件编辑框编辑ID,如图:按钮名称ID 用途0 IDC_0 按键01 IDC_1 按键12 IDC_2 按键23 IDC_3 按键34 IDC_4 按键45 IDC_5 按键56 IDC_6 按键67 IDC_7 按键78 IDC_8 按键89 IDC_9 按键9. IDC_dian 按键 .+/- IDC_zhengfu 正负+ IDC_jia 加- IDC_jian 减* IDC_cheng 乘/ IDC_chu 除CE IDC_qinglin 清零sqrt IDC_sqrt 开方x*x IDC_pingfang 平方= IDC_dengyu 等于编辑框IDC_E1 显示数据输入输出(4)进入ClassWizard界面选择Message Maps为控件插入消息映射,插入消息函数,实现控件命令功能。

如图:(5) 进入ClassWizard界面Message Varibles为编辑框添加成员变量m_result 用以显示结果。

如图:(6)在CaaDlg.h中加入在主要成员函数和成员变量的申明在CaaDlg.cpp中加入主要成员函数实现过程和成员变量的初始化(代码片段将于后面介绍)。

6. 主要成员函数关系图7. 程序主要代码//在头文件中手动添加成员函数与变量声明// caaDlg.h : header file//定义两个euum型结构enum Operator { OpNone, OpAdd, OpSubtract, OpMultiply, OpDivide }; enum CalcError { ErrNone, ErrDivideByZero };float m_operand; //存储当前输入的操作数float m_accum; //存储当前的计算处理结束BOOL m_bCoff; //标识当前输入是否是小数float m_coff; //小数输入时的系数Operator m_operator; //enum型变量用以标识当前运算符CalcError m_errorState; //enum型变量用以标识当前运算状态BOOL m_bOperandAvail; //标识当前输入是否是新输入数字void UpdateDisplay(); //处理显示void Calculate(); //处理计算void OnOperandInput(int a); //处理数字输入//在执行文件中添加成员函数实现部分与变量初始// caaDlg.cpp : implementation file//以下是对声明变量进行初始CCaaDlg::CCaaDlg(CWnd* pParent /*=NULL*/): CDialog(CCaaDlg::IDD, pParent){//{{AFX_DATA_INIT(CCaaDlg)m_result = _T(""); //默认为m_result变量初始//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);m_coff=0.1; //为变量进行初始m_bCoff=0; //为变量进行初始m_errorState = ErrNone; //为变量进行初始m_bOperandAvail=FALSE; //为变量进行初始m_operator=OpNone; //为变量进行初始}//以下是消息处理函数,用以响应消息映射void CCaaDlg::On0() //处理“ 0”按钮{// TODO: Add your control notification handler code hereOnOperandInput(0);}void CCaaDlg::On1() //处理“ 1”按钮{// TODO: Add your control notification handler code hereOnOperandInput(1);}void CCaaDlg::On2() //处理“ 2”按钮{// TODO: Add your control notification handler code hereOnOperandInput(2);}void CCaaDlg::On3() //处理“ 3”按钮{// TODO: Add your control notification handler code hereOnOperandInput(3);}void CCaaDlg::On4() //处理“4”按钮{// TODO: Add your control notification handler code hereOnOperandInput(4);}void CCaaDlg::On5() //处理“ 5”按钮{// TODO: Add your control notification handler code hereOnOperandInput(5);}void CCaaDlg::On6() //处理“ 6”按钮{// TODO: Add your control notification handler code hereOnOperandInput(6);}void CCaaDlg::On7() //处理“ 7”按钮{// TODO: Add your control notification handler code hereOnOperandInput(7);}void CCaaDlg::On8() //处理“ 8”按钮{// TODO: Add your control notification handler code hereOnOperandInput(8);}void CCaaDlg::On9() //处理“ 9”按钮{// TODO: Add your control notification handler code hereOnOperandInput(9);}void CCaaDlg::Oncheng() //处理“ *”按钮{// TODO: Add your control notification handler code hereCalculate();m_operator = OpMultiply;}void CCaaDlg::Onchu() //处理“ /”按钮{// TODO: Add your control notification handler code hereCalculate();m_operator = OpDivide;}void CCaaDlg::Ondengyu() //处理“ =”按钮{// TODO: Add your control notification handler code hereCalculate();m_operator = OpNone;}void CCaaDlg::Ondian() //处理“ .”按钮{// TODO: Add your control notification handler code herem_bCoff=1;UpdateDisplay();}void CCaaDlg::Onjia() //处理“ +”按钮{// TODO: Add your control notification handler code hereCalculate();m_operator = OpAdd;}void CCaaDlg::Onjian() //处理“ -”按钮{// TODO: Add your control notification handler code hereCalculate();m_operator = OpSubtract;}void CCaaDlg::Onpingfang() //处理“ x*x”按钮{// TODO: Add your control notification handler code herem_operand*=m_operand;UpdateDisplay();}void CCaaDlg::Onqinglin() //处理“ CE”按钮{// TODO: Add your control notification handler code herem_operator = OpNone;m_operand = 0;m_accum = 0;m_bOperandAvail = FALSE;m_errorState = ErrNone;m_coff=0.1;m_bCoff=0;UpdateDisplay();}void CCaaDlg::Onsqrt() //处理“ sqrt”按钮{// TODO: Add your control notification handler code herem_operand=sqrt(m_operand);UpdateDisplay();}void CCaaDlg::Onzhengfu() //处理“ +/-”按钮{// TODO: Add your control notification handler code herem_operand*=-1;UpdateDisplay();}//以下是自定义函数,用于实现计算功能void CCaaDlg::OnOperandInput(int a) //处理0-9 数字的输入函数{ if (m_errorState != ErrNone) //判断当前运算是否有误,若有则返回return;if (!m_bOperandAvail) //判断是否输入新的数字,1-是0-否m_operand = 0;if(!m_bCoff) //判断是否是小数输入,1-是0-否m_operand=m_operand*10+(a);else{m_operand=m_operand+(a)*m_coff;m_coff*=0.1;}m_bOperandAvail=TRUE;UpdateDisplay(); //更新显示}void CCaaDlg::Calculate() //处理计算函数{if (m_errorState != ErrNone)return;if (m_bOperandAvail){//如果没有计算符就将m_operand值赋予m_accumif (m_operator == OpNone)m_accum = m_operand;else if (m_operator == OpMultiply) //否则按计算符进行计算m_accum *= m_operand;else if (m_operator == OpDivide){if (m_operand == 0)m_errorState = ErrDivideByZero;elsem_accum /= m_operand;}else if (m_operator == OpAdd)m_accum += m_operand;else if (m_operator == OpSubtract)m_accum -= m_operand;}m_bOperandAvail = FALSE;m_bCoff=0;m_coff=0.1;UpdateDisplay();}void CCaaDlg::UpdateDisplay() //处理显示函数{if (GetSafeHwnd() == NULL)return;if (m_errorState != ErrNone)m_result="除数不能为零";else //如果当前计算无错误那么进行显示{//如果是输入计算数,那么显示输入情况,如果按下计算符,则显示结果float lVal = (m_bOperandAvail) ? m_operand : m_accum;m_result.Format(_T("%f"), lVal); //将float型转化为CString型int i=m_result.GetLength();while(m_result.GetAt(i-1)=='0'){m_result.Delete(i-1,1);i-=1;}}//用编辑控件变量m_result改变编辑控件的值,更新显示UpdateData(FALSE);}8.难点分析在利用MFC编写计算器过程中,遇到的技术上的问题,及解决方法。

相关文档
最新文档