日期:2014-05-17  浏览次数:20716 次

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.csdn.net/lanmanck/article/details/3857896