资源描述:
《第一章windows程序的框架》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、第一章Windows程序的框架要点:程序的主函数,消息处理函数Windows程序具有相对稳定的结构,也就是说Windows程序是有一定的框架的,程序员要做的事情就是用特定的内容来填充这个框架。Windows程序的主函数:这个函数就像我们学习C语言时程序的主函数mainOW功能是一样的,他代表了程序的入口。但是这个函数看上去比main()似乎繁的多,如果是第一次看见这个函数肯定会感觉一头雾水,但是不要紧我们來看看这个函数各个参数的意义,(其实开始的时候完全可以不理会他们的意义)hlnstance是本实例的句柄,句柄可
2、以理解为操作系统管理使用我们的应用程序的别名,它跟指针类似但又不同于指针,它的意义只有操作系统知道,也就是说操作系统通过hlnstance就可以找到我们现在的这个程序。hPrcvInstancc是前一个实例的句柄。szCmdLine:是命令彳亍参数,iCmdShow是窗口的显示方式。现在我们没有必要清除每个参数的具体意义,在接下來的学习中我们用的最多的就是hlnstance这个参数,但也不多,而且我们使用vc++时,无论有哪种程序生成方式这个函数一般都会自动生成。intWINAPIWinMain(HINSTANCE
3、hlnstance,HINSTANCEhPrevInstance,PSTRszCmdLine,intiCmdShow)主函数是windows程序框架的主要部分,由于windows程序是基于消息处理的,所以消息处理函数也算作是程序框架的一部分。说到消息,我觉得从基本的c编程转到windows编程最难的一点可能就是理解windows消息机制,虽然说是机制但不必觉得高深莫测,其实很简单,举个例子來说吧:在一个应用程序中有一个按钮,当按钮被按下时,我们已经习惯的程序会产生一个动作,在这样一个简单的过程中大部分事悄是操作系统
4、替我们完成了,检测按钮的动作,并将这个动作表现出來:按钮的按下、起來;按钮被按下时它会向他所在的程序发送一个消息“我被按下了”,程序屮有一个消息处理函数,捕捉到这个消息,接着转而处理它:也就是调用相关的函数。那么我们就接着看-下消息处理函数,消息处理函数其实是一个消息循环,是一个回调函数,什么是回调函数何不管它,只管理解为,函数由你定义而不归你调用,是由操作系统來调用的。下面来看一下,消息处理函数的原型及其结构:LRESULTCALLBACKWndProc(HWNDhwnd,UlNTmessage,WPARAMwP
5、aram,LPARAMIParam){switch(mcssagc){case...case...//这些分支语句用来分别处理不同的消息1returnDcfWindowProc(hwnd,message,wParamJParam);严这个函数是系统默认的消息处理函数,也就是说,我们的窗口程序的消息处理函数处理的只是我们感兴趣的消息,即上而的case语句,对于其他的消息我们还是使用系统默认的消息处理函数。我们的消息处理函数是要在我们的窗口主程序屮登记的,登记为我们自定义的消息处理函数Z后,系统的消息就有它來处理了。所
6、以,在本函数的最后要使用该默认前数,否则其他的消息,本程序就无法处理了。*/}了解了消息处理函数,我们继续來看程序的主两数,它是程序的容器,程序的主窗休要在其中建立,程序的消息处理函数也要在其中设置。在主体函数中我们要做的就是两件事,一件是注册窗口类,另外一件是建立窗口。所谓注册窗口类就是通过填写一个WNDCLASS结构,我们的窗口就算基本成型,然后要向系统注册(注册过程系统也提供了相应的函数,当然技术差不多了以后也可以口己写注册过程)。窗口注册完毕,接下来的任务就是真正的来建立这个窗口,建立的时候前而注册的窗口类
7、的名称作为参数传入,当然该窗口有H定义的消息处理函数的话,这时也要将这个函数传入。这样,我们就了解了Windows程序的框架,现在我再给出一个比较经典的WindowsSDK程序的例了来看看我们的框架。//example.cpp#include〃一定要包含该头文件LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);〃消息处理函数的声明,定义放在主函数后面intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,PS
8、TRszCmdLine,intiCmdShow){staticTCHARszAppName[]二TEXT(“Hcllo“);〃注册的窗口类的名称,此处为"Hello"WNDCLASSwndclass;//定义了一个窗口类wndclass.style=CS_HREDRAW
9、CS_VREDRAW;wndclass.lpfnWndProc=WndProc;//此处