ImageVerifierCode 换一换
格式:DOCX , 页数:33 ,大小:26.47KB ,
资源ID:4214130      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4214130.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(用VC++做计算器.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

用VC++做计算器.docx

1、用VC+做计算器 用VC+做计算器在这一章,要实现一个简单计算器。其类似于 Windows附件中自带的计算器。实际效果如图 3-1所示,这个计算器不仅实现了简单的四则运算功能,还实现了高级的科学计算功能,而且具有简洁大方的图文外观。该计算器具有一个菜单栏,一个编辑框及若干按键。编辑框可以用任何指定的字体和颜色显示文本。按钮控件具有对鼠标敏感的功能,当鼠标处于不同的位置和状态时,按钮控件会显示不同的颜色,并且所有按钮控件的客户区域为椭圆或圆形。其实际效果如图 3-1所示:图 3-1计算器示例效果图为对话框添加菜单。制定高级按钮控件,该按钮具有不规则的形状,并可以根据用户鼠标的位置和点击状态的不同

2、,显示不同的颜色。制定高级编辑控件,该编辑控件可以指定文本文字的字体和颜色。实现对话框的扩展功能。3.1窗体设计该计算器是基于对话框的应用程序,利用 MFC AppWizard生成应用计算器应用程序框架,具体步骤如下:(1)执行 VC程序,选择 FILE|New命令,弹出 New对话框,单击 Projects选项卡,选择 MFC AppWizard(exe)选项,然后在 Project Name文本框中输入 Calculator。Location文本框是指项目的本地路径,这里读者可以自行设定。保持 Platform里的 Win32复选框不变。如图 3-2所示。(2)单击 OK按钮,弹出 MFC

3、 AppWizardStep1对话框。选择 Dialog Based单选按钮。如图 3-3所示。 Visual C +简明教程图3-2 New对话框图 3-3 MFC AppWizardStep1对话框(3)单击 Next按钮,弹出 MFC AppWizardStep2 of 6对话框。如图 3-4所示。(4)单击 Next按钮,弹出 MFC AppWizardStep3 of 6对话框,如图 3-5所示。图 3-4 MFC AppWizardStep2对话框图 3-5 MFC AppWizardStep3对话框(5)单击 Next按钮,弹出 MFC AppWizardStep4 of 6对话

4、框。如图 3-6所示。点击 Finish按钮,创建框架。图 3-6 MFC AppWizardStep4对话框3.2编辑资源因为在利用 MFC AppWizard生成计算器工程时,选择的应用程序类型是对话框应用程序,所以工程刚建立时,就已经具有如图 3-7所示的对话框资源。 图 3-7初始状态的对话框资源接下来就在它的基础上,编辑和添加其它的资源。3.2.1编辑对话框及控件资源利用 Visual C+提供的资源编辑器对对话框资源进行编辑。删除对话框上默认的OK和 Cancel按钮。添加一个 Edit控件,其控件 ID为 IDC_DSPEDIT。添加若干按扭控件,其 ID如表 3-1所示。表 3

5、-1按扭控件资源清单按钮名称按钮 ID用途0BTN_0BTN_1BTN_2BTN_3BTN_4BTN_5BTN_6BTN_7BTN_8BTN_9按键 0按键 1按键 2按键 3按键 4按键 5按键 6按键 7按键 8按键 9小数点求值123456789.BTN_10BTN_11BTN_12BTN_13BTN_14BTN_15BTN_16BTN_17BTN_18BTN_19=+加号-减号*乘号/除号CEsqrt1/xsin清屏开方倒数正弦 Visual C +简明教程costanx2x3xyexplnBTN_20BTN_21BTN_22BTN_23BTN_24BTN_25BTN_26BTN_27

6、作弦正切平方立方以 x为底的 y次幂以 e为底的幂以 e为底的对数对数log并且添加三个静态框,将编辑控件、普通计算、高级计算分别分组。其效果如图 3-8所示:图 3-8编辑对话框资源3.2.2编辑菜单资源下面为计算器添加一个菜单资源。在 Visual C+中的 Workspace工具条中,选中ResourceView选项卡。在其中的 Menu项上单击鼠标右键,在弹出的快捷菜单中选择InsertMenu命令。如图 3-9所示。图 3-9添加菜单资源这样就为计算器添加了一个菜单资源,将其 ID更改为 IDR_MENU。利用资源编辑器对菜单进行编辑。编辑后的菜单如图 3-10所示。 图 3-10编

7、辑菜单资源3.3实现高级按钮控件类利用 ClassWizard添加一个新类。如图 3-11所示:图 3-11添加 CAdvButton类添加新类名称为 CAdvButton,其父类为 CButton类。我们就在这个类中实现高级的按钮控件。3.3.1添加成员变量和成员函数要实现的高级按钮控件需要对鼠标的移动和点击作出相应的颜色变化。首先在CAdvButton的头文件里加入几种预定义颜色,其代码如下:#define DesiableColor RGB(192,192,192)/灰色,按钮不可用/红色,按钮拥有焦点/绿色,按钮被按下/蓝色,默认#define FocusColor#define Se

8、lectColor#define DefaultColor#define TextColorRGB(255,0,0)RGB(0,255,0)RGB(0,0,255)RGB(128,128,128)/浅灰色,文本颜色如果读者需要将按钮设定为其它颜色,那么只需改动上面的预定义即可。接下来,添加成员变量:public:CRectCRgnm_ClientRect;/用来保存按钮的客户的矩形区域m_ClientRgn ; /用来保存按钮的客户区域,非矩形BOOLm_IsTimerOn;/标志计时器是否已经打开 Visual C +简明教程UINTm_State;/按钮所处状态/当前鼠标位置CPointm

9、_Point;利用 ClassWizard添加下列消息映射和响应函数:/消息响应函数protected:/AFX_MSG(CAdvButton)afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnLButtonDown(UINT nFlags, CPoint point); /afx_msg void OnLButtonUp(UINT nFlags, CPoint point);afx_msg void OnMouseMove(UINT nFlags, CPoint point);/afx_msg void On

10、Timer(UINT nIDEvent);/AFX_MSG/处理 ON_WM_TIMER消息/消息映射/AFX_MSG_MAP(CAdvButton)ON_WM_CREATE()ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()ON_WM_TIMER()/AFX_MSG_MAPWM_CREATE消息当创建窗口时被触发,其响应函数为 OnCreate。WM_LBUTTONDOWN消息当用户鼠标左键按下时被触发,其响应函数为OnLButtonDown。WM_ LBUTTONUP消息当用户鼠标左键抬起时被触发,其响应函数为 OnLButtonU

11、p。WM_MOUSEMOVE消息当用户鼠标移动时被触发,其响应函数为OnMouseMove。WM_TIMER消息当计时器到达时被触发,其响应函数为 OnTimer。再利用 ClassWizard覆盖父类中的两个关键的虚函数:/AFX_VIRTUAL(CAdvButton)public:virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);protected:virtual void PreSubclassWindow();/AFX_VIRTUAL其中对于所有的对于按钮的绘制工作都是在 DrawItem函数中完成的。3.3.2添加创建按

12、钮控件代码按钮的创建分两步完成。首先,调用构造函数对按钮对象进行初始化;其次,调用Create函数创建按钮。在构造函数中,对所有成员变量进行初始化。实现代码如下:/构造函数CAdvButton:CAdvButton() /初始化 m_ClientRectm_ClientRect.leftm_ClientRect.top= 0;= 0;m_ClientRect.right = 0;m_ClientRect.bottom= 0;m_ClientRgn.DeleteObject();/删除区域对象m_ClientRgn.CreateEllipticRgnIndirect(&m_ClientRect)

13、;/创建椭圆区域m_State = 0;m_Point.x = m_Point.y = 0;m_IsTimerOn = FALSE;重载父类中的 Create虚函数。实现代码如下:/重载父类 Create函数BOOL CAdvButton:Create(LPCTSTR lpszCaption,DWORD dwStyle,const RECT& rect,CWnd * pParentWnd,UINT nID)return CButton:Create(lpszCaption, dwStyle, rect, pParentWnd, nID);3.3.3设置按钮形状、外观、颜色、标题要创建用户自绘制

14、按钮,必须将按钮的风格设为 BS_OWNERDRAW。因为只有设置了这一属性,那么当按钮控件的可见部分需要重绘时, Windows才会调用CAdvButton:DrawItem函数,用户定义的对按钮的绘制工作才会有效。否则, DrowItem函数将不会被调用。PreSubclassWindow函数在窗口被创建之前就被调用,因此,在 PreSubclassWindow函数中,将按钮的风格设为 BS_OWNERDRAW。实现代码如下:void CAdvButton:PreSubclassWindow()/修改按钮控件风格ModifyStyle(0, BS_OWNERDRAW|BS_PUSHBUTT

15、ON);CButton:PreSubclassWindow();如果要使得按钮能对鼠标的移动与点击作出不同的变化,那么按钮就需要时刻知道鼠标的位置与动作。所以,就必须在鼠标的点击、弹起及移动消息的响应函数里填加相应的代码,以获取鼠标的位置与动作。在鼠标左键按下时,得到按钮窗口客户区域的屏幕坐标位置和鼠标的屏幕坐标位置。当鼠标坐标位置落于窗口客户区域内,且当前按扭控件处于非选中状态时,将按钮状态标帜设为选中状态,即将 m_State设为 2。接着,调用 Invalidate函数,使客户区无效,框架会自动调用 DrawItem函数,重绘客户区。其实现代码如下: Visual C +简明教程/当鼠标

16、在按钮的客户区内按下时,改变按钮状态void CAdvButton:OnLButtonDown(UINT nFlags, CPoint point)/ TODO: Add your message handler code here and/or call defaultCRect rect;GetWindowRect(&rect);GetCursorPos(&m_Point);/得到按钮客户区域的屏幕坐标位置/得到鼠标的屏幕坐标位置if(rect.PtInRect(m_Point)&(m_State != 2)m_State = 2;Invalidate();/重绘客户区CButton:On

17、LButtonDown(nFlags, point);在鼠标左键抬起时,得到按钮窗口客户区域的屏幕坐标位置和鼠标的屏幕坐标位置。当鼠标坐标位置落于窗口客户区域内,且当前按扭控件处于选中状态时,将按钮状态标帜设为非选中状态,即将 m_State设为 1。接着,调用 Invalidate函数,使客户区无效,框架会自动调用 DrawItem函数,重绘客户区。其实现代码如下:/当鼠标在按钮的客户区内弹起时,改变按钮状态void CAdvButton:OnLButtonUp(UINT nFlags, CPoint point)/ TODO: Add your message handler code h

18、ere and/or call defaultCRect rect;GetWindowRect(&rect);GetCursorPos(&m_Point);/得到按钮客户区域的屏幕坐标位置/得到鼠标的屏幕坐标位置if(rect.PtInRect(m_Point)&(m_State != 1)m_State = 1;Invalidate();/重绘客户区CButton:OnLButtonUp(nFlags, point);在用户移动鼠标时,如果计时器没有启动,则启动计时器,并将计时器启动标帜m_IsTimerOn设为 TRUE。其实现代码如下:/当鼠标在按钮的客户区内移动时,启动计时器void

19、CAdvButton:OnMouseMove(UINT nFlags, CPoint point)/ TODO: Add your message handler code here and/or call default if(!m_IsTimerOn)/如果计时器没有启动SetTimer(1000,100,NULL); /启动计时器m_IsTimerOn = TRUE; /CButton:OnMouseMove(nFlags, point);当计时器消息当达时,其响应函数 OnTimer将被调用。在 OnTimer函数中,首先获得按钮窗口的客户区域的屏幕坐标位置和鼠标的屏幕坐标位置。当鼠标

20、位置落于按扭控件客户区域时,则说明鼠标是在按钮的客户区内移动。如果按扭控件处于非焦点和非选中状态,则将按扭控件状态设为获得焦点状态。调用Invalidate函数,使窗口无效。框架自动调用 DrawItem函数重绘按钮客户区。当鼠标位置没有落于按扭控件客户区域时,则说明鼠标已经移出了按钮的客户区。如果按钮没有处于默认状态,则将按钮设为默认状态。调用 Invalidate函数使按钮客户区无效。框架自动调用 DrawItem函数,重绘按钮客户区。并且如果鼠标已经移出了按钮的客户区,则消毁计时器,并将计时器的开启标帜m_IsTimerOn设为 FALSE。OnTimer函数的实现代码如下:/计时器消息

21、的响应函数void CAdvButton:OnTimer(UINT nIDEvent)/ TODO: Add your message handler code here and/or call defaultCRect rect;GetWindowRect(&rect);GetCursorPos(&m_Point);/得到按钮客户区域的屏幕坐标位置/得到鼠标的屏幕坐标位置if(rect.PtInRect(m_Point)/如果鼠标在按钮的客户区内if(m_State != 1)&(m_State != 2) m_State = 1;Invalidate();/else /如果鼠标已经不在按钮

22、的客户区内了if(m_State != 0) m_State = 0;Invalidate();/重绘客户区KillTimer(nIDEvent); /销毁计时器m_IsTimerOn = FALSE; Visual C +简明教程CButton:OnTimer(nIDEvent);下面来实现客户区的绘置函数 DrawItem。DrawItem函数是一个虚函数,它是在按钮控件上进行绘制操作的关键函数。当按扭的风格具有 OWNERDRAW属性时,如果按钮的可见区域需要重绘时,框架会自动调用 DrawItem函数。其参数 lpDrawItemStruct包含了在按钮客户区域绘图所需的所有必要信息。

23、在 DrawItem函数中,首先得到窗口的的有效矩形区域,在此矩形区域内创建椭圆。调用 SetWindowRgn函数,设置窗口的有效区域为椭圆。从参数 lpDrawItemStruct结构中得到按钮控件客户区域的设备环境变量指针。根据按钮当前状态,创建不同的画笔。调用设备环境类的成员函数,设置背景模式为透明,选择画笔,在按钮客户区内绘制椭圆及显示文本。其实现代码如下:/这按钮控件客户区的绘置函数,也是实现所有高级控件的关键void CAdvButton:DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)GetClientRect(&m_ClientRect)

24、;m_ClientRgn.DeleteObject();/得到窗口的的有效矩形区域/m_ClientRgn.CreateEllipticRgnIndirect(&m_ClientRect);/在矩形区域内创建椭圆/设置窗口的有效区域为椭圆SetWindowRgn(m_ClientRgn,FALSE);CDC* pDC = CDC:FromHandle(lpDrawItemStruct-hDC); /得到按钮控件客户区域的设备环境变量指针CPen* pPen = NULL;switch (m_State)/根据按钮不同的状态,创建不同的画笔case 0:pPen = new CPen(PS_SO

25、LID,1,DefaultColor);break;case 1:pPen = new CPen(PS_SOLID,1,FocusColor);break;case 2:pPen = new CPen(PS_SOLID,1,SelectColor);break;case 3:pPen = new CPen(PS_SOLID,1,DesiableColor);break;pDC-SetBkMode(TRANSPARENT); /设置背景模式为透明pPen = pDC-SelectObject(pPen);pDC-Ellipse(&m_ClientRect);/在按钮客户区内绘制椭圆 pPen =

26、 pDC-SelectObject(pPen);if(pPen) delete pPen;/LPTSTR pCaption = new charMAXCAPTIONLEN;/int iLen = GetWindowText(pCaption,MAXCAPTIONLEN);pDC-SetTextColor(TextColor);/指定文本颜色/绘制文本,作为按钮标题pDC-DrawText(pCaption,iLen,&m_ClientRect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);通过上面的代码,按钮就已经具有了对鼠标不同的位置和动作改变不同的颜色。并且,按钮

27、的客户区域已经是一个椭圆,而不再是一个矩形。正是下面的代码将按钮的客户区域设定为椭圆形:GetClientRect(&m_ClientRect);m_ClientRgn.DeleteObject();/通到窗口的的有效矩形区域/m_ClientRgn.CreateEllipticRgnIndirect(&m_ClientRect);/在矩形区域内创建椭圆/设置窗口的有效区域为椭圆SetWindowRgn(m_ClientRgn,FALSE);至此,一个完整的高级按钮类就全部完成了。3.4实现高级编辑控件类利用 ClassWizard添加一个新类。如图 3-12所示:图 3-12添加 CAdvE

28、dit类添加的新类命名为 CAdvEdit,其父类为 CEdit。下面就在此类的基础上,实现高级编辑控件。3.4.1添加成员变量和成员函数为 CAdvEdit类添加一个字符串类型的成员变量 m_Caption,用来记录编辑框中的文本内容。其代码如下:/CAdvEdit.h头文件 Visual C +简明教程public:CString m_Caption; /编辑框文本利用 AppWizard添加消息函数 OnPaint。此函数是 WM_PAINT消息的响应函数,当编辑框可见客户区需要重绘时,此消息会被触发,框架会自动调用 OnPaint函数。并且利用 AppWizard添加两个 public

29、类型的成员函数,分别用来绘制编辑控件客户区和设置编辑控件的显示文本。实现代码如下:public:void OnDraw(); /绘制编辑控件客户区void OnDisplay(LPCTSTR lpszStr);protected:/设置编辑控件显示文本/AFX_MSG(CAdvEdit)afx_msg void OnPaint();/AFX_MSG/WM_ON_PAINT消息的响应函数3.4.2添加编辑控件代码在 OnDisplay函数中设置编辑框的显示文本。 OnDisplay函数的参数 lpszStr为字符串类型,它包含了要设置的显示文本的内容。在 OnDisplay函数中将参数 lpszStr的值符给成员函数 m_Caption,再调用 OnDraw函数将其显示出来。实现代码如下:/设置编辑控件文本void CAdvEdit:OnDisplay(LPCTSTR lpszStr)m_Caption = lps

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1