用VC++做计算器
在这一章,要实现一个简单计算器。其类似于 Windows附件中自带的计算器。实际
效果如图 3-1所示,这个计算器不仅实现了简单的四则运算功能,还实现了高级的科学
计算功能,而且具有简洁大方的图文外观。该计算器具有一个菜单栏,一个编辑框及若
干按键。编辑框可以用任何指定的字体和颜显示文本。按钮控件具有对鼠标敏感的功
能,当鼠标处于不同的位置和状态时,按钮控件会显示不同的颜,并且所有按钮控件
的客户区域为椭圆或圆形。
其实际效果如图 3-1所示:
图 3-1计算器示例效果图
●为对话框添加菜单。
●制定高级按钮控件,该按钮具有不规则的形状,并可以根据用户鼠标的位置和点
击状态的不同,显示不同的颜。
●制定高级编辑控件,该编辑控件可以指定文本文字的字体和颜。
●实现对话框的扩展功能。
3.1窗体设计
该计算器是基于对话框的应用程序,利用 MFC AppWizard生成应用计算器应用程
序框架,具体步骤如下:
(1)执行 VC程序,选择 FILE|New命令,弹出 New对话框,单击 Projects选项卡,
选择 MFC AppWizard(exe)选项,然后在 Project Name文本框中输入 Calculator。Location
文本框是指项目的本地路径,这里读者可以自行设定。保持 Platform里的 Win32复选框
不变。如图 3-2所示。
(2)单击 OK按钮,弹出 MFC AppWizard-Step1对话框。选择 Dialog Based单选
按钮。如图 3-3所示。
Visual C ++简明教程
图3-2 New对话框
图 3-3 MFC AppWizard-Step1对话框
(3)单击 Next按钮,弹出 MFC AppWizard-Step2 of 6对话框。如图 3-4所示。
(4)单击 Next按钮,弹出 MFC AppWizard-Step3 of 6对话框,如图 3-5所示。
图 3-4 MFC AppWizard-Step2对话框
图 3-5 MFC AppWizard-Step3对话框
(5)单击 Next按钮,弹出 MFC AppWizard-Step4 of 6对话框。如图 3-6所示。
点击 Finish按钮,创建框架。
图 3-6 MFC AppWizard-Step4对话框
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消息当用户鼠标左键按下时被触发,其响应函数为
OnLButtonDown。WM_ LBUTTONUP消息当用户鼠标左键抬起时被触发,其响应函数
为 OnLButtonUp。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添加创建按钮控件代码
按钮的创建分两步完成。首先,调用构造函数对按钮对象进行初始化;其次,调用
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小时内删除。
发表评论