




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 用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 AppWiza
3、rdStep1对话框。选择 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对话框。如图 3-6
4、所示。点击 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-1按扭控件资源
5、清单按钮名称按钮 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编辑菜单资源3.3
7、实现高级按钮控件类利用 ClassWizard添加一个新类。如图 3-11所示:图 3-11添加 CAdvButton类添加新类名称为 CAdvButton,其父类为 CButton类。我们就在这个类中实现高级的按钮控件。3.3.1添加成员变量和成员函数要实现的高级按钮控件需要对鼠标的移动和点击作出相应的颜色变化。首先在CAdvButton的头文件里加入几种预定义颜色,其代码如下:#define DesiableColor RGB(192,192,192)/灰色,按钮不可用/红色,按钮拥有焦点/绿色,按钮被按下/蓝色,默认#define FocusColor#define SelectColo
8、r#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_Point;利
9、用 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 OnTimer(UI
10、NT 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消息当用户鼠标左键抬起时被触发,其响应函数为 OnLButtonUp。WM_MOU
11、SEMOVE消息当用户鼠标移动时被触发,其响应函数为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_PUSHBUTTON);CBut
15、ton: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:OnLButtonD
17、own(nFlags, point);在鼠标左键抬起时,得到按钮窗口客户区域的屏幕坐标位置和鼠标的屏幕坐标位置。当鼠标坐标位置落于窗口客户区域内,且当前按扭控件处于选中状态时,将按钮状态标帜设为非选中状态,即将 m_State设为 1。接着,调用 Invalidate函数,使客户区无效,框架会自动调用 DrawItem函数,重绘客户区。其实现代码如下:/当鼠标在按钮的客户区内弹起时,改变按钮状态void CAdvButton:OnLButtonUp(UINT nFlags, CPoint point)/ TODO: Add your message handler code here and/
18、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 CAdvButt
19、on: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函数的实现代码如下:/计时器消息的响应函数voi
21、d 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 /如果鼠标已经不在按钮的客户区内了if
22、(m_State != 0) m_State = 0;Invalidate();/重绘客户区KillTimer(nIDEvent); /销毁计时器m_IsTimerOn = FALSE; Visual C +简明教程CButton:OnTimer(nIDEvent);下面来实现客户区的绘置函数 DrawItem。DrawItem函数是一个虚函数,它是在按钮控件上进行绘制操作的关键函数。当按扭的风格具有 OWNERDRAW属性时,如果按钮的可见区域需要重绘时,框架会自动调用 DrawItem函数。其参数 lpDrawItemStruct包含了在按钮客户区域绘图所需的所有必要信息。在 DrawIt
23、em函数中,首先得到窗口的的有效矩形区域,在此矩形区域内创建椭圆。调用 SetWindowRgn函数,设置窗口的有效区域为椭圆。从参数 lpDrawItemStruct结构中得到按钮控件客户区域的设备环境变量指针。根据按钮当前状态,创建不同的画笔。调用设备环境类的成员函数,设置背景模式为透明,选择画笔,在按钮客户区内绘制椭圆及显示文本。其实现代码如下:/这按钮控件客户区的绘置函数,也是实现所有高级控件的关键void CAdvButton:DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)GetClientRect(&m_ClientRect);m_Clien
24、tRgn.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_SOLID,1,De
25、faultColor);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 = pDC-Sel
26、ectObject(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添加 CAdvEdit类添加的新
28、类命名为 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的值符给成
30、员函数 m_Caption,再调用 OnDraw函数将其显示出来。实现代码如下:/设置编辑控件文本void CAdvEdit:OnDisplay(LPCTSTR lpszStr)m_Caption = lpszStr;OnDraw();在 OnPaint函数中调用自定义函数 OnDraw。实现代码如下:/WM_ PAINT消息的响应函数void CAdvEdit:OnPaint()CPaintDC dc(this); / device context for paintingOnDraw();在 OnDraw函数中,在编辑控件客户区域内绘制文本。首先,得到编辑控件客户区的矩形区域;其次,得到编
31、辑控件客户区的设备环境变量;接着,用指定的画刷填充客户区,并且用指定的颜色绘制显示文本。实现代码如下:/绘制编辑控件客户区void CAdvEdit:OnDraw()CRect rect;GetClientRect(&rect); /得到客户区矩形区域CDC* pDC = GetDC();/得到编辑控件设备环境变量 pDC-SetBkMode(TRANSPARENT); /设置背模式为透明CBrush * pBrush = new CBrush(RGB(255,255,255); /创建白色画刷pDC-FillRect(&rect,pBrush);/用画刷填充客户区pDC-SetTextCol
32、or(RGB(92,92,92);/设置文本颜色/绘制文本,用指定的颜色和字体pDC-DrawText(m_Caption,rect,DT_SINGLELINE|DT_VCENTER|DT_RIGHT);3.5对话框界面设计在实现在 CAdvButton和 CAdvEdit之后,现在来实现主对话框界面功能。由于主对话框上控件按钮较多,而且要实现动态扩展功能和菜单功能,所以要添加的成员变量和成员函数较多。因此,不在此全部列出。下面仅对其中重要的成员变量和函数加以说明。主要成员变量:/CCalculatorDlg.h头文件CButtonm_DspStatic;CAdvEdit m_DspEdit;
33、/显示计算结果的编辑框CMenu *BOOLm_Menu;/对话框菜单按钮m_IsExtend;/标志对话框是否已扩展主要成员函数:/CCalculatorDlg.h头文件/AFX_VIRTUAL(CCalculatorDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); /数据交换函数/AFX_VIRTUALvirtual BOOL OnInitDialog();/虚函数,可覆盖用来进行用户初始化操作virtual void OnOK(); /虚函数,覆盖用来屏蔽 Enter操作/AFX_MSG(CCalculatorD
34、lg)/响应消息 ON_WM_CTLCOLOR,用以修改对话框及其控件颜色afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);afx_msg void OnPaint();/响应消息 WM_ON_PAINTafx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); /响应消息 WM_ON_CREATE/AFX_MSG除以上的主要成员外,还需要对每个按钮控件定义一个 CAdvButton的对象与之相关联,并为对每个按钮控件建立一个成员函数来响应其 EN_CLICKED消息。由
35、于函数较多,不在此列举,请读者查看光盘中的示例代码。 Visual C +简明教程3.5.1加载菜单资源在 3.2.2节中,已经为工程新建了一个菜单资源 IDR_MENU。现将其添加到计算器对话框上。利用 CMenu类的 LoadMenu函数,将菜单资源加载到内存中。再调用 SetMenu函数,将菜单添加到对话框上。实现代码如下:/初始化对话框函数BOOL CCalculatorDlg:OnInitDialog()CDialog:OnInitDialog();/调用父类的初始化代码/其它的初始化代码m_Menu = new CMenu;/m_Menu-LoadMenu(IDR_MENU);/加
36、载菜单资源模板/将菜单添加到对话框return TRUE; / return TRUE unless you set the focus to a controlSetMenu(m_Menu);3.5.2关联控件与对象在 CCalculatorDlg类的声明中,已经为编辑框、静态框及每一个按钮声明了相应类型的对象与之对应。但这些控件与对象的关联工作是在 DoDataExchange函数中利用DDX_Control宏来完成的。宏 DDX_Control需要三个参数,即 CDataExchange类型的指针,控件 ID,相应类型的对象。实现代码如下:/数据交换函数void CCalculatorD
37、lg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CCalculatorDlg)DDX_Control(pDX, IDC_DSPSTATIC, m_DspStatic); /静态框DDX_Control(pDX, IDC_DSPEDIT, m_DspEdit);/编辑框/将按钮控件与 CAdvButton对象相关联DDX_Control(pDX, BTN_0, m_AdvButton0);DDX_Control(pDX, BTN_1, m_AdvButton1);DDX_Control(
38、pDX, BTN_2, m_AdvButton2);DDX_Control(pDX, BTN_3, m_AdvButton3);DDX_Control(pDX, BTN_4, m_AdvButton4);DDX_Control(pDX, BTN_5, m_AdvButton5);DDX_Control(pDX, BTN_6, m_AdvButton6);DDX_Control(pDX, BTN_7, m_AdvButton7);DDX_Control(pDX, BTN_8, m_AdvButton8);DDX_Control(pDX, BTN_9, m_AdvButton9);DDX_Cont
39、rol(pDX, BTN_10, m_AdvButtonPoint);DDX_Control(pDX, BTN_11, m_AdvButtonEqu);DDX_Control(pDX, BTN_12, m_AdvButtonAdd); DDX_Control(pDX, BTN_13, m_AdvButtonSub);DDX_Control(pDX, BTN_14, m_AdvButtonMul);DDX_Control(pDX, BTN_15, m_AdvButtonDiv);DDX_Control(pDX, BTN_16, m_AdvButtonClear);DDX_Control(pDX,
40、 BTN_17, m_AdvButtonSqrt);DDX_Control(pDX, BTN_18, m_AdvButtonReverse);DDX_Control(pDX, BTN_19, m_AdvButtonSin);DDX_Control(pDX, BTN_20, m_AdvButtonCos);DDX_Control(pDX, BTN_21, m_AdvButtonTan);DDX_Control(pDX, BTN_22, m_AdvButtonSqu);DDX_Control(pDX, BTN_23, m_AdvButtonCub);DDX_Control(pDX, BTN_24,
41、 m_AdvButtonPow);DDX_Control(pDX, BTN_25, m_AdvButtonExp);DDX_Control(pDX, BTN_26, m_AdvButtonLn);DDX_Control(pDX, BTN_27, m_AdvButtonLog);/AFX_DATA_MAP3.4.3实现对话框扩展功能首先,在 CCalculatorDlg:OnCreate函数中,设定对话框的初始大小与位置。OnCreate是 WM_ON_CREATE消息的响应函数,该函数在对话框创建时被触发。此时,窗口还没有完全被创建好,因此,不可以在此初始化一些完全基于窗口的操作。可以在这个对
42、话框中进行窗口风格修改,位置设置等操作。其参数 lpCreateStruct中包含了创建窗口所需的所必需信息。在此函数中修改对话框大小后,对话框就会以指定的大小显示,而不是以对话框板中建立的大小显示。实现代码如下:int CCalculatorDlg:OnCreate(LPCREATESTRUCT lpCreateStruct)if (CDialog:OnCreate(lpCreateStruct) = -1)return -1;CRect rect;GetWindowRect(&rect);/得到对话框的窗口区域矩形/指定窗口大小与位置;宽为 232像素,高度不变SetWindowPos(&
43、wndTop,0,0,232,rect.Height(),SWP_NOMOVE|SWP_NOZORDER);/ TODO: Add your specialized creation code herereturn 0;其次,添加菜单项 ID_EXTEND的响应函数 OnExtend。在 OnExtend函数中,首先判断当前对话框状态,即是否已经被扩展。如果对话框已被扩展,则收缩对话框。首先得到对话框的当前位置,将其指定为新的宽度,但高度维持不变。再将其中的编辑控件和编辑控件外的静态框收缩到合理的位置。最后将菜单项 ID_EXTEND的显示文本设置为“扩展”,将表示对话框是否扩展的 Visua
44、l C +简明教程标帜变量 m_IsExtend设置为 FALSE。如果对话框为非扩展,则扩展对话框。首先得到对话框的当前位置,将其指定为新的宽度,但高度维持不变。再将其中的编辑控件和编辑控件外的静态框收缩到合理的位置。最后将菜单项 ID_EXTEND的显示文本设置为“收缩”,将表示对话框是否扩展的标帜变量 m_IsExtend设置为 TRUE。实现代码如下:/菜单命令 ID_EXTEND的响应函数void CCalculatorDlg:OnExtend()CRect rect;if(m_IsExtend)/如果当前对话框已被扩展GetWindowRect(&rect);/得到对话框的窗口区域
45、矩形/设置对话框窗口位置与大小;宽为 232像素,高度不变SetWindowPos(&wndTop,0,0,232,rect.Height(),SWP_NOMOVE|SWP_NOZORDER);/得到编辑框的窗口区域矩形m_DspEdit.GetWindowRect(&rect);/设置编辑框窗口位置与大小;宽为 182像素,高度不变m_DspEdit.SetWindowPos(NULL,rect.left,rect.top,182,rect.Height(),SWP_NOMOVE|SWP_NOZORDER);/得到静态框的窗口区域矩形m_DspStatic.GetWindowRect(&re
46、ct);/设置静态框窗口位置与大小m_DspStatic.SetWindowPos(NULL,rect.left,rect.top,202,rect.Height(),SWP_NOMOVE|SWP_NOZORDER);/更改菜单项显示文本m_Menu -ModifyMenu(ID_EXTEND,MF_BYCOMMAND|MF_STRING,ID_EXTEND,扩展);m_IsExtend = FALSE;elseGetWindowRect(&rect);/得到对话框的窗口区域矩形/设置对话框窗口位置与大小;宽为 409像素,高度不变SetWindowPos(&wndTop,0,0,409,re
47、ct.Height(),SWP_NOMOVE|SWP_NOZORDER);/得到编辑框的窗口区域矩形m_DspEdit.GetWindowRect(&rect);/设置编辑框窗口位置与大小;宽为 361像素,高度不变m_DspEdit.SetWindowPos(NULL,rect.left,rect.top,361,rect.Height(),SWP_NOMOVE|SWP_NOZORDER); /得到静态框的窗口区域矩形m_DspStatic.GetWindowRect(&rect);/设置静态框窗口位置与大小m_DspStatic.SetWindowPos(NULL,rect.left,re
48、ct.top,381,rect.Height(),SWP_NOMOVE|SWP_NOZORDER);/更改菜单项显示文本m_Menu -ModifyMenu(ID_EXTEND,MF_BYCOMMAND|MF_STRING,ID_EXTEND,标准);m_IsExtend = TRUE;3.5.4屏蔽 Enter键读者可能会发现,直到现在为止,虽然计算器的界已经完成。但是,它还有一个缺陷:当 Enter键按下时,对话框就会突然关掉。这是因为对话框默认具有焦点的控件是OK键,所以,当 Enter键按下时,框架会自动执行当前拥有焦点的控件的响应函数,所以,对话框自然就关闭了。要屏蔽这一功能,只要执
49、行下面的代码就可以了。void CCalculatorDlg:OnOK()/ TODO: Add extra validation here/CDialog:OnOK();/屏蔽掉此句代码读者只需重新建一个函数,响应 IDOK按扭的 EN_CLICKED命令就可以了。3.6数值计算功能的实现通过以上的所有步骤,就建立了一个简洁大方的计算器交互界面。下面就来进行具体功能的实现。首先添加成员变量。该计算器中所有的运算都是二元运算,即需要两个操作数,一个二元运算操作符。所以必须声明两个浮点数,分别用来表示初始操作数和结果操作数同时,必须声明两个字符串类型的变量,分别用来显示初始操作数和结果操作数。还
50、需要一个整型变量用来记录当前运算符,以及一个整型变量用来记录当前小数点按钮是否被点击过。实现代码如下:/CCalculatorDlg.h头文件private:CString m_StrBegin; /记录初始操作数,字符串char m_buffer100; /记录结果操作数,字符串double m_begin;/记录初始操作数,浮点 Visual C +简明教程double m_end;int m_bit;/记录结果操作数,浮点/记录运算符int m_IsCheckPoint; /标识是否按下了小数点符号当数字键 0-9被点击时,则将当前所按键追加到初始操作数末尾,并将初始操作数显示出来。以数
51、字键 0被点击为例,实现代码如下:/以按键 0的响应为例,其余 1-9的响应完全类似void CCalculatorDlg:AdvButton0()m_StrBegin = m_StrBegin+0;if (!m_IsCheckPoint) /如果小数点按下了m_DspEdit.OnDisplay(m_StrBegin+.);else /如果小数点没有按下m_DspEdit.OnDisplay(m_StrBegin);当小数点键被点击时,首先判断小数点键是否已经被点击过,以及当前初始操作数字符串是否为空。如果小数点键没有被点击过,而且当前初始操作数字符串不为空,则将小数点追加到初始操作数末尾,并且修改小数点标帜 m_IsCheckPoint为 TRUE。实现代码如下:void CCalculatorDlg:AdvButtonPoint()/按下.键时的处理函数if (!m_IsCheckPoint & m_StrBegin != ) /如果小数点没有按下,且字符串不为空m_StrBegin = m_StrBegin+.;m_DspEdit.OnDisplay(m_StrBegin);/显示文本m_IsCheckPoint = t
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年高考语文备考之名著阅读整本书阅读《红楼梦》易考情节梳理
- 2025年国际金融英语试题及答案
- 2025年乐事员工面试题及答案
- 2025年变态智障测试试题及答案
- 2025年社区矫正者面试题及答案
- 2025年越野泥路测试题及答案
- 2025年就业消费面试试题及答案
- 2025年冲床安全考试题及答案
- 2025年夏日的网测试题及答案
- 2025年初中团员考试试题及答案
- 物业外包管理
- XXXXXXXX有限公司关于成立“绿色工厂”推进小组的通知
- 住院医师规范化培训计划及目标
- (正式版)JTT 1499-2024 公路水运工程临时用电技术规程
- 中职语文必考文言文15篇
- 2024-2028年蒸汽发电机市场发展现状调查及供需格局分析预测报告
- 《团队的凝聚力》课件
- 体育保健学期末考试客观题及答案
- 肺栓塞治疗指南2024
- 古建筑修缮工程方案
- 复工复产检查 清单
评论
0/150
提交评论