一个基本的Windows程序是怎么写出来的呢?编写Windows程序需要了解一些概念,嗯,或许说一堆,因为Windows程序需要和操作系统协作,也就是说你不需要把所有工作做完,你要通过API完成许多功能,你需要通过操作系统跟用户交互,操作系统将告诉你的程序现在发生什么了,然后你的程序做出响应。那么一个大小可变的,具有标题栏的Windows程序怎么编写?
首先,一个Windows程序执行,不等于一个窗口,程序和窗口是不等同的,窗口由程序创建并管理,一个程序可以在后台运行而没有窗口显示出来。通过一些手段程序甚至可以不在任务管理器出现。那么怎么创建窗口呢?
一个窗口的创建需要一个窗口类作为模板,所以首先要创建一个窗口类,窗口类其实是指一个结构体WNDCLASS,它指明窗口类一些基本属性,根据此窗口类创建出来的窗口都将拥有这些属性。具体表现为给WNDCLASS中的成员赋值。
WNDCLASS中有一个成员是一个函数指针,因为一个窗口类需要与一个函数相关联,根据这个窗口类创建的窗口接收的消息都由这个函数进行响应。嗯,一切看起来很顺利,但什么是消息?前面说到,操作系统将告诉你的程序现在发生什么了,它就是通过发送消息来通知应用程序的。比如,点击一下窗口某个位置,操作系统将与这一事件相关的信息放在一个结构体MSG中,结构体中包含一个WM_LBUTTONDOWN消息以及其他一些具体信息。然后你可以将消息发送给前面提到的那个函数处理,所以那个函数一般叫做消息处理函数。
然后需要做的是注册这个窗口类,这样窗口类的名称与窗口类的属性就关联在一起了,当你CreateWindow(创建窗口)时,你只需提供窗口类的名称。
OK,前戏做足,可以CreateWindow了,一个窗口就可以顺利创建。这时窗口还只是逻辑上存在,并没有显现出来,所以还需要告诉操作系统ShowWindow(显示窗口),并且UpdateWindow(更新窗口)立即更新窗口的客户区,把内容显示出来,所谓客户区就是除了边框和标题栏这些,我们可以自由绘制的一块区域。(实际UpdateWindow这一步去掉,窗口依然会正确显示)
然后,窗口出来了,大功告成!嗯?还缺点什么吧。想想,窗口出来了,然后程序继续运行,下一句是return?那不就结束了?所以,要维持窗口,不断接受消息,并让程序作出响应。也就是要循环地GetMessage(获取消息),然后将消息送到消息处理函数进行响应,循环执行。这一过程称为消息循环。那么,我们是从哪里获得消息的?事实上,操作系统为每个程序维护一个消息队列(可以想象成消息排成先后顺序等候),然后你调用GetMessage将会获得最前面一个消息。OK,整理一下思路,上代码(代码摘自Charles
1、创建窗口类
2、注册窗口类
3、创建窗口
4、显示窗口并更新客户区
5、编写消息循环
6、编写消息处理函数
(虽然没写完,还是发出来吧,要坚持写博客,把博文弄短点比较容易坚持)