当前位置:文档之家› 在win32工程下做计算器

在win32工程下做计算器

课程设计报告题目:在win32 application工程下计算器的设计与实现小组成员:陈李元41212204余斌41212202目录1概述1.1课程设计的内容2系统需求分析2.1系统目标2.2重要功能2.3开发环境3设计过程3.1主函数WinMain设计过程3.2窗口过程WndProc4小结5参考文献附录1:程序代码附录2:程序运行部分截图1概述1.1课程设计的内容这次c++课程设计我们组选的是设计一个带界面的计算器,不是用MFC,而是在win32 application工程下做的带界面的计算器。

它属于windows程序设计范畴。

我们主要是把功夫花在做界面上了,这个计算器本身所具有的功能很少,它只支持少量的算术运算。

2系统需求分析2.1系统目标我们在日常生活和学习中,经常会遇到一些关于数值的运算。

所以我们组就着手开始做一个计算器方便我们的学习和生活。

这个计算器它具有加法,减法,乘法,除法四种基本的算术运算。

另外还具有计算N阶阶乘的功能,此外还具有求一个弧度的正弦(余弦和它功能类似要想求余弦事先做一些弧度的转化即可)。

该计算器用例图如下:类图如下:2.2重要功能具备四种最基本的算术运算。

另外还具有阶乘,求正弦的功能。

2.3开发环境本程序是在visual c++ 6.0编译,链接,运行。

它是在win32 application工程下所创建。

3设计过程3.1主函数WinMain设计过程首先在界面设计中我们要用到大量的windows API。

这些函数都是在windows.h标准库中。

在windows程序设计中,它必须要包含一个程序入口主函数WinMain和一个过程函数WndProc。

WinMain总是以下面的形式出现。

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) WinMain第一个参数一般叫做“实例句柄”,在windows 程序中句柄就是一个数值,程序里面用他来标识一些东西。

第二个参数总是定义为NULL(定义为0)第三个参数是用来运行程序的命令行。

有些windows程序在启动时用它来把文件装入内存。

第四个参数用来指明程序最初如何显示。

创建一个窗口的步骤:(1)注册窗口类(2)创建窗口(3)在桌面显示窗口(4)更新窗口客户区(5)进入无限的消息获取和处理的循环。

首先是获取消息,如果有消息到达,则将消息分派到回调处理函数,如果消息是WM_QUIT,则GetMessage函数返回FALSE,整个消息循环结束。

其中消息具体的处理过程是在WndProc 函数中1.注册:Windows程序设计中有许许多多的结构体。

其中WNDCLASS是用于注册窗口类的。

typedef struct _WNDCLASS {UINT style;// 窗口类型WNDPROC lpfnWndProc;//窗口处理函数int cbClsExtra;//窗口扩展int cbWndExtra;//窗口实例扩展HINSTANCE hInstance;//实例句柄HICON hIcon;//窗口的最小化图标HCURSOR hCursor;//窗口鼠标光标HBRUSH hbrBackground;//窗口背景色LPCTSTR lpszMenuName;//窗口菜单LPCTSTR lpszClassName;// 窗口类名} WNDCLASS, *LPWNDCLASS;它定义了窗口的属性,风格等等,如本程序中附图:3创建窗口创建窗口,用注册窗口类的类名调用CreateWindow函数HWND CreateWindow(LPCTSTRlpClassName,//指向已注册窗口类名称的指针LPCTSTRlpWindowName,//指向窗口名称的指针DWORDdwStyle,//窗口的风格intx,//窗口位置的X坐标inty,//窗口位置的Y坐标intnWidth,//窗口的宽度intnHeight,//窗口的高度HWNDhWndParent,//父窗口的句柄HMENUhMenu,//窗口菜单句柄HINSTANCEhInstance,//应用程序使用句柄LPVOIDlpParam//应用程序数据区句柄 );在本程序中代码如图:3显示:调用显示函数ShowWindow (hwnd, iCmdShow) ;4更新窗口客户区:调用UpdateWindow (hwnd) ;函数5消息循环:在这里又要涉及一个结构体MSG定义如下:typedef struct tagMSG {HWND hwnd;UINT message;WPARAM wParam;LPARAM lParam;DWORD time;POINT pt;} MSG;调用TranslateMessage (&msg)函数把键盘输入翻译成为可传递的消息。

调用DispatchMessage (&msg) 分发一个消息到对应窗口的窗口函数。

3.2窗口过程WndProc:窗口过程总是按照如下方式来定义:LRESULT CALLBACK WndProc (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) 程序的功能就是在这里面实现。

在这里面调用CreateWindow函数来实现按钮的创建例如下图:这就是创建了一个按钮。

上面代码是创建了一个文本框按钮,用来显示输进去的字符以及输出结果。

重复上面的过程便得一个计算器界面,如下图:接下来要做的就是响应这些按钮并实现算术运算。

在windows中要做的是为每个按钮设置一个ID号(在创建时已经设置),这就使得每个按钮都区别开了。

详情请见代码。

switch(LOWORD(wParam))语句就是响应每个按钮在用case语句分别来响应每个按钮以及所实现的功能。

例如case ID_BUTTON2:{ lstrcat(szBuffer, "3");SetWindowText(hwndEdit,szBuffer);return 0;}该语句的功能是响应数字3按钮,并将字符‘3’显示到文本框中。

在这里要用到两个函数lstrcat()和SetWindowText()函数。

首先我们要定义一个缓冲区static TCHAR szBuffer[1024] = {0};并初始化为’\0’.用来暂时存放响应按钮并输出到文本框里的字符串。

接下来调用lstrcat()函数将字符存放到缓冲区szBuffer里面。

然后调用SetWindowText()函数将缓冲区里面的字符串输出到文本框里。

(这是在做计算器程序的最重要的一个过程)另外一个很重要的操作就是全在响应等于号按钮里面完成的。

程序代码附图:大概阐述一下等号里面的过程。

在这里面先将文本框里的字符串用GetWindowText()函数提取出来。

并用GetWindowTextLength()函数计算出字符串的长度。

然后再把字符串复制到另一数组String中,随后用memset()函数将缓冲区szBuffer清零。

接下来就是对String的处理(String里面存放的是字符串而不是数值和运算符)。

用isdigit()函数找出运算符的位置。

接下来就是调用sscanf()函数。

该函数的原型:定义函数int sscanf (const char *str,const char * format,........);函数说明sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。

格式转换形式请参考scanf()。

转换后的结果存于对应的参数内。

返回值成功则返回参数数目,失败则返回-1,错误原因存于errno中。

返回0表示失败否则,表示正确格式化数据的个数例如:sscanf(str,"%d%d%s", &i,&i2, &s); 如果三个变成都读入成功会返回3。

将运算符前后转化成数值厚分别存放在FirstNumber,NextNumber变量中。

并对这两个变量实行相对应的四则运算并把结果存放在ResultNumber变量中。

调用sprintf()函数将实型变量转化为字符串变量并存放到StringResult里面中。

然后在调用SetWindowText()函数将StringResult里面里面的字符串输出到文本框中。

上面只是程序中一些很重要的东西,还有很多就不具体说明,许多函数的参数也是很复杂在这里就没一一写上,你想知道可以百度。

4小结Windows程序设计对我们来说是新知识,刚开始什么都不懂,就去图书馆借了两本书啃,不懂得就上网搜找答案。

那段时间几乎就是天天在弄这东西因为是新知识什么都不懂。

过程真的很煎熬,但做完了就觉得收获了很多。

知道了很多东西了解了很多东西。

5参考文献《Windows程序设计》第五版珍藏版Charles Petzold 著方敏张胜梁路平赵勇等译《windows程序设计》第二版王艳平张铮编著附录1:程序代码#include <windows.h>#include <iostream>#include <memory.h>#include <cctype>#include <stdlib.h>#include <cmath>#define IDC_EDITTEXT 1000#define ID_BUTTON0 100#define ID_BUTTON1 101#define ID_BUTTON2 102#define ID_BUTTON3 103#define ID_BUTTON4 104#define ID_BUTTON5 105#define ID_BUTTON6 106#define ID_BUTTON7 107#define ID_BUTTON8 108#define ID_BUTTON9 109#define ID_BUTTON10 110#define ID_BUTTON11 111#define ID_BUTTON12 112#define ID_BUTTON13 113#define ID_BUTTON14 114#define ID_BUTTON15 115#define ID_BUTTON16 116#define ID_BUTTON17 117#define ID_BUTTON18 118struct{int iStyle ;TCHAR * szText ;}button[] ={BS_PUSHBUTTON, TEXT ("1"),BS_PUSHBUTTON, TEXT ("2"),BS_PUSHBUTTON, TEXT ("3"), BS_PUSHBUTTON, TEXT ("4"), BS_PUSHBUTTON, TEXT ("5"), BS_PUSHBUTTON, TEXT ("6"),BS_PUSHBUTTON, TEXT ("7"),BS_PUSHBUTTON, TEXT ("8"),BS_PUSHBUTTON, TEXT ("9"),BS_PUSHBUTTON, TEXT ("0"),BS_PUSHBUTTON, TEXT ("C"),BS_PUSHBUTTON, TEXT ("."),BS_PUSHBUTTON, TEXT ("sin"),BS_PUSHBUTTON, TEXT ("n!"),BS_PUSHBUTTON, TEXT ("+"),BS_PUSHBUTTON, TEXT ("-"),BS_PUSHBUTTON, TEXT ("x"),BS_PUSHBUTTON, TEXT ("/"),BS_PUSHBUTTON, TEXT ("="),} ;#define NUM (sizeof button / sizeof button[0])LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow){static TCHAR szAppName[] = TEXT ("Calculator") ;HWND hwnd ;MSG msg ;WNDCLASS wndclass ;wndclass.style = CS_HREDRAW | CS_VREDRAW ;wndclass.lpfnWndProc = WndProc ;wndclass.cbClsExtra = 0 ;wndclass.cbWndExtra = 0 ;wndclass.hInstance = hInstance ;wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;wndclass.lpszMenuName = NULL ;wndclass.lpszClassName = "Calculator" ;if (!RegisterClass (&wndclass)){MessageBox (NULL, TEXT ("This program requires Windows NT!"),szAppName, MB_ICONERROR) ;return 0 ;}hwnd = CreateWindow (szAppName, TEXT ("Calculator"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,235, 355,NULL, NULL, hInstance, NULL) ;ShowWindow (hwnd, iCmdShow) ;UpdateWindow (hwnd) ;while (GetMessage (&msg, NULL, 0, 0)){TranslateMessage (&msg) ;DispatchMessage (&msg) ;}return msg.wParam ;}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {static HWND hwndButton[NUM] ;static RECT rect ;static RECT rectDrawLimit = {0, 50, 200, 100};//---this!!static TCHAR szBuffer [1024] = {0};// LPSTR szBuffer=new TCHAR[1024];string str;static HWND hwndEdit;LPTSTR szString=new TCHAR[1024];// static TCHAR String[1024]={0};LPTSTR String=new TCHAR[1024];static float FirstNumber;static float NextNumber;static float ResultNumber;static int i;//static TCHAR StringResult[]={0};LPSTR StringResult=new TCHAR[1024];static int number;int count=1;double num=1;int numbe=1;static TCHAR szBuffer1[10];static TCHAR szBuffer2[10];static int iLength;static int cxChar, cyChar ;HDC hdc=GetDC(hwnd);//LPTSTR szBuffer=new TCHAR[1024];PAINTSTRUCT ps ;switch (message){case WM_CREATE :cxChar = LOWORD (GetDialogBaseUnits ()) ;cyChar = HIWORD (GetDialogBaseUnits ()) ;hwndButton[0] = CreateWindow(TEXT("button"), button[0].szText, WS_CHILD | WS_VISIBLE | button[0].iStyle,0, 120, 50, 50,hwnd, (HMENU)ID_BUTTON0, ((LPCREATESTRUCT)lParam)->hInstance, NULL);hwndButton[1] = CreateWindow(TEXT("button"), button[1].szText, WS_CHILD | WS_VISIBLE | button[1].iStyle,50, 120, 50, 50,hwnd, (HMENU)ID_BUTTON1, ((LPCREATESTRUCT)lParam)->hInstance, NULL);hwndButton[2] = CreateWindow(TEXT("button"), button[2].szText, WS_CHILD | WS_VISIBLE | button[2].iStyle,100,120,50,50,hwnd,(HMENU)ID_BUTTON2,((LPCREATESTRUCT)lParam)->hInstance,NULL);hwndButton[3]=CreateWindow(TEXT("button"), button[3].szText, WS_CHILD|WS_VISIBLE|button[3].iStyle,0,170,50,50,hwnd,(HMENU)ID_BUTTON3, ((LPCREATESTRUCT)lParam)->hInstance,NULL);hwndButton[4]=CreateWindow(TEXT("button"), button[4].szText, WS_CHILD|WS_VISIBLE|button[4].iStyle,50,170,50,50,hwnd,(HMENU)ID_BUTTON4, ((LPCREATESTRUCT)lParam)->hInstance,NULL);hwndButton[5]=CreateWindow(TEXT("button"), button[5].szText, WS_CHILD|WS_VISIBLE|button[5].iStyle,100,170,50,50,hwnd,(HMENU)ID_BUTTON5, ((LPCREATESTRUCT)lParam)->hInstance,NULL);hwndButton[6]=CreateWindow(TEXT("button"), button[6].szText, WS_CHILD|WS_VISIBLE|button[6].iStyle,0,220,50,50,hwnd,(HMENU)ID_BUTTON6, ((LPCREATESTRUCT)lParam)->hInstance,NULL);hwndButton[7]=CreateWindow(TEXT("button"), button[7].szText, WS_CHILD|WS_VISIBLE|button[7].iStyle,50,220,50,50,hwnd,(HMENU)ID_BUTTON7,((LPCREATESTRUCT)lParam)->hInstance,NULL);hwndButton[8]=CreateWindow(TEXT("button"), button[8].szText, WS_CHILD|WS_VISIBLE|button[8].iStyle,100,220,50,50,hwnd,(HMENU)ID_BUTTON8,((LPCREATESTRUCT)lParam)->hInstance,NULL);hwndButton[9]=CreateWindow(TEXT("button"), button[9].szText, WS_CHILD|WS_VISIBLE|button[9].iStyle,0,270,100,50,hwnd,(HMENU)ID_BUTTON9,((LPCREATESTRUCT)lParam)->hInstance,NULL);hwndButton[10]=CreateWindow(TEXT("button"), button[10].szText, WS_CHILD|WS_VISIBLE|button[10].iStyle,0,70,50,50,hwnd,(HMENU)ID_BUTTON10, ((LPCREATESTRUCT)lParam)->hInstance,NULL);hwndButton[11]=CreateWindow(TEXT("button"), button[11].szText, WS_CHILD|WS_VISIBLE|button[11].iStyle,100,270,50,50,hwnd,(HMENU)ID_BUTTON11,((LPCREATESTRUCT)lParam)->hInstance,NULL);hwndButton[12]=CreateWindow(TEXT("button"), button[12].szText, WS_CHILD|WS_VISIBLE|button[12].iStyle,50,70,50,50,hwnd,(HMENU)ID_BUTTON12, ((LPCREATESTRUCT)lParam)->hInstance,NULL);hwndButton[13]=CreateWindow(TEXT("button"), button[13].szText, WS_CHILD|WS_VISIBLE|button[13].iStyle,100,70,50,50,hwnd,(HMENU)ID_BUTTON13,((LPCREATESTRUCT)lParam)->hInstance,NULL);hwndButton[14]=CreateWindow(TEXT("button"), button[14].szText, WS_CHILD|WS_VISIBLE|button[14].iStyle,150,70,70,50,hwnd,(HMENU)ID_BUTTON14, ((LPCREATESTRUCT)lParam)->hInstance,NULL);hwndButton[15]=CreateWindow(TEXT("button"), button[15].szText, WS_CHILD|WS_VISIBLE|button[15].iStyle,150,120,70,50,hwnd,(HMENU)ID_BUTTON15, ((LPCREATESTRUCT)lParam)->hInstance,NULL);hwndButton[16]=CreateWindow(TEXT("button"), button[16].szText, WS_CHILD|WS_VISIBLE|button[16].iStyle,150,170,70,50,hwnd,(HMENU)ID_BUTTON16, ((LPCREATESTRUCT)lParam)->hInstance,NULL);hwndButton[17]=CreateWindow(TEXT("button"), button[17].szText, WS_CHILD|WS_VISIBLE|button[17].iStyle,150,220,70,50,hwnd,(HMENU)ID_BUTTON17, ((LPCREATESTRUCT)lParam)->hInstance,NULL);hwndButton[18]=CreateWindow(TEXT("button"), button[18].szText, WS_CHILD|WS_VISIBLE|button[18].iStyle,150,270,70,50,hwnd,(HMENU)ID_BUTTON18, ((LPCREATESTRUCT)lParam)->hInstance,NULL);CreateWindowEx(0,"edit",NULL,WS_CHILD|WS_VISIBLE|WS_BORDER|ES_MULTILINE,0,0,220,70,hwnd, (HMENU)IDC_EDITTEXT,NULL,NULL);hwndEdit=GetDlgItem(hwnd,IDC_EDITTEXT);return 0;case WM_SIZE :rect.left = 24 * cxChar ;rect.top = 2 * cyChar ;rect.right = LOWORD (lParam) ;rect.bottom = HIWORD (lParam) ;return 0 ;case WM_PAINT :InvalidateRect (hwnd, &rect, TRUE) ;hdc = BeginPaint (hwnd, &ps) ;SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;SetBkMode (hdc, TRANSPARENT) ;EndPaint (hwnd, &ps) ;return 0 ;//case WM_DRAWITEM :// break;case WM_COMMAND :switch(LOWORD(wParam)){case ID_BUTTON0:{ //static TCHAR szBuffer1[]=TEXT("1");//str=str+"1";lstrcat(szBuffer, "1");//::TextOut(hdc,190,50,szBuffer,strlen(szBuffer));// ::DrawText(hdc, szBuffer, -1, &rectDrawLimit, DT_BOTTOM | DT_RIGHT);//---this SetWindowText(hwndEdit,szBuffer);return 0;}case ID_BUTTON1:{lstrcat(szBuffer, "2");//--this!// MessageBox(NULL,szBuffer,"",MB_OK);//::TextOut(hdc,188,50,szBuffer,lstrlen(szBuffer));//--this!// ::DrawText(hdc, szBuffer, -1, &rectDrawLimit, DT_BOTTOM | DT_RIGHT);//---this SetWindowText(hwndEdit,szBuffer);return 0;}case ID_BUTTON2:{ lstrcat(szBuffer, "3");SetWindowText(hwndEdit,szBuffer);return 0;}case ID_BUTTON3:{lstrcat(szBuffer, "4");SetWindowText(hwndEdit,szBuffer);return 0;}case ID_BUTTON4:{lstrcat(szBuffer, "5");SetWindowText(hwndEdit,szBuffer);return 0;}case ID_BUTTON5:{ lstrcat(szBuffer, "6");SetWindowText(hwndEdit,szBuffer);return 0;}case ID_BUTTON6:{ lstrcat(szBuffer, "7");SetWindowText(hwndEdit,szBuffer); return 0;}case ID_BUTTON7:{ lstrcat(szBuffer, "8");SetWindowText(hwndEdit,szBuffer); return 0;}case ID_BUTTON8:{ lstrcat(szBuffer, "9");SetWindowText(hwndEdit,szBuffer); return 0;}case ID_BUTTON9:{ lstrcat(szBuffer, "0");SetWindowText(hwndEdit,szBuffer);return 0;}case ID_BUTTON10:{memset(szBuffer, '\0', sizeof(szBuffer));SetWindowText(hwndEdit,szBuffer);return 0;}case ID_BUTTON11:{ lstrcat(szBuffer, ".");SetWindowText(hwndEdit,szBuffer); return 0;}case ID_BUTTON12:{ //lstrcat(szBuffer, "(");// SetWindowText(hwndEdit,szBuffer);number=atoi(szBuffer);memset(szBuffer, '\0', sizeof(szBuffer));sprintf(StringResult, "%f",sin(number));SetWindowText(hwndEdit,StringResult);return 0;}case ID_BUTTON13:{ //lstrcat(szBuffer, ")");//SetWindowText(hwndEdit,szBuffer);number=atoi(szBuffer);memset(szBuffer, '\0', sizeof(szBuffer));while(count<=number){num=num*count;count++;}sprintf(StringResult, "%f",num);SetWindowText(hwndEdit,StringResult);return 0;}case ID_BUTTON14:{ lstrcat(szBuffer, "+");SetWindowText(hwndEdit,szBuffer); return 0;}case ID_BUTTON15:{ lstrcat(szBuffer, "-");SetWindowText(hwndEdit,szBuffer); return 0;}case ID_BUTTON16:{ lstrcat(szBuffer, "*");SetWindowText(hwndEdit,szBuffer); return 0;}case ID_BUTTON17:{ lstrcat(szBuffer, "/");SetWindowText(hwndEdit,szBuffer);return 0;}case IDC_EDITTEXT:{return 0;}case ID_BUTTON18:{GetWindowText(hwndEdit,szString,1024);iLength=GetWindowTextLength(hwndEdit);// SetWindowText(hwndEdit,szString);strcpy(String,szString);memset(szBuffer, '\0', sizeof(szBuffer));// cout<<String<<endl;// cout<<iLength<<endl;while(isdigit(String[i])){ i++; }switch(String[i]){case '+': sscanf(String,"%f+%f",&FirstNumber,&NextNumber);ResultNumber=FirstNumber+NextNumber;break;case '-': sscanf(String,"%f-%f",&FirstNumber,&NextNumber);ResultNumber=FirstNumber-NextNumber;break;case '*': sscanf(String,"%f*%f",&FirstNumber,&NextNumber);ResultNumber=FirstNumber*NextNumber;break;case '/': sscanf(String,"%f/%f",&FirstNumber,&NextNumber);ResultNumber=FirstNumber/NextNumber;break;default: break;}// cout<<ResultNumber<<endl;sprintf(StringResult, "%f",ResultNumber );SetWindowText(hwndEdit,StringResult);FirstNumber=0;NextNumber=0;ResultNumber=0;memset(StringResult, '\0', sizeof(StringResult));memset(szString, '\0', sizeof(szString));memset(String, '\0', sizeof(String));return 0;}}case WM_DESTROY :PostQuitMessage (0) ;return 0 ;}return DefWindowProc (hwnd, message, wParam, lParam) ; }附录2:计算2*32的正弦:5的阶乘:。

相关主题