- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Ch1:Win32基本程序观念 内容提要 Win32程序开发流程 以消息为基础,以事件驱动之 一个具体而微的Win32程序 Console程序及其与DOS程序的差别 实例介绍 Win32程序开发流程 以消息为基础,以事件驱动之 一个具体而微的Win32程序 程序进入点WinMain 窗口类之注册与窗口之诞生 消息循环 窗口的生命中枢:窗口函数 消息映射(Message Map)的雏形 模块定义文件(.DEF) 资源描述文件(.RC) Windows程序的生与死 空闲时间的处理:OnIdle 程序进入点WinMain WinMain则是Windows程序的进入点: Main是一般C程序的进入点: 当Windows的”外壳”(shell,例如Windows的文件管理器或资源管理器)侦测到用户欲执行一个Windows程序,于是调用加载器把该程序加载,然后调用C starup code,后者再调用WinMain,开始执行程序.WinMain的四个参数由操作系统传进来 窗口类之注册与窗口之诞生 注册窗口-RegisterClass设定窗口属性(外貌和行为) 创建窗口-CreateWindow 显示窗口-ShowWindow 消息循环 初始化工作完成后,WinMain进入所谓的消息循环: While(GetMessage(msg,..)){ TranslateMessage(msg);//转换键盘消息 DispatchMessage(msg);}//分派消息 DispatchMessage会将消息传给窗口函数去处理。没有指定函数名称,却可以将消息传送过去,岂不是很玄?这是因为消息发生之时,操作系统已根据当时状态,为它标明了所属窗口,而窗口所属的窗口类又已经明白标示了窗口函数,所以DispatchMessage自有脉络可寻。 消息循环中的GetMessage是Windows 3.x系统非强制性(non-preemptive)多任务的关键。应用程序籍由此操作,提供了释放控制权的机会:如果消息队列上没有属于我的消息,我 就把机会让给别人。通过程序之间彼此协调让步的方式,达到多任务能力。Windows 9x和Windows NT具备强制性多任务能力,不再非靠GetMessage释放CPU控制权不可,但程序写法依然不变,因为应用程序仍然需要靠消息推动。 窗口的生命中枢:窗口函数 消息循环中的DispatchMessage把消息分配到哪里呢?它通过USER模块的协助,送到该窗口的窗口函数去了。窗口函数通常利用switch/case方式判断消息种类,以决定处理方式。由于它是被Windows系统所调用(我们并没有在应用程序的任何地方调用此函数),所以这是一种call back函数,意思是指“在你的程序中,被Windows系统调用的函数,这些函数由你设计,但是永远不会也不该被你调用,它们是为Windows系统准备的。 在程序进行过程中,消息由输入装置,经由消息循环的抓取,源源传送给窗口并进而送到窗口函数中去。窗口函数的形式: LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) 注意,不论什么消息,都必须被处理,所以switch/case指令中的default:处必须调用DefWindowProc,这是Windows内部默认的消息处理函数。 我想很多人都会问这个问题:为什么Windows Programming Modal要把窗口函数设计为一个call back函数?为什么不让程序在抓到消息(GetMessage)之后直接调用它?原因是,除了你需要调用它,有很多时候操作系统也要调用你的窗口函数(例如当某个消息产生或某个事件发生)。窗口函数设计为callback形式,才能开放出一个接口给系统调用 消息映射(Message Map)的雏形(1) 首先定义一个MSGMAP_ENTRY结构和一个dim宏: 请注意MSGMAP_ENTRY的第二个元素pfn是一个函数指针,该指针所指的函数处理nMessage消息。这正是面向对象观念中把“数据”和“处理数据的方法”封装起来的一种具体实现 消息映射(Message Map)的雏形(2) 接下来,组织两个数组_messageEntries[ ]和_commandEntries[ ],把程序中欲处理的消息以及消息处理例程的关联性建立起来 消息映射(Message Map)的雏形(3) 于是窗口函数可以这么设计: OnCommand函数可以这么设计: 消息映射(Message Map)的雏形(4) 这么一来,WndProc和OnCommand永远不必改变,每当有新的要处理的消息,只要在_messageEntri
文档评论(0)