1.窗口通常是在「窗口类别」的基础上建立的。窗口类别标识了处理窗口消息的窗口消息处理程序。使用窗口类别使多个窗口能够属于同一个窗口类别,并使用同一个窗口消息处理程序。
2.__stdcall:被这些修饰关键字修饰的函数,其参数都是从右向左通过堆栈传递的(__fastcall的前面部分由ecx,edx传),函数调用在返回前要清理堆栈,但由调用者还是被调用者清理不一定。此种调用方式被API使用 __cdecl: C调用约定(即用__cdecl关键字说明)(The C default calling convention)按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数vararg的函数(如printf)只能使用该调用约定)。(所以在上一章的代码中使用CDECL方式调用,又因为此种调用在C++中默认,故直接定义为空(#define CDECL))
3.窗口类别样式:
#define CS_VREDRAW 0x0001
#define CS_HREDRAW 0x0002
#define CS_KEYCVTWINDOW 0x0004
#define CS_DBLCLKS 0x0008
#define CS_OWNDC 0x0020
#define CS_CLASSDC 0x0040
#define CS_PARENTDC 0x0080
#define CS_NOKEYCVT 0x0100
#define CS_NOCLOSE 0x0200
#define CS_SAVEBITS 0x0800
#define CS_BYTEALIGNCLIENT 0x1000
#define CS_BYTEALIGNWINDOW 0x2000
#define CS_GLOBALCLASS 0x4000
#define CS_IME 0x00010000
4.MSG类别定义: typedef struct tagMSG {
HWND hwnd ;
UINT message ;
WPARAM wParam ;//word
LPARAM lParam ;//long
DWORD time ; //dword
POINT pt ; }
MSG, * PMSG ;
5.匈牙利命名法前缀:
前缀 数据型态
c char或WCHAR或TCHAR
by BYTE (无正负号字符)
n short
i int
x, y int分别用作x坐标和y坐标
cx, cy int分别用作x长度和y长度;
C代表「计数器」
b或f BOOL (int);
f代表「旗标」
w WORD (无正负号短整数)
l LONG (长整数)
dw DWORD (无正负号长整数)
fn function(函数)
s string(字符串)
sz 以字节值0结尾的字符串
h 句柄
p 指标
6.WM_PAINT产生的时机:窗口内容无效时,分为以下几种情况:窗口新建,CS定义的方式发生(CS_HREDRAW|CS_VREDRAW),最小化后还原,遮挡发生
7.DrawText API中的nCount参数:文档:Specifies the number of characters in the string. If nCount is -1, then the lpString parameter is assumed to be a pointer to a null-terminated string and DrawText computes the character count automatically. 所以该参数指定为-1即可
8.消息循环和窗口消息处理程序不是并发执行的。当一个消息循环从其消息队列中接收一个消息,然后呼叫DispatchMessage将消息发送给窗口消息处理程序时,直到窗口消息处理程序将控制传回给Windows,DispatchMessage才能结束执行。
9.窗口消息处理程序能呼叫给窗口消息处理程序发送另一个消息的函数。这时,窗口消息处理程序必须在函数呼叫传回之前完成对第二个消息的处理。那时窗口消息处理程序将处理最初的消息。例如,当窗口过程调用UpdateWindow时,Windows将呼叫窗口消息处理程序来处理WM_PAINT消息。窗口消息处理程序处理WM_PAINT消息结束以后,UpdateWindow呼叫将把控制传回给窗口消息处理程序。