windows自带计算器模式切换的实现研究

本来说想写个跟windows一摸一样的计算器,一开始都不是什么大问题。但是到模式切换的时候却卡住了。

windows自带的计算器是可以切换型号的,从标准型到科学型到程序员到统计信息共有很多种模式。

标准型

科学型

仔细想想会发现,他们公用了一个菜单栏,标准型的所有功能在科学型里面都有。

所以我做如下推测:整个大的计算器是一个窗口,下面还注册了很多子窗口,但是根据菜单选项选择模式,从而选择显示哪些子窗口,并且重绘整个窗口。

利用Spy++查看窗口句柄,结果如下:


标准型


科学型

这里我们看到:唯一改变的窗口就是标准型的005007AA 和科学型的005107AA,这两个窗口就是不同的功能按钮(科学型比标准型多了一些数学函数功能)。

然后我尝试着点击菜单选项进行计算器模式变化,捕捉了一下消息,看到下面几个消息比较奇怪:

WM_NCPAINT

处理非客户区


WM_NCCALCSIZE

在需要计算窗口客户区的大小和位置时发送该消息

http://blog.sina.com.cn/s/blog_4ca086fc01009v35.html

http://dqzx.neuq.edu.cn/bbs/redirect.php?tid=17&goto=lastpost


WM_PSD_PAGESETUPDLG

http://technet.microsoft.com/zh-cn/library/ms646893

于是想着能不能通过这几个函数推导出计算机模式变化使用的方法:


最后在论坛上发帖子询问,才发现原来是利用了tab属性页面。只不过是采用了菜单的方式。

至于在父窗口里面镶嵌子窗口,应该是利用了SetParent这个函数。

不过归根结底,Tab以及父窗口镶嵌子窗口都是利用了属性页的形式。

下面有篇文章来讲解

http://blog.sina.com.cn/s/blog_665b70ed0100hjc6.html

http://blog.youkuaiyun.com/lanmanck/article/details/3857896

这是一个计算器的简单程序,练手的喔,有标准型和科学型的切换计算器的设计方案 根据计算器运行的基本状态变化,将其分为下面五个状态:如图所示 图中num含义为按下0~9数字中的一个,=为按下=按钮,operator为按下“+,-,×,÷,Mod,exp,x^y”中按钮的一个,这些为双数操作符。s_operator含义为用户按下“sqrt,+/-, 1/x,sin,cos,tan,n!,ln,log为单数操作符。此外还有小数点,在这没有显示。 计算器起始处于CE状态,此时只接受数字输入,当按下一个数字按钮时计算器来到A状态表示输入了第一个操作数,用户在该状态可以继续输入数字或者小数点,还可以进行单数目操作符号改变当前数字。 (1)当A状态中数字输入完成以后,可以接受双操作数按钮的输入来到B状态,表示接受第二个操作数。B接受一个数字按钮之后来到C状态,在C状态下可以继续输入数字或单操作数按钮。类似A状态下的情况。 (2)在C状态时,按下=按钮可以根据A->B状态按下的操作符计算结果显示,来到D状态,表示计算完成。在B状态时也可以直接接受=跳转到D状态,例如输入5×=的情况,这时候显示25,前后两个操作数相同。 (3)在D状态时可以对计算结果进行单数字操作运算。状态不变。在D状态时可继续接受操作符来到B状态,例如输入5×=×=,结果为625.在D状态时如果直接输入,这认为又开始了另一种运算。跳转到A状态。 (4)在A,B,C,D中都可以接受CE按钮的输入回到CE状态,另外,在A,C状态中可以接受BACKSPACE按钮的进行退位操作,并不改变其状态。另外,在A,C状态中一旦对当前数字进行s_operator操作以后,将不能继续接受num按钮,BACKSPACE按钮,小数点按钮。 另外,在这其中用科学型以及标准型这两个复选按钮来实现计算器的扩展。这里主要用到函数Setwindowpos()来实现,通过定义主对话框的CRECT类型的成员变量来获取当前对话框的宽度和高度以及标准型时对话框的宽度和高度,在通过ExpandToSentific()这个函数来实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值