最近在写一个纯win32api方式创建窗口的绘图类的封装(摆脱mfc的束缚)。
从对win32api方式生成一个窗口过程中,观察窗口过程函数接受了哪些消息,了解窗口生命周期更深刻的认识。
第一步:实现实现一个windows消息id值到以"WM_"开头的可读的windows消息名字符串的转换函数(该函数由WinDef.h头文件制作而成),
代码如下:
C++ Code
//全局函数:取得windows消息码所对应的消息定义字符串,Release模式下返回一行表述函数已弃用的提示字符串,而不是NULL指针。
LPCTSTR GetWindowsMsgStringFromMsgID(UINT messageId){
#ifdef _DEBUG
#define ITERN_WNDDOWSMSGID2STRING( szName , nID ) case (nID):return _T(#szName);break
switch(messageId){
ITERN_WNDDOWSMSGID2STRING( WM_NULL , 0x0000
);ITERN_WNDDOWSMSGID2STRING( WM_CREATE , 0x0001
);ITERN_WNDDOWSMSGID2STRING( WM_DESTROY , 0x0002
);ITERN_WNDDOWSMSGID2STRING( WM_MOVE , 0x0003
);ITERN_WNDDOWSMSGID2STRING( WM_SIZE , 0x0005
);ITERN_WNDDOWSMSGID2STRING( WM_ACTIVATE , 0x0006
);ITERN_WNDDOWSMSGID2STRING( WM_SETFOCUS , 0x0007
);ITERN_WNDDOWSMSGID2STRING( WM_KILLFOCUS , 0x0008
);ITERN_WNDDOWSMSGID2STRING( WM_ENABLE , 0x000A
);ITERN_WNDDOWSMSGID2STRING( WM_SETREDRAW , 0x000B
);ITERN_WNDDOWSMSGID2STRING( WM_SETTEXT , 0x000C
);ITERN_WNDDOWSMSGID2STRING( WM_GETTEXT , 0x000D
);ITERN_WNDDOWSMSGID2STRING( WM_GETTEXTLENGTH , 0x000E
);ITERN_WNDDOWSMSGID2STRING( WM_PAINT , 0x000F
);ITERN_WNDDOWSMSGID2STRING( WM_CLOSE , 0x0010);
#ifndef _WIN32_WCE
ITERN_WNDDOWSMSGID2STRING( WM_QUERYENDSESSION , 0x0011
);ITERN_WNDDOWSMSGID2STRING( WM_QUERYOPEN , 0x0013
);ITERN_WNDDOWSMSGID2STRING( WM_ENDSESSION , 0x0016);
#endif
ITERN_WNDDOWSMSGID2STRING( WM_QUIT , 0x0012
);ITERN_WNDDOWSMSGID2STRING( WM_ERASEBKGND , 0x0014
);ITERN_WNDDOWSMSGID2STRING( WM_SYSCOLORCHANGE , 0x0015
);ITERN_WNDDOWSMSGID2STRING( WM_SHOWWINDOW , 0x0018
);ITERN_WNDDOWSMSGID2STRING( WM_WININICHANGE , 0x001A
);ITERN_WNDDOWSMSGID2STRING( WM_DEVMODECHANGE , 0x001B
);ITERN_WNDDOWSMSGID2STRING( WM_ACTIVATEAPP , 0x001C
);ITERN_WNDDOWSMSGID2STRING( WM_FONTCHANGE , 0x001D
);ITERN_WNDDOWSMSGID2STRING( WM_TIMECHANGE , 0x001E
);ITERN_WNDDOWSMSGID2STRING( WM_CANCELMODE , 0x001F
);ITERN_WNDDOWSMSGID2STRING( WM_SETCURSOR , 0x0020
);ITERN_WNDDOWSMSGID2STRING( WM_MOUSEACTIVATE , 0x0021
);ITERN_WNDDOWSMSGID2STRING( WM_CHILDACTIVATE , 0x0022
);ITERN_WNDDOWSMSGID2STRING( WM_QUEUESYNC , 0x0023
);ITERN_WNDDOWSMSGID2STRING( WM_GETMINMAXINFO , 0x0024
);ITERN_WNDDOWSMSGID2STRING( WM_PAINTICON , 0x0026
);ITERN_WNDDOWSMSGID2STRING( WM_ICONERASEBKGND , 0x0027
);ITERN_WNDDOWSMSGID2STRING( WM_NEXTDLGCTL , 0x0028
);ITERN_WNDDOWSMSGID2STRING( WM_SPOOLERSTATUS , 0x002A
);ITERN_WNDDOWSMSGID2STRING( WM_DRAWITEM , 0x002B
);ITERN_WNDDOWSMSGID2STRING( WM_MEASUREITEM , 0x002C
);ITERN_WNDDOWSMSGID2STRING( WM_DELETEITEM , 0x002D
);ITERN_WNDDOWSMSGID2STRING( WM_VKEYTOITEM , 0x002E
);ITERN_WNDDOWSMSGID2STRING( WM_CHARTOITEM , 0x002F
);ITERN_WNDDOWSMSGID2STRING( WM_SETFONT , 0x0030
);ITERN_WNDDOWSMSGID2STRING( WM_GETFONT , 0x0031
);ITERN_WNDDOWSMSGID2STRING( WM_SETHOTKEY , 0x0032
);ITERN_WNDDOWSMSGID2STRING( WM_GETHOTKEY , 0x0033
);ITERN_WNDDOWSMSGID2STRING( WM_QUERYDRAGICON , 0x0037
);ITERN_WNDDOWSMSGID2STRING( WM_COMPAREITEM , 0x0039);
#if(WINVER >= 0x0500)
#ifndef _WIN32_WCE
ITERN_WNDDOWSMSGID2STRING( WM_GETOBJECT , 0x003D);
#endif
#endif
ITERN_WNDDOWSMSGID2STRING( WM_COMPACTING , 0x0041
);ITERN_WNDDOWSMSGID2STRING( WM_COMMNOTIFY , 0x0044
);ITERN_WNDDOWSMSGID2STRING( WM_WINDOWPOSCHANGING , 0x0046
);ITERN_WNDDOWSMSGID2STRING( WM_WINDOWPOSCHANGED , 0x0047
);ITERN_WNDDOWSMSGID2STRING( WM_POWER , 0x0048
);ITERN_WNDDOWSMSGID2STRING( WM_COPYDATA , 0x004A
);ITERN_WNDDOWSMSGID2STRING( WM_CANCELJOURNAL , 0x004B);
#if(WINVER >= 0x0400)
ITERN_WNDDOWSMSGID2STRING( WM_NOTIFY , 0x004E
);ITERN_WNDDOWSMSGID2STRING( WM_INPUTLANGCHANGEREQUEST , 0x0050
);ITERN_WNDDOWSMSGID2STRING( WM_INPUTLANGCHANGE , 0x0051
);ITERN_WNDDOWSMSGID2STRING( WM_TCARD , 0x0052
);ITERN_WNDDOWSMSGID2STRING(