在win32工程下做计算器.doc_第1页
在win32工程下做计算器.doc_第2页
在win32工程下做计算器.doc_第3页
在win32工程下做计算器.doc_第4页
在win32工程下做计算器.doc_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计报告 题目:在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函数HWNDCreateWindow(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 #include #include #include #include #include #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 button0)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 hwndButtonNUM ; static RECT rect ; static RECT rectDrawLimit = 0, 50, 200, 100;/-this! static TCHAR szBuffer 1024 = 0;/ LPSTR szBuffer=new TCHAR1024; string str; static HWND hwndEdit; LPTSTR szString=new TCHAR1024;/ static TCHAR String1024=0; LPTSTR String=new TCHAR1024; static float FirstNumber; static float NextNumber; static float ResultNumber; static int i; /static TCHAR StringResult=0; LPSTR StringResult=new TCHAR1024; static int number; int count=1; double num=1; int numbe=1; static TCHAR szBuffer110; static TCHAR szBuffer210; static int iLength; static int cxChar, cyChar ; HDC hdc=GetDC(hwnd); /LPTSTR szBuffer=new TCHAR1024; PAINTSTRUCT ps ; switch (message) case WM_CREATE : cxChar = LOWORD (GetDialogBaseUnits () ; cyChar = HIWORD (GetDialogBaseUnits () ; hwndButton0 = CreateWindow(TEXT(button), button0.szText, WS_CHILD | WS_VISIBLE | button0.iStyle, 0, 120, 50, 50, hwnd, (HMENU)ID_BUTTON0, (LPCREATESTRUCT)lParam)-hInstance, NULL); hwndButton1 = CreateWindow(TEXT(button), button1.szText, WS_CHILD | WS_VISIBLE | button1.iStyle, 50, 120, 50, 50, hwnd, (HMENU)ID_BUTTON1, (LPCREATESTRUCT)lParam)-hInstance, NULL); hwndButton2 = CreateWindow(TEXT(button), button2.szText, WS_CHILD | WS_VISIBLE | button2.iStyle, 100,120,50,50, hwnd,(HMENU)ID_BUTTON2,(LPCREATESTRUCT)lParam)-hInstance,NULL); hwndButton3=CreateWindow(TEXT(button), button3.szText, WS_CHILD|WS_VISIBLE|button3.iStyle, 0,170,50,50, hwnd,(HMENU)ID_BUTTON3, (LPCREATESTRUCT)lParam)-hInstance,NULL); hwndButton4=CreateWindow(TEXT(button), button4.szText, WS_CHILD|WS_VISIBLE|button4.iStyle, 50,170,50,50, hwnd,(HMENU)ID_BUTTON4, (LPCREATESTRUCT)lParam)-hInstance,NULL); hwndButton5=CreateWindow(TEXT(button), button5.szText, WS_CHILD|WS_VISIBLE|button5.iStyle, 100,170,50,50, hwnd,(HMENU)ID_BUTTON5, (LPCREATESTRUCT)lParam)-hInstance,NULL); hwndButton6=CreateWindow(TEXT(button), button6.szText, WS_CHILD|WS_VISIBLE|button6.iStyle, 0,220,50,50, hwnd,(HMENU)ID_BUTTON6, (LPCREATESTRUCT)lParam)-hInstance,NULL); hwndButton7=CreateWindow(TEXT(button), button7.szText, WS_CHILD|WS_VISIBLE|button7.iStyle, 50,220,50,50, hwnd,(HMENU)ID_BUTTON7,(LPCREATESTRUCT)lParam)-hInstance,NULL); hwndButton8=CreateWindow(TEXT(button), button8.szText, WS_CHILD|WS_VISIBLE|button8.iStyle, 100,220,50,50, hwnd,(HMENU)ID_BUTTON8,(LPCREATESTRUCT)lParam)-hInstance,NULL); hwndButton9=CreateWindow(TEXT(button), button9.szText, WS_CHILD|WS_VISIBLE|button9.iStyle, 0,270,100,50, hwnd,(HMENU)ID_BUTTON9,(LPCREATESTRUCT)lParam)-hInstance,NULL); hwndButton10=CreateWindow(TEXT(button), button10.szText, WS_CHILD|WS_VISIBLE|button10.iStyle, 0,70,50,50, hwnd,(HMENU)ID_BUTTON10, (LPCREATESTRUCT)lParam)-hInstance,NULL); hwndButton11=CreateWindow(TEXT(button), button11.szText, WS_CHILD|WS_VISIBLE|button11.iStyle, 100,270,50,50, hwnd,(HMENU)ID_BUTTON11,(LPCREATESTRUCT)lParam)-hInstance,NULL); hwndButton12=CreateWindow(TEXT(button), button12.szText, WS_CHILD|WS_VISIBLE|button12.iStyle, 50,70,50,50, hwnd,(HMENU)ID_BUTTON12, (LPCREATESTRUCT)lParam)-hInstance,NULL); hwndButton13=CreateWindow(TEXT(button), button13.szText, WS_CHILD|WS_VISIBLE|button13.iStyle, 100,70,50,50, hwnd,(HMENU)ID_BUTTON13,(LPCREATESTRUCT)lParam)-hInstance,NULL); hwndButton14=CreateWindow(TEXT(button), button14.szText, WS_CHILD|WS_VISIBLE|button14.iStyle, 150,70,70,50, hwnd,(HMENU)ID_BUTTON14, (LPCREATESTRUCT)lParam)-hInstance,NULL); hwndButton15=CreateWindow(TEXT(button), button15.szText, WS_CHILD|WS_VISIBLE|button15.iStyle, 150,120,70,50, hwnd,(HMENU)ID_BUTTON15, (LPCREATESTRUCT)lParam)-hInstance,NULL); hwndButton16=CreateWindow(TEXT(button), button16.szText, WS_CHILD|WS_VISIBLE|button16.iStyle, 150,170,70,50, hwnd,(HMENU)ID_BUTTON16, (LPCREATESTRUCT)lParam)-hInstance,NULL); hwndButton17=CreateWindow(TEXT(button), button17.szText, WS_CHILD|WS_VISIBLE|button17.iStyle, 150,220,70,50, hwnd,(HMENU)ID_BUTTON17, (LPCREATESTRUCT)lParam)-hInstance,NULL); hwndButton18=CreateWindow(TEXT(button), button18.szText, WS_CHILD|WS_VISIBLE|button18.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);/-thisSetWindowText(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);/-thisSetWindowText(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(hwn

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论