chWin基本程序观念实用.pptx
《chWin基本程序观念实用.pptx》由会员分享,可在线阅读,更多相关《chWin基本程序观念实用.pptx(28页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、Win32程序开发流程第1页/共28页以消息为基础,以事件驱动之第2页/共28页一个具体而微的Win32程序程序进入点WinMain窗口类之注册与窗口之诞生消息循环窗口的生命中枢:窗口函数消息映射(Message Map)的雏形模块定义文件(.DEF)资源描述文件(.RC)Windows程序的生与死空闲时间的处理:OnIdle第3页/共28页程序进入点WinMainWinMain则是Windows程序的进入点:Main是一般C程序的进入点:当Windows的”外壳”(shell,例如Windows的文件管理器或资源管理器)侦测到用户欲执行一个Windows程序,于是调用加载器把该程序加载,然后
2、调用C starup code,后者再调用WinMain,开始执行程序.WinMain的四个参数由操作系统传进来第4页/共28页窗口类之注册与窗口之诞生注册窗口-RegisterClass设定窗口属性(外貌和行为)创建窗口-CreateWindow显示窗口-ShowWindow第5页/共28页消息循环初始化工作完成后,WinMain进入所谓的消息循环:While(GetMessage(&msg,.)TranslateMessage(&msg);/转换键盘消息DispatchMessage(&msg);/分派消息DispatchMessage会将消息传给窗口函数去处理。没有指定函数名称,却可以将
3、消息传送过去,岂不是很玄?这是因为消息发生之时,操作系统已根据当时状态,为它标明了所属窗口,而窗口所属的窗口类又已经明白标示了窗口函数,所以DispatchMessage自有脉络可寻。消息循环中的GetMessage是Windows 3.x系统非强制性(non-preemptive)多任务的关键。应用程序籍由此操作,提供了释放控制权的机会:如果消息队列上没有属于我的消息,我 就把机会让给别人。通过程序之间彼此协调让步的方式,达到多任务能力。Windows 9x和Windows NT具备强制性多任务能力,不再非靠GetMessage释放CPU控制权不可,但程序写法依然不变,因为应用程序仍然需要靠
4、消息推动。第6页/共28页窗口的生命中枢:窗口函数消息循环中的DispatchMessage把消息分配到哪里呢?它通过USER模块的协助,送到该窗口的窗口函数去了。窗口函数通常利用switch/case方式判断消息种类,以决定处理方式。由于它是被Windows系统所调用(我们并没有在应用程序的任何地方调用此函数),所以这是一种call back函数,意思是指“在你的程序中,被Windows系统调用的函数,这些函数由你设计,但是永远不会也不该被你调用,它们是为Windows系统准备的。在程序进行过程中,消息由输入装置,经由消息循环的抓取,源源传送给窗口并进而送到窗口函数中去。窗口函数的形式:LR
5、ESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)注意,不论什么消息,都必须被处理,所以switch/case指令中的default:处必须调用DefWindowProc,这是Windows内部默认的消息处理函数。我想很多人都会问这个问题:为什么Windows Programming Modal要把窗口函数设计为一个call back函数?为什么不让程序在抓到消息(GetMessage)之后直接调用它?原因是,除了你需要调用它,有很多时候操作系统也要调用你的窗口函数(例如当某个消息产生或某个事件发
6、生)。窗口函数设计为callback形式,才能开放出一个接口给系统调用第7页/共28页消息映射(Message Map)的雏形(1)首先定义一个MSGMAP_ENTRY结构和一个dim宏:请注意MSGMAP_ENTRY的第二个元素pfn是一个函数指针,该指针所指的函数处理nMessage消息。这正是面向对象观念中把“数据”和“处理数据的方法”封装起来的一种具体实现第8页/共28页消息映射(Message Map)的雏形(2)接下来,组织两个数组_messageEntries 和_commandEntries,把程序中欲处理的消息以及消息处理例程的关联性建立起来第9页/共28页消息映射(Mess
7、age Map)的雏形(3)于是窗口函数可以这么设计:OnCommand函数可以这么设计:第10页/共28页消息映射(Message Map)的雏形(4)这么一来,WndProc和OnCommand永远不必改变,每当有新的要处理的消息,只要在_messageEntries 和_commandEntries 两个数组中加上新元素,并针对新消息撰写新的处理例程即可。这种观念及做法就是MFC的Message Map雏形。MFC把其中的操作封装得更好更精致,成为一张庞大的消息地图,程序一旦获得消息,就可以按图上溯,直到被处理为止。第11页/共28页对话框的运行Windows的对话框依其与父窗口的关系,
8、分为两类:1.令其父窗口无效,直到对话框结束-modal对话框 2.父窗口与对话框共同运行-modeless对话框为了做出一个对话框,程序员必须准备两样东西:1.对话框模版(dialog template)。这是在RC文件中定义的一个对话框外貌,以各种方式决定对话框的大小、字形、内部有哪些控件、各在什么位置等。2.对话框函数(dialog procedure)。其型态非常类似于窗口函数,但是它通常只处理WM_INITDIALOG和WM_COMMAND两个消息。对话框中的各个控件也都是小小窗口,各有自己的窗口函数,它们以消息与其管理者(父窗口,也就是对话框)沟通。而所有的控件传来的消息都是WM_
9、COMMAND,再由其参数分辨哪一种控件以及哪一种通知消息(notification)对话框的结束与激活,靠的是DialogBox和EndDialog两个API函数。第12页/共28页对话框的诞生、运行、结束第13页/共28页模块定义文件(.DEF)Windows程序需要一个模块定义文件,将模块名称、程序段和数据段的内存特性、模块堆(heap)大小、堆栈(stack)大小,所有callback函数名称等等登记下来。在Visual C+开发环境中开发程序,不再需要特别准备.DEF文件,因为模块定义文件中的设定都有默认值。模块定义文件中的STUP指令用来指定所谓的stub程序(埋在windows程
10、序中的一个DOS程序,你所看到的This Program Requires Microsoft windows或This Program Can Not Run in DOS mode就是此程序发出来的),win16允许程序员自设一个stub程序,但win32不允许,换句话说在win32之中Stub指令已经失效第14页/共28页资源描述文件(.RC)RC文件是一个以文字描述资源的地方。常用的资源有九项之多,分别是ICON、CURSON、BITMAP、FONT、DIALOG、MENU、ACCELERATOR、STRING、VERSIONINFO、TOOLBAR等。这些文字描述需经过RC编译器,才
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- chWin 基本 程序 观念 实用
限制150内