日期:2014-05-17 浏览次数:20775 次
本来说想写个跟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