西北工业大学 软件与微电子学院 Windows程序设计综合训练 实验报告 实验二.docx
《西北工业大学 软件与微电子学院 Windows程序设计综合训练 实验报告 实验二.docx》由会员分享,可在线阅读,更多相关《西北工业大学 软件与微电子学院 Windows程序设计综合训练 实验报告 实验二.docx(10页珍藏版)》请在冰豆网上搜索。
![西北工业大学 软件与微电子学院 Windows程序设计综合训练 实验报告 实验二.docx](https://file1.bdocx.com/fileroot1/2023-1/6/658e8dd9-566d-4894-97b3-bdd322b7a0d8/658e8dd9-566d-4894-97b3-bdd322b7a0d81.gif)
西北工业大学软件与微电子学院Windows程序设计综合训练实验报告实验二
西北工业大学
《综合创作训练》实验报告
学院:
软件与微电子学院
学 号:
姓 名:
专业:
软件工程
实验时间:
2014年02月
实验地点:
毅字楼310
指导教师:
王犇
西北工业大学
2014年2月
一、实验目的及要求
1)理解Windows内核对象概念;
2)理解Windows进程及其创建的机制;
3)理解Windows窗口和句柄概念;
4)掌握Windows消息机制。
二、实验设备(环境)及要求
1)PC机最低配置:
2GHz以上CPU;1G以上内存;1G自由硬盘空间;
2)VC++6.0或者更高版本VC++;
三、实验内容与步骤
3.1创建一个win32工程实例
用VC创建一个win32Application,运行后,弹出下面的对话框。
请在实验报告中,写出创建过程(关键步骤要有截图)。
源码如下:
执行结果如下:
点击确定后,小窗口关闭。
思考题:
对话框是窗口,此外“确定”按钮和“关闭”按钮也是窗口。
3.2创建win32窗口程序
3.2.1程序框架搭建
按照4.1节的方法创建一个win32Application工程,根据教程中的内容搭建一个基本的win32窗口程序框架
源码如下:
运行结果:
思考题:
1.
(1)句柄是一个能够被进程中任何线程使用的一个不透明的值,许多API函数需要以它作为参数,以便系统知道要操作哪一个内核对象。
(2)程序实例句柄
2.
(1)注册窗口类
(2)创建窗口
(3)在桌面显示窗口,更新窗口客户区
(4)进入无限的消息获取和处理的循环。
利用GetMessage函数可以从调用线程的消息队列中取出一个消息来填充MSG结构
如果消息队列中没有消息(即没有用户输入),这个函数会一直等待下去,知道有消息进入到消息队列为止。
GetMessage函数从消息队列中取得的消息如果不是WM_QUIT,则返回非零值。
一个WM_QUIT消息会促使GetMessage函数返回0,从而结束消息循环。
此时调用把键盘输入翻译成为可传递的消息。
DispatchMessage函数分发一个消息到对应窗口的窗口函数。
3.2.2程序完善
3.2.1中程序是一个最基本的窗口程序,对于标准的Windows窗口程序,界面还缺少一些元素,如自定义的图标、菜单等。
根据教程中内容,在3.2.1程序的基础上,添加菜单项,自定义图标等资源,能够响应鼠标和键盘事件(鼠标右键点击,窗口工作区显示鼠标所在工作区的坐标,如X=100,Y=100;点击键盘按键,窗口工作区显示按键值,可以连续;注:
工作区只能显示一种事件的结果)。
问答:
简述Windows的消息处理机制。
消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。
例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。
消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。
Windows的消息系统是由3个部分组成的:
1)消息队列。
Windows能够为所有的应用程序维护一个消息队列。
应用程序必须从消息队列中获取
消息,然后分派给某个窗口。
2)消息循环。
通过这个循环机制应用程序从消息队列中检索消息,再把它分派给适当的窗口,然
后继续从消息队列中检索下一条消息,再分派给适当的窗口,依次进行。
3)窗口过程。
每个窗口都有一个窗口过程来接收传递给窗口的消息,它的任务就是获取消息然后
响应它。
窗口过程是一个回调函数;处理了一个消息后,它通常要返回一个值给Windows。
注意回调函数是程序中的一种函数,它是由Windows或外部模块调用的。
一个消息从产生到被一个窗口响应,其中有5个步骤:
1)系统中发生了某个事件。
2)Windows把这个事件翻译为消息,然后把它放到消息队列中。
3)应用程序从消息队列中接收到这个消息,把它存放在TMsg记录中。
4)应用程序把消息传递给一个适当的窗口的窗口过程。
5)窗口过程响应这个消息并进行处理。
步骤3和4构成了应用程序的消息循环。
消息循环往往是Windows应用程序的核心,因为消息循环
使一个应用程序能够响应外部的事件。
消息循环的任务就是从消息队列中检索消息,然后把消息传递给适当的窗口。
如果消息队列中没有消息,Windows就允许其他应用程序处理它们的消息。
Windows操作系统最大的特点就是其图形化的操作界面,其图形化界面是建立在其消息处理机制这个基础之上的。
如果不理解Windows消息处理机制,肯定无法深入的理解Windows编程。
可惜很多程序员对Windows消息只是略有所闻,对其使用知之甚少,更不了解其内部实现原理,本文试着一步一步向大家披露我理解的Windows消息机制。
可以说,掌握了这一部分知识,就是掌握了Windows编程中的神兵利器,灵活运用它,将会极大的提高我们的编程能力。
消息的传送
1、从消息队列获取消息:
可以通过PeekMessage或GetMessage函数从Windows消息队列中获取消息。
Windows保存的消息队列是以线程(Thread)来分组的,也就是说每个线程都有自己的消息队列。
2、发送消息
发送消息到指定窗体一般通过以下两个函数完成:
SendMessage和PostMessage。
两个函数的区别在于:
PostMessage函数只是向线程消息队列中添加消息,如果添加成功,则返回True,否则返回False,消息是否被处理,或处理的结果,就不知道了。
而SendMessage则有些不同,它并不是把消息加入到队列里,而是直接翻译消息和调用消息处理(线程向自己发送消息才是这样),直到消息处理完成后才返回。
所以,如果我们希望发送的消息立即被执行,就应该调用SendMessage。
还有一点,就是SendMessage发送的消息由于不会被加入到消息队列中(错:
线程向其他线程发送消息也是追加到其他线程的发送消息队列的,即使这两个线程在同一个进程也是如此),所以通过PeekMessage或GetMessage是不能获取到由SendMessage发送的消息。
另外,有些消息用PostMessage不会成功,比如wm_settext。
所以不是所有的消息都能够用PostMessage的。
还有一些其它的发送消息API函数,如PostThreadMessage,SendMessageCallback,SendMessageTimeout,SendNotifyMessage等。
Windows消息多级控制中心:
3.3编写一个简单win32计算器
源程序如下所示:
运行结果如下所示:
四、实验总结
在实验过程中遇到了很多问题,尤其是在编写计算器上,由于我们对基本概念和理论掌握的不是很牢固,因此花费了许多时间。
但是经过我们的努力,最终还是成功的完成了实验。
五、问题分析与讨论
在编写计算器的时候,一开始从键盘输入到文本框的数字无法参与计算,我们经过分析发现,是消息处理出现了问题,后经过改进,解决了问题。
六、教师评语
签名:
日期:
成绩