用VC++做计算器
在这一章,要实现一个简单计算器。其类似于 Windows附件中自带的计算器。实际
效果如图 3-1所示,这个计算器不仅实现了简单的四则运算功能,还实现了高级的科学
计算功能,而且具有简洁大方的图文外观。该计算器具有一个菜单栏,一个编辑框及若
干按键。编辑框可以用任何指定的字体和颜显示文本。按钮控件具有对鼠标敏感的功
能,当鼠标处于不同的位置和状态时,按钮控件会显示不同的颜,并且所有按钮控件
的客户区域为椭圆或圆形。
其实际效果如图 3-1所示:
3-1计算器示例效果图
为对话框添加菜单。
制定高级按钮控件,该按钮具有不规则的形状,并可以根据用户鼠标的位置和点
击状态的不同,显示不同的颜。
制定高级编辑控件,该编辑控件可以指定文本文字的字体和颜。
实现对话框的扩展功能。
3.1窗体设计
该计算器是基于对话框的应用程序,利用  MFC  AppWizard生成应用计算器应用程
序框架,具体步骤如下:
1)执行 VC程序,选择  FILE|New命令,弹出  New对话框,单击  Projects选项卡,
选择 MFC AppWizardexe)选项,然后在  Project Name文本框中输入  CalculatorLocation
文本框是指项目的本地路径,这里读者可以自行设定。保持 Platform里的  Win32复选框
不变。如图 3-2所示。
2)单击 OK按钮,弹出  MFC  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对话框。如图  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-1按扭控件资源清单
按钮名称
按钮 ID
用途
0
BTN_0
BTN_1
BTN_2
BTN_3
BTN_4
BTN_5
BTN_6
BTN_7
BTN_8
BTN_9
按键 0
按键 1
按键 2
按键 3
按键 4
按键 5
按键 6
按键 7
按键 8
按键 9
小数点
求值
1
2
3
4
5
6
7
8
9
.
BTN_10
BTN_11
BTN_12
BTN_13
BTN_14
BTN_15
BTN_16
BTN_17
BTN_18
BTN_19
=
+
加号
-
减号
*
乘号
/
除号
CE
sqrt
1/x
sin
清屏
开方
倒数
正弦

改变button按钮的形状
Visual C ++简明教程
cos
tan
x^2
x^3
x^y
exp
ln
BTN_20
BTN_21
BTN_22
BTN_23
BTN_24
BTN_25
BTN_26
BTN_27
作弦
正切
平方
立方
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实现高级按钮控件类
利用 ClassWizard添加一个新类。如图  3-11所示:
3-11添加  CAdvButton
添加新类名称为 CAdvButton,其父类为  CButton类。我们就在这个类中实现高级的
按钮控件。
3.3.1添加成员变量和成员函数
要实现的高级按钮控件需要对鼠标的移动和点击作出相应的颜变化。首先在
CAdvButton的头文件里加入几种预定义颜,其代码如下:
#define DesiableColor  RGB(192,192,192)
//灰,按钮不可用
//红,按钮拥有焦点
//绿,按钮被按下
//蓝,默认
#define FocusColor
#define SelectColor
#define DefaultColor
#define TextColor
RGB(255,0,0)
RGB(0,255,0)
RGB(0,0,255)
RGB(128,128,128)
//浅灰,文本颜
如果读者需要将按钮设定为其它颜,那么只需改动上面的预定义即可。
接下来,添加成员变量:
public:
CRect
CRgn
m_ClientRect;
//用来保存按钮的客户的矩形区域
m_ClientRgn ;    //用来保存按钮的客户区域,非矩形
BOOL
m_IsTimerOn;
//标志计时器是否已经打开

Visual C ++简明教程
UINT
m_State;
//按钮所处状态
//当前鼠标位置
CPoint
m_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  OnTimer(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_MAP
WM_CREATE消息当创建窗口时被触发,其响应函数为                            OnCreate
WM_LBUTTONDOWN消息当用户鼠标左键按下时被触发,其响应函数为
OnLButtonDownWM_  LBUTTONUP消息当用户鼠标左键抬起时被触发,其响应函数
为  OnLButtonUpWM_MOUSEMOVE消息当用户鼠标移动时被触发,其响应函数为
OnMouseMoveWM_TIMER消息当计时器到达时被触发,其响应函数为    OnTimer
再利用 ClassWizard覆盖父类中的两个关键的虚函数:
//{{AFX_VIRTUAL(CAdvButton)
public:
virtual void  DrawItem(LPDRAWITEMSTRUCT  lpDrawItemStruct);
protected:
virtual void  PreSubclassWindow();
//}}AFX_VIRTUAL
其中对于所有的对于按钮的绘制工作都是在  DrawItem函数中完成的。
3.3.2添加创建按钮控件代码
按钮的创建分两步完成。首先,调用构造函数对按钮对象进行初始化;其次,调用
Create函数创建按钮。
在构造函数中,对所有成员变量进行初始化。实现代码如下:
//构造函数
CAdvButton::CAdvButton()
{

//初始化 m_ClientRect
m_ClientRect.left
p
= 0;
= 0;
m_ClientRect.right  = 0;
m_ClientRect.bottom=  0;
m_ClientRgn.DeleteObject();
//删除区域对象
m_ClientRgn.CreateEllipticRgnIndirect(&m_ClientRect);
//创建椭圆区域
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);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。