Programming Windows 笔记:Windows and Messages (三)
本文为《Programming Windows, Fifth Edition》(Charles Petzold 著)第3章 “Windows and Messages” 的学习笔记总结。
HELLOWIN程序
1 |
|
匈牙利标记法
许多 Windows 程序员都使用“匈牙利标记法”作为变量命名约定。这是为了纪念具有传奇色彩的微软程序员 Charles Simonyi。 这种标记法非常简单,即变量名以表明该变量数据类型的小写字母开始。
当命名结构变量时,可使用结构名(或结构名称的缩写)的小写形式作为变量名称的前缀或整个变量名。例如,在
HELLOWIN 的 WinMain 函数中, msg 变量是一个
MSG 类型的结构, wndclass 是一个
WNDCLASS 类型的结构。在 WndProc 函数中, ps
是一个 PAINTSTRUCT 结构,而 rect 是一个
RECT 结构。
常用变量名前缀如下表所示。
| 前缀 | 数据类型 |
|---|---|
| c | char 或 WCHAR 或 TCHAR |
| by | BYTE(无符号字符) |
| n | short(短整型) |
| i | int(整型) |
| x, y | int,表示 x 坐标和 y 坐标 |
| cx, cy | int,表示 x 或 y 的长度,c 表示“count”(计数) |
| B 或 f | BOOL(int); f 表示“flag” |
| w | WORD(无符号短整型) |
| l | LONG(长整型) |
| dw | DWORD(无符号长整型) |
| fn | 函数 |
| s | 字符串 |
| sz | 以零结束的字符串 |
| h | 句柄 |
| p | 指针 |
队列消息和非队列消息
消息既可以是“队列消息”,也可以是“非队列消息”。队列消息是指那些由 Windows放入程序的消息队列中的消息。在程序的消息循环中,消息被检索,然后被投递到窗口过程中。非队列消息则是由 Windows 对窗口过程的直接调用而产生的。我们一般说队列消息被“投递”( post )到消息队列中,而非队列消息则是被“发送”( send )到窗口过程。无论在哪种情形下,窗口过程都会为窗口获取所有消息——无论是队列消息还是非队列消息。因此,窗口过程实际上是窗口的“消息中心”。
队列消息主要由用户的输入产生,主要形式为按键消息(例如
WM_KEYDOWN 和 WM_KEYUP
消息)、由按键产生的字符消息 WM_CHAR、鼠标移动
WM MOUSEMOVE 、鼠标单击 WM_LBUTTONDOWN
等。此外,队列消息还包括定时器消息 WM_TIMER、重绘消息
WM_PAINT 和退出消息 WM_QUIT。
非队列消息则包括队列消息以外的其他所有消息。非队列消息通常由调用特定的
Windows 函数引起。例如,当 WinMain 调用
CreateWindow 函数时, Windows
就会创建窗口,并在创建过程中向窗口过程发送一条 WM_CREATE
消息。当 WinMain 调用 ShowWindow 函数时,
Windows 又会将 WM_SIZE 消息和 WM_SHOWWINDOW
消息发送给窗口过程。接下来, WinMain 又对
UpdateWindow 进行了调用,这就促使 Windows
向窗口过程发送一条 WM_PAINT 消息。