www.pudn.com > cab文件压缩、解压程序源代码.zip > trace.cpp


//--------------------------------------------------------------------------- 
// Copyright (C) 1998, Interscope Ltd. All rights reserved. 
// Reproduction or distribution of this program, or any portion of it,  
// is permitted only if this header is kept as it is. 
// For more information, contact: 
// 
// Interscope Ltd., 5 Culturii St., 5th floor, 4800 Baia Mare, Romania 
//    Phone/Fax: +40-62-215023 
//    E-mail: office@interscope.ro 
// 
//   $Author: Levente Farkas $ 
//     $Date: 5/12/98 11:50p $ 
//  $Modtime: 4/27/98 6:51a $ 
// $Revision: 11 $ 
//  $Archive: /Interscope/Thebe/InstallMaster/Trace.Cpp $ 
// $Workfile: Trace.Cpp $ 
//----------------------------------------------------------------------- 
 
#ifdef __STDAFX__ 
#include "StdAfx.H" 
#endif 
 
#if defined(_DEBUG) || defined(__DEBUG__) 
 
#include  
#include  
#include  
 
#ifdef __MFC__ 
#include  
#endif 
 
#include "AssertX.H" 
#include "Trace.H" 
 
 
//--- Debugee -------------------------------------------------------------- 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#ifdef __MFC__ 
#define new DEBUG_NEW 
#endif // __MFC__ 
#endif // _DEBUG 
 
 
//--- Miscellaneous ------------------------------------------------------ 
 
#define MAX_TRACE_BUFF_SIZE   1024 
 
 
//--- Current indent level ----------------------------------------------- 
 
#ifdef __cplusplus 
int CTraceIndentLevel::m_nIndent =-1; 
#endif 
 
#if defined(_DEBUG) || defined(__DEBUG__) 
//------------------------------------------------------------------------ 
// Pre     :  
// Post    :  
// Globals :  
// I/O     :  
// Task    : Format a printf style message and send it 2 the active debugger 
//------------------------------------------------------------------------ 
void InterscopeTrace(LPCTSTR lpszFormat, ...) 
{ 
    int   nBuf; 
	TCHAR szBuffer[MAX_TRACE_BUFF_SIZE]; 
 
	va_list args; 
	va_start(args,lpszFormat); 
 
	nBuf =_vstprintf(szBuffer, lpszFormat, args); 
	ASSERTX(nBuf < sizeof(szBuffer)); 
 
    va_end(args); 
 
#ifdef __cplusplus 
    // Indenting stuff (only available in C++ code) 
	// Search 4 newlines and insert prefix before each one 
	static BOOL bStartNewLine =TRUE; 
	LPTSTR lpszNextLine; 
	for(LPTSTR lpszStart =szBuffer; *lpszStart; lpszStart =lpszNextLine+1) 
    { 
		if(bStartNewLine) 
        { 
            for(int i =0; i < CTraceIndentLevel::m_nIndent; i++) 
                OutputDebugString(_T("   ")); 
 
			bStartNewLine =FALSE; 
		} 
 
        #ifndef _UNICODE 
		lpszNextLine =strchr(lpszStart,'\n'); 
        #else 
        lpszNextLine =wcschr(lpszStart,'\n'); 
        #endif 
 
		if(lpszNextLine) 
        { 
            // Terminate string at newline 
			*lpszNextLine ='\0'; 
			bStartNewLine =TRUE; 
		} 
 
        OutputDebugString(lpszStart); 
		if(!lpszNextLine) 
			break; 
		OutputDebugString(_T("\n")); 
	} 
#else 
    // Standard C trace code 
	_tprintf(szBuffer); 
    OutputDebugString(szBuffer); 
#endif 
} 
#endif 
 
#if defined(__MFC__) && (defined(_DEBUG) || defined(__DEBUG__)) 
//--------------------------------------------------------------------------- 
// Pre     :  
// Post    :  
// Globals :  
// I/O     :  
// Task    : Get window name in the form classname[HWND,title] 
//           Searches all the parents for a window with a title 
//--------------------------------------------------------------------------- 
CString DebugName(CWnd *pWnd) 
{ 
	CString sTitle; 
	HWND hwnd =pWnd->GetSafeHwnd(); 
	if(hwnd == NULL) 
		sTitle =_T("NULL"); 
	else if(!::IsWindow(hwnd)) 
		sTitle =_T("[bad window]"); 
	else 
    { 
		sTitle =_T("[no title]"); 
		for(CWnd *pw =pWnd; pw; pw =pw->GetParent()) 
        { 
			if(pw->GetWindowTextLength() > 0) 
            { 
				pw->GetWindowText(sTitle); 
				break; 
			} 
		} 
	} 
 
	CString s; 
	s.Format(_T("%s[0x%04x,\"%s\"]"),  
		     pWnd ? pWnd->GetRuntimeClass()->m_lpszClassName : _T("NULL"), 
		     hwnd, 
             (LPCTSTR)sTitle); 
 
	return s; 
} 
#endif 
 
#if defined(__MFC__) && (defined(_DEBUG) || defined(__DEBUG__)) 
// Human readable Windows message names 
struct 
{ 
	UINT	msg; 
	LPCTSTR	name; 
} MsgData[] = 
{ 
	{ WM_CREATE,_T("WM_CREATE") }, 
	{ WM_DESTROY,_T("WM_DESTROY") }, 
	{ WM_MOVE,_T("WM_MOVE") }, 
	{ WM_SIZE,_T("WM_SIZE") }, 
	{ WM_ACTIVATE,_T("WM_ACTIVATE") }, 
	{ WM_SETFOCUS,_T("WM_SETFOCUS") }, 
	{ WM_KILLFOCUS,_T("WM_KILLFOCUS") }, 
	{ WM_ENABLE,_T("WM_ENABLE") }, 
	{ WM_SETREDRAW,_T("WM_SETREDRAW") }, 
	{ WM_SETTEXT,_T("WM_SETTEXT") }, 
	{ WM_GETTEXT,_T("WM_GETTEXT") }, 
	{ WM_GETTEXTLENGTH,_T("WM_GETTEXTLENGTH") }, 
	{ WM_PAINT,_T("WM_PAINT") }, 
	{ WM_CLOSE,_T("WM_CLOSE") }, 
	{ WM_QUERYENDSESSION,_T("WM_QUERYENDSESSION") }, 
	{ WM_QUIT,_T("WM_QUIT") }, 
	{ WM_QUERYOPEN,_T("WM_QUERYOPEN") }, 
	{ WM_ERASEBKGND,_T("WM_ERASEBKGND") }, 
	{ WM_SYSCOLORCHANGE,_T("WM_SYSCOLORCHANGE") }, 
	{ WM_ENDSESSION,_T("WM_ENDSESSION") }, 
	{ WM_SHOWWINDOW,_T("WM_SHOWWINDOW") }, 
	{ WM_WININICHANGE,_T("WM_WININICHANGE") }, 
	{ WM_SETTINGCHANGE,_T("WM_SETTINGCHANGE") }, 
	{ WM_DEVMODECHANGE,_T("WM_DEVMODECHANGE") }, 
	{ WM_ACTIVATEAPP,_T("WM_ACTIVATEAPP") }, 
	{ WM_FONTCHANGE,_T("WM_FONTCHANGE") }, 
	{ WM_TIMECHANGE,_T("WM_TIMECHANGE") }, 
	{ WM_CANCELMODE,_T("WM_CANCELMODE") }, 
	{ WM_SETCURSOR,_T("WM_SETCURSOR") }, 
	{ WM_MOUSEACTIVATE,_T("WM_MOUSEACTIVATE") }, 
	{ WM_CHILDACTIVATE,_T("WM_CHILDACTIVATE") }, 
	{ WM_QUEUESYNC,_T("WM_QUEUESYNC") }, 
	{ WM_GETMINMAXINFO,_T("WM_GETMINMAXINFO") }, 
	{ WM_PAINTICON,_T("WM_PAINTICON") }, 
	{ WM_ICONERASEBKGND,_T("WM_ICONERASEBKGND") }, 
	{ WM_NEXTDLGCTL,_T("WM_NEXTDLGCTL") }, 
	{ WM_SPOOLERSTATUS,_T("WM_SPOOLERSTATUS") }, 
	{ WM_DRAWITEM,_T("WM_DRAWITEM") }, 
	{ WM_MEASUREITEM,_T("WM_MEASUREITEM") }, 
	{ WM_DELETEITEM,_T("WM_DELETEITEM") }, 
	{ WM_VKEYTOITEM,_T("WM_VKEYTOITEM") }, 
	{ WM_CHARTOITEM,_T("WM_CHARTOITEM") }, 
	{ WM_SETFONT,_T("WM_SETFONT") }, 
	{ WM_GETFONT,_T("WM_GETFONT") }, 
	{ WM_SETHOTKEY,_T("WM_SETHOTKEY") }, 
	{ WM_GETHOTKEY,_T("WM_GETHOTKEY") }, 
	{ WM_QUERYDRAGICON,_T("WM_QUERYDRAGICON") }, 
	{ WM_COMPAREITEM,_T("WM_COMPAREITEM") }, 
	{ WM_COMPACTING,_T("WM_COMPACTING") }, 
	{ WM_COMMNOTIFY,_T("WM_COMMNOTIFY") }, 
	{ WM_WINDOWPOSCHANGING,_T("WM_WINDOWPOSCHANGING") }, 
	{ WM_WINDOWPOSCHANGED,_T("WM_WINDOWPOSCHANGED") }, 
	{ WM_POWER,_T("WM_POWER") }, 
	{ WM_COPYDATA,_T("WM_COPYDATA") }, 
	{ WM_CANCELJOURNAL,_T("WM_CANCELJOURNAL") }, 
#if(WINVER >= 0x0400) 
	{ WM_NOTIFY,_T("WM_NOTIFY") }, 
	{ WM_INPUTLANGCHANGEREQUEST,_T("WM_INPUTLANGCHANGEREQUEST") }, 
	{ WM_INPUTLANGCHANGE,_T("WM_INPUTLANGCHANGE") }, 
	{ WM_TCARD,_T("WM_TCARD") }, 
	{ WM_HELP,_T("WM_HELP") }, 
	{ WM_USERCHANGED,_T("WM_USERCHANGED") }, 
	{ WM_NOTIFYFORMAT,_T("WM_NOTIFYFORMAT") }, 
	{ WM_CONTEXTMENU,_T("WM_CONTEXTMENU") }, 
	{ WM_STYLECHANGING,_T("WM_STYLECHANGING") }, 
	{ WM_STYLECHANGED,_T("WM_STYLECHANGED") }, 
	{ WM_DISPLAYCHANGE,_T("WM_DISPLAYCHANGE") }, 
	{ WM_GETICON,_T("WM_GETICON") }, 
	{ WM_SETICON,_T("WM_SETICON") }, 
#endif // WINVER >= 0x0400 
	{ WM_NCCREATE,_T("WM_NCCREATE") }, 
	{ WM_NCDESTROY,_T("WM_NCDESTROY") }, 
	{ WM_NCCALCSIZE,_T("WM_NCCALCSIZE") }, 
	{ WM_NCHITTEST,_T("WM_NCHITTEST") }, 
	{ WM_NCPAINT,_T("WM_NCPAINT") }, 
	{ WM_NCACTIVATE,_T("WM_NCACTIVATE") }, 
	{ WM_GETDLGCODE,_T("WM_GETDLGCODE") }, 
	{ WM_NCMOUSEMOVE,_T("WM_NCMOUSEMOVE") }, 
	{ WM_NCLBUTTONDOWN,_T("WM_NCLBUTTONDOWN") }, 
	{ WM_NCLBUTTONUP,_T("WM_NCLBUTTONUP") }, 
	{ WM_NCLBUTTONDBLCLK,_T("WM_NCLBUTTONDBLCLK") }, 
	{ WM_NCRBUTTONDOWN,_T("WM_NCRBUTTONDOWN") }, 
	{ WM_NCRBUTTONUP,_T("WM_NCRBUTTONUP") }, 
	{ WM_NCRBUTTONDBLCLK,_T("WM_NCRBUTTONDBLCLK") }, 
	{ WM_NCMBUTTONDOWN,_T("WM_NCMBUTTONDOWN") }, 
	{ WM_NCMBUTTONUP,_T("WM_NCMBUTTONUP") }, 
	{ WM_NCMBUTTONDBLCLK,_T("WM_NCMBUTTONDBLCLK") }, 
	{ WM_KEYDOWN,_T("WM_KEYDOWN") }, 
	{ WM_KEYUP,_T("WM_KEYUP") }, 
	{ WM_CHAR,_T("WM_CHAR") }, 
	{ WM_DEADCHAR,_T("WM_DEADCHAR") }, 
	{ WM_SYSKEYDOWN,_T("WM_SYSKEYDOWN") }, 
	{ WM_SYSKEYUP,_T("WM_SYSKEYUP") }, 
	{ WM_SYSCHAR,_T("WM_SYSCHAR") }, 
	{ WM_SYSDEADCHAR,_T("WM_SYSDEADCHAR") }, 
	{ WM_KEYDOWN,_T("WM_KEYDOWN") }, 
	{ WM_KEYUP,_T("WM_KEYUP") }, 
	{ WM_CHAR,_T("WM_CHAR") }, 
	{ WM_DEADCHAR,_T("WM_DEADCHAR") }, 
	{ WM_SYSKEYDOWN,_T("WM_SYSKEYDOWN") }, 
	{ WM_SYSKEYUP,_T("WM_SYSKEYUP") }, 
	{ WM_SYSCHAR,_T("WM_SYSCHAR") }, 
	{ WM_SYSDEADCHAR,_T("WM_SYSDEADCHAR") }, 
#if(WINVER >= 0x0400) 
	{ WM_IME_STARTCOMPOSITION,_T("WM_IME_STARTCOMPOSITION") }, 
	{ WM_IME_ENDCOMPOSITION,_T("WM_IME_ENDCOMPOSITION") }, 
	{ WM_IME_COMPOSITION,_T("WM_IME_COMPOSITION") }, 
	{ WM_IME_KEYLAST,_T("WM_IME_KEYLAST") }, 
#endif // WINVER >= 0x0400 
	{ WM_INITDIALOG,_T("WM_INITDIALOG") }, 
	{ WM_COMMAND,_T("WM_COMMAND") }, 
	{ WM_SYSCOMMAND,_T("WM_SYSCOMMAND") }, 
	{ WM_TIMER,_T("WM_TIMER") }, 
	{ WM_HSCROLL,_T("WM_HSCROLL") }, 
	{ WM_VSCROLL,_T("WM_VSCROLL") }, 
	{ WM_INITMENU,_T("WM_INITMENU") }, 
	{ WM_INITMENUPOPUP,_T("WM_INITMENUPOPUP") }, 
	{ WM_MENUSELECT,_T("WM_MENUSELECT") }, 
	{ WM_MENUCHAR,_T("WM_MENUCHAR") }, 
	{ WM_ENTERIDLE,_T("WM_ENTERIDLE") }, 
	{ WM_CTLCOLORMSGBOX,_T("WM_CTLCOLORMSGBOX") }, 
	{ WM_CTLCOLOREDIT,_T("WM_CTLCOLOREDIT") }, 
	{ WM_CTLCOLORLISTBOX,_T("WM_CTLCOLORLISTBOX") }, 
	{ WM_CTLCOLORBTN,_T("WM_CTLCOLORBTN") }, 
	{ WM_CTLCOLORDLG,_T("WM_CTLCOLORDLG") }, 
	{ WM_CTLCOLORSCROLLBAR,_T("WM_CTLCOLORSCROLLBAR") }, 
	{ WM_CTLCOLORSTATIC,_T("WM_CTLCOLORSTATIC") }, 
	{ WM_MOUSEMOVE,_T("WM_MOUSEMOVE") }, 
	{ WM_LBUTTONDOWN,_T("WM_LBUTTONDOWN") }, 
	{ WM_LBUTTONUP,_T("WM_LBUTTONUP") }, 
	{ WM_LBUTTONDBLCLK,_T("WM_LBUTTONDBLCLK") }, 
	{ WM_RBUTTONDOWN,_T("WM_RBUTTONDOWN") }, 
	{ WM_RBUTTONUP,_T("WM_RBUTTONUP") }, 
	{ WM_RBUTTONDBLCLK,_T("WM_RBUTTONDBLCLK") }, 
	{ WM_MBUTTONDOWN,_T("WM_MBUTTONDOWN") }, 
	{ WM_MBUTTONUP,_T("WM_MBUTTONUP") }, 
	{ WM_MBUTTONDBLCLK,_T("WM_MBUTTONDBLCLK") }, 
	{ WM_MOUSEMOVE,_T("WM_MOUSEMOVE") }, 
	{ WM_LBUTTONDOWN,_T("WM_LBUTTONDOWN") }, 
	{ WM_LBUTTONUP,_T("WM_LBUTTONUP") }, 
	{ WM_LBUTTONDBLCLK,_T("WM_LBUTTONDBLCLK") }, 
	{ WM_RBUTTONDOWN,_T("WM_RBUTTONDOWN") }, 
	{ WM_RBUTTONUP,_T("WM_RBUTTONUP") }, 
	{ WM_RBUTTONDBLCLK,_T("WM_RBUTTONDBLCLK") }, 
	{ WM_MBUTTONDOWN,_T("WM_MBUTTONDOWN") }, 
	{ WM_MBUTTONUP,_T("WM_MBUTTONUP") }, 
	{ WM_MBUTTONDBLCLK,_T("WM_MBUTTONDBLCLK") }, 
	{ WM_PARENTNOTIFY,_T("WM_PARENTNOTIFY") }, 
	{ WM_ENTERMENULOOP,_T("WM_ENTERMENULOOP") }, 
	{ WM_EXITMENULOOP,_T("WM_EXITMENULOOP") }, 
#if(WINVER >= 0x0400) 
	{ WM_NEXTMENU,_T("WM_NEXTMENU") }, 
	{ WM_SIZING,_T("WM_SIZING") }, 
	{ WM_CAPTURECHANGED,_T("WM_CAPTURECHANGED") }, 
	{ WM_MOVING,_T("WM_MOVING") }, 
	{ WM_POWERBROADCAST,_T("WM_POWERBROADCAST") }, 
	{ WM_DEVICECHANGE,_T("WM_DEVICECHANGE") }, 
	{ WM_IME_SETCONTEXT,_T("WM_IME_SETCONTEXT") }, 
	{ WM_IME_NOTIFY,_T("WM_IME_NOTIFY") }, 
	{ WM_IME_CONTROL,_T("WM_IME_CONTROL") }, 
	{ WM_IME_COMPOSITIONFULL,_T("WM_IME_COMPOSITIONFULL") }, 
	{ WM_IME_SELECT,_T("WM_IME_SELECT") }, 
	{ WM_IME_CHAR,_T("WM_IME_CHAR") }, 
	{ WM_IME_KEYDOWN,_T("WM_IME_KEYDOWN") }, 
	{ WM_IME_KEYUP,_T("WM_IME_KEYUP") }, 
#endif // WINVER >= 0x0400 
	{ WM_MDICREATE,_T("WM_MDICREATE") }, 
	{ WM_MDIDESTROY,_T("WM_MDIDESTROY") }, 
	{ WM_MDIACTIVATE,_T("WM_MDIACTIVATE") }, 
	{ WM_MDIRESTORE,_T("WM_MDIRESTORE") }, 
	{ WM_MDINEXT,_T("WM_MDINEXT") }, 
	{ WM_MDIMAXIMIZE,_T("WM_MDIMAXIMIZE") }, 
	{ WM_MDITILE,_T("WM_MDITILE") }, 
	{ WM_MDICASCADE,_T("WM_MDICASCADE") }, 
	{ WM_MDIICONARRANGE,_T("WM_MDIICONARRANGE") }, 
	{ WM_MDIGETACTIVE,_T("WM_MDIGETACTIVE") }, 
	{ WM_MDISETMENU,_T("WM_MDISETMENU") }, 
	{ WM_ENTERSIZEMOVE,_T("WM_ENTERSIZEMOVE") }, 
	{ WM_EXITSIZEMOVE,_T("WM_EXITSIZEMOVE") }, 
	{ WM_DROPFILES,_T("WM_DROPFILES") }, 
	{ WM_MDIREFRESHMENU,_T("WM_MDIREFRESHMENU") }, 
	{ WM_CUT,_T("WM_CUT") }, 
	{ WM_COPY,_T("WM_COPY") }, 
	{ WM_PASTE,_T("WM_PASTE") }, 
	{ WM_CLEAR,_T("WM_CLEAR") }, 
	{ WM_UNDO,_T("WM_UNDO") }, 
	{ WM_RENDERFORMAT,_T("WM_RENDERFORMAT") }, 
	{ WM_RENDERALLFORMATS,_T("WM_RENDERALLFORMATS") }, 
	{ WM_DESTROYCLIPBOARD,_T("WM_DESTROYCLIPBOARD") }, 
	{ WM_DRAWCLIPBOARD,_T("WM_DRAWCLIPBOARD") }, 
	{ WM_PAINTCLIPBOARD,_T("WM_PAINTCLIPBOARD") }, 
	{ WM_VSCROLLCLIPBOARD,_T("WM_VSCROLLCLIPBOARD") }, 
	{ WM_SIZECLIPBOARD,_T("WM_SIZECLIPBOARD") }, 
	{ WM_ASKCBFORMATNAME,_T("WM_ASKCBFORMATNAME") }, 
	{ WM_CHANGECBCHAIN,_T("WM_CHANGECBCHAIN") }, 
	{ WM_HSCROLLCLIPBOARD,_T("WM_HSCROLLCLIPBOARD") }, 
	{ WM_QUERYNEWPALETTE,_T("WM_QUERYNEWPALETTE") }, 
	{ WM_PALETTEISCHANGING,_T("WM_PALETTEISCHANGING") }, 
	{ WM_PALETTECHANGED,_T("WM_PALETTECHANGED") }, 
	{ WM_HOTKEY,_T("WM_HOTKEY") }, 
#if(WINVER >= 0x0400) 
	{ WM_PRINT,_T("WM_PRINT") }, 
	{ WM_PRINTCLIENT,_T("WM_PRINTCLIENT") }, 
#endif // WINVER >= 0x0400 
    // Below are MFC messages 
	{ WM_QUERYAFXWNDPROC,_T("*WM_QUERYAFXWNDPROC") }, 
	{ WM_SIZEPARENT,_T("*WM_SIZEPARENT") }, 
	{ WM_SETMESSAGESTRING,_T("*WM_SETMESSAGESTRING") }, 
	{ WM_IDLEUPDATECMDUI,_T("*WM_IDLEUPDATECMDUI") }, 
	{ WM_INITIALUPDATE,_T("*WM_INITIALUPDATE") }, 
	{ WM_COMMANDHELP,_T("*WM_COMMANDHELP") }, 
	{ WM_HELPHITTEST,_T("*WM_HELPHITTEST") }, 
	{ WM_EXITHELPMODE,_T("*WM_EXITHELPMODE") }, 
	{ WM_RECALCPARENT,_T("*WM_RECALCPARENT") }, 
	{ WM_SIZECHILD,_T("*WM_SIZECHILD") }, 
	{ WM_KICKIDLE,_T("*WM_KICKIDLE") }, 
	{ WM_QUERYCENTERWND,_T("*WM_QUERYCENTERWND") }, 
	{ WM_DISABLEMODAL,_T("*WM_DISABLEMODAL") }, 
	{ WM_FLOATSTATUS,_T("*WM_FLOATSTATUS") }, 
	{ WM_ACTIVATETOPLEVEL,_T("*WM_ACTIVATETOPLEVEL") }, 
	{ WM_QUERY3DCONTROLS,_T("*WM_QUERY3DCONTROLS") }, 
	{ WM_SOCKET_NOTIFY,_T("*WM_SOCKET_NOTIFY") }, 
	{ WM_SOCKET_DEAD,_T("*WM_SOCKET_DEAD") }, 
	{ WM_POPMESSAGESTRING,_T("*WM_POPMESSAGESTRING") }, 
	{ WM_OCC_LOADFROMSTREAM,_T("*WM_OCC_LOADFROMSTREAM") }, 
	{ WM_OCC_LOADFROMSTORAGE,_T("*WM_OCC_LOADFROMSTORAGE") }, 
	{ WM_OCC_INITNEW,_T("*WM_OCC_INITNEW") }, 
	{ WM_QUEUE_SENTINEL,_T("*WM_QUEUE_SENTINEL") }, 
	{ 0,NULL } 
}; 
#endif 
 
// This class is basically just an array of 1024 strings, 
// the names of each WM_ message 
// The constructor initializes it 
 
#if defined(__MFC__) && (defined(_DEBUG) || defined(__DEBUG__)) 
class CWndMsgMap 
{ 
// Data members 
private: 
	static LPCTSTR Names[]; 
 
// Implementation 
public: 
	CWndMsgMap(); 
	CString GetMsgName(UINT msg); 
}; 
LPCTSTR CWndMsgMap::Names[WM_USER];	// Name of each WM_ message 
#endif 
 
#if defined(__MFC__) && (defined(_DEBUG) || defined(__DEBUG__)) 
//--------------------------------------------------------------------------- 
// Pre     :  
// Post    :  
// Globals :  
// I/O     :  
// Task    : Initialize array from sparse data 
//--------------------------------------------------------------------------- 
CWndMsgMap::CWndMsgMap() 
{ 
	// Copy sparse MsgData into table 
	ZeroMemory(Names,sizeof(Names)); 
	for(int i=0; MsgData[i].msg; i++)		 
		Names[MsgData[i].msg] =MsgData[i].name; 
} 
#endif 
 
#if defined(__MFC__) && (defined(_DEBUG) || defined(__DEBUG__)) 
//--------------------------------------------------------------------------- 
// Pre     :  
// Post    :  
// Globals :  
// I/O     :  
// Task    : Get the name of a WM_ message 
//--------------------------------------------------------------------------- 
CString CWndMsgMap::GetMsgName(UINT msg) 
{ 
	CString name; 
	if(msg >= WM_USER) 
		name.Format(_T("WM_USER+%d"), msg-WM_USER); 
	else if(Names[msg]) 
		name =Names[msg]; 
	else 
		name.Format(_T("0x%04x"),msg); 
 
	return name; 
} 
#endif 
 
#if defined(__MFC__) && (defined(_DEBUG) || defined(__DEBUG__)) 
//--------------------------------------------------------------------------- 
// Pre     :  
// Post    :  
// Globals :  
// I/O     :  
// Task    : Get the name of a WM_ message 
//--------------------------------------------------------------------------- 
CString DebugName(UINT uMsg) 
{ 
	static CWndMsgMap wndMsgMap; // Instantiate 1st time called 
	return wndMsgMap.GetMsgName(uMsg); 
} 
#endif 
 
 
#endif