◆总体结构
进行Windows程序设计,实际时在进行一种面向对象的程序设计(OOP)。
最典型的对象就是窗口。对象的代码是窗口过程;数据是窗口过程保存的信息,以及每个窗口系统中那个窗口类保存的信息。
OS调用应用程序(系统调用),是Windows面向对象体系结构的基础。
◆三大难点
1.系统调用,OS通过窗口过程来给窗口发送消息。
2.进队和不进队消息,进队的消息被发送给消息队列,不今对的消息则发送给窗口过程。进队消息基本上是用户输入的结果,如WM_KEYDOWN、WM_CHAR、WM_TIMER、WM_PAINT、WM_QUIT等。不进队的消息来自调用特定的Windows函数,如WM_GREATE、WM_SIZE、WM_COMMAND等。
3.行动迅速
◆鼠标拖动窗口边框改变窗口大小,应用程序如何知道用户改变了窗口的大小呢?
问题的关键在于Windows所使用的体系结构。当用户改变窗口的大小时,OS给程序发送一条消息指出新窗口的大小。然后程序就可以调整窗口中的内容,以反映大小的变化。
“Windows给窗口发消息”,是指OS调用窗口过程函数WndProc,该函数的参数描述了这个特定消息。
◆窗口过程函数
程序创建的每一个窗口都有相关的窗口过程。窗口过程函数既可以在程序中,也可以在动态链接库中。OS 通过调用窗口过程来给窗口发送消息,窗口过程根据此消息进行处理,然后将控制返回给OS。
◆ Windows程序是如何运行的?
OS 调用WinMain函数
OS 分配实例号作参数
OS 传WinMain第三个命令行参数
◆ 如何创建窗口?
1. 设计窗口类,就像做填空题,填充 WNDCLASS 结构体。
2. 注册窗口类,应用程序向 OS 注册窗口类。
3. 创建窗口,基于窗口类创建窗口。
4. 显示更新窗口
每一种不同类型的窗口都有自己的窗口类。
◆ 回调函数
1. 由 OS 调用
2. 程序员自己在 WndProc 函数定义中写代码,由 OS 调用 WndProc 执行。
3. 应用程序收到用户发来的消息, WndPro 中 代码处理消息。
◆ 语句 wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
将 GetStockObject 函数的返回值强制转换成 HBRUSH 类型,体现了 C/C++ 语言是强类型语言。
◆ while (GetMessage (&msg, NULL, 0, 0))
1 .应用程序运行时, GetMessage 函数的返回值总为 1 ,故能保证程序一直运行。
2 . TranslateMessage ,翻译消息的功能。
如用户点击键盘上字母 A ,将 WM_KEYDOWN 和 WM_KEYUP 消息翻译成 WM_CHAR 消息。
3 . DispatchMessage ,向 OS 投递消息。
◆ 消息循环机制
应用程序开始执行后, OS 为该程序创建一个消息队列,用来存放该程序可能创建的各种不同窗口的消息。应用程序利用“消息循环”,由 GetMessage 函数取出一个消息,由 TranslateMessage 对消息进行翻译,由 DispatchMessage 投递分发给 WndProc , OS 调用回调函数 WndProc 响应消息。有些消息直接发送给 WndProc ,不进入消息队列。
◆ DC与设备驱动程序打交道
HDC hdc;
注意: 1 .定义 DC 句柄。
◆ 销毁窗口与退出程序。
case WM_CLOSE: // 销毁窗口
注意: WndProc 响应 WM_DESTROY 消息,调用 PostQuitMessage(0) 给消息队列, GetMessage 得到参数 0 ,结束消息循环,结束 WinMain ,退出程序。
◆ default:
对应用程序没有处理的消息作缺省处理,调用 DefWindowProc ,保证每一个消息都被执行。