afxtrace.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. // This is a part of the Microsoft Foundation Classes C++ library.
  2. // Copyright (C) 1992-1998 Microsoft Corporation
  3. // All rights reserved.
  4. //
  5. // This source code is only intended as a supplement to the
  6. // Microsoft Foundation Classes Reference and related
  7. // electronic documentation provided with the library.
  8. // See these sources for detailed information regarding the
  9. // Microsoft Foundation Classes product.
  10. #include "stdafx.h"
  11. #ifdef _DEBUG // entire file for debugging
  12. #ifdef AFX_DBG1_SEG
  13. #pragma code_seg(AFX_DBG1_SEG)
  14. #endif
  15. #include "dde.h"
  16. #ifdef _DEBUG
  17. #undef THIS_FILE
  18. static char THIS_FILE[] = __FILE__;
  19. #endif
  20. /////////////////////////////////////////////////////////////////////////////
  21. // Build data tables by including data file three times
  22. struct AFX_MAP_MESSAGE
  23. {
  24. UINT nMsg;
  25. LPCSTR lpszMsg;
  26. };
  27. #define DEFINE_MESSAGE(wm) { wm, #wm }
  28. static const AFX_MAP_MESSAGE allMessages[] =
  29. {
  30. DEFINE_MESSAGE(WM_CREATE),
  31. DEFINE_MESSAGE(WM_DESTROY),
  32. DEFINE_MESSAGE(WM_MOVE),
  33. DEFINE_MESSAGE(WM_SIZE),
  34. DEFINE_MESSAGE(WM_ACTIVATE),
  35. DEFINE_MESSAGE(WM_SETFOCUS),
  36. DEFINE_MESSAGE(WM_KILLFOCUS),
  37. DEFINE_MESSAGE(WM_ENABLE),
  38. DEFINE_MESSAGE(WM_SETREDRAW),
  39. DEFINE_MESSAGE(WM_SETTEXT),
  40. DEFINE_MESSAGE(WM_GETTEXT),
  41. DEFINE_MESSAGE(WM_GETTEXTLENGTH),
  42. DEFINE_MESSAGE(WM_PAINT),
  43. DEFINE_MESSAGE(WM_CLOSE),
  44. DEFINE_MESSAGE(WM_QUERYENDSESSION),
  45. DEFINE_MESSAGE(WM_QUIT),
  46. DEFINE_MESSAGE(WM_QUERYOPEN),
  47. DEFINE_MESSAGE(WM_ERASEBKGND),
  48. DEFINE_MESSAGE(WM_SYSCOLORCHANGE),
  49. DEFINE_MESSAGE(WM_ENDSESSION),
  50. DEFINE_MESSAGE(WM_SHOWWINDOW),
  51. DEFINE_MESSAGE(WM_CTLCOLORMSGBOX),
  52. DEFINE_MESSAGE(WM_CTLCOLOREDIT),
  53. DEFINE_MESSAGE(WM_CTLCOLORLISTBOX),
  54. DEFINE_MESSAGE(WM_CTLCOLORBTN),
  55. DEFINE_MESSAGE(WM_CTLCOLORDLG),
  56. DEFINE_MESSAGE(WM_CTLCOLORSCROLLBAR),
  57. DEFINE_MESSAGE(WM_CTLCOLORSTATIC),
  58. DEFINE_MESSAGE(WM_WININICHANGE),
  59. DEFINE_MESSAGE(WM_SETTINGCHANGE),
  60. DEFINE_MESSAGE(WM_DEVMODECHANGE),
  61. DEFINE_MESSAGE(WM_ACTIVATEAPP),
  62. DEFINE_MESSAGE(WM_FONTCHANGE),
  63. DEFINE_MESSAGE(WM_TIMECHANGE),
  64. DEFINE_MESSAGE(WM_CANCELMODE),
  65. DEFINE_MESSAGE(WM_SETCURSOR),
  66. DEFINE_MESSAGE(WM_MOUSEACTIVATE),
  67. DEFINE_MESSAGE(WM_CHILDACTIVATE),
  68. DEFINE_MESSAGE(WM_QUEUESYNC),
  69. DEFINE_MESSAGE(WM_GETMINMAXINFO),
  70. DEFINE_MESSAGE(WM_ICONERASEBKGND),
  71. DEFINE_MESSAGE(WM_NEXTDLGCTL),
  72. DEFINE_MESSAGE(WM_SPOOLERSTATUS),
  73. DEFINE_MESSAGE(WM_DRAWITEM),
  74. DEFINE_MESSAGE(WM_MEASUREITEM),
  75. DEFINE_MESSAGE(WM_DELETEITEM),
  76. DEFINE_MESSAGE(WM_VKEYTOITEM),
  77. DEFINE_MESSAGE(WM_CHARTOITEM),
  78. DEFINE_MESSAGE(WM_SETFONT),
  79. DEFINE_MESSAGE(WM_GETFONT),
  80. DEFINE_MESSAGE(WM_QUERYDRAGICON),
  81. DEFINE_MESSAGE(WM_COMPAREITEM),
  82. DEFINE_MESSAGE(WM_COMPACTING),
  83. DEFINE_MESSAGE(WM_NCCREATE),
  84. DEFINE_MESSAGE(WM_NCDESTROY),
  85. DEFINE_MESSAGE(WM_NCCALCSIZE),
  86. DEFINE_MESSAGE(WM_NCHITTEST),
  87. DEFINE_MESSAGE(WM_NCPAINT),
  88. DEFINE_MESSAGE(WM_NCACTIVATE),
  89. DEFINE_MESSAGE(WM_GETDLGCODE),
  90. DEFINE_MESSAGE(WM_NCMOUSEMOVE),
  91. DEFINE_MESSAGE(WM_NCLBUTTONDOWN),
  92. DEFINE_MESSAGE(WM_NCLBUTTONUP),
  93. DEFINE_MESSAGE(WM_NCLBUTTONDBLCLK),
  94. DEFINE_MESSAGE(WM_NCRBUTTONDOWN),
  95. DEFINE_MESSAGE(WM_NCRBUTTONUP),
  96. DEFINE_MESSAGE(WM_NCRBUTTONDBLCLK),
  97. DEFINE_MESSAGE(WM_NCMBUTTONDOWN),
  98. DEFINE_MESSAGE(WM_NCMBUTTONUP),
  99. DEFINE_MESSAGE(WM_NCMBUTTONDBLCLK),
  100. DEFINE_MESSAGE(WM_KEYDOWN),
  101. DEFINE_MESSAGE(WM_KEYUP),
  102. DEFINE_MESSAGE(WM_CHAR),
  103. DEFINE_MESSAGE(WM_DEADCHAR),
  104. DEFINE_MESSAGE(WM_SYSKEYDOWN),
  105. DEFINE_MESSAGE(WM_SYSKEYUP),
  106. DEFINE_MESSAGE(WM_SYSCHAR),
  107. DEFINE_MESSAGE(WM_SYSDEADCHAR),
  108. DEFINE_MESSAGE(WM_KEYLAST),
  109. DEFINE_MESSAGE(WM_INITDIALOG),
  110. DEFINE_MESSAGE(WM_COMMAND),
  111. DEFINE_MESSAGE(WM_SYSCOMMAND),
  112. DEFINE_MESSAGE(WM_TIMER),
  113. DEFINE_MESSAGE(WM_HSCROLL),
  114. DEFINE_MESSAGE(WM_VSCROLL),
  115. DEFINE_MESSAGE(WM_INITMENU),
  116. DEFINE_MESSAGE(WM_INITMENUPOPUP),
  117. DEFINE_MESSAGE(WM_MENUSELECT),
  118. DEFINE_MESSAGE(WM_MENUCHAR),
  119. DEFINE_MESSAGE(WM_ENTERIDLE),
  120. DEFINE_MESSAGE(WM_MOUSEWHEEL),
  121. DEFINE_MESSAGE(WM_MOUSEMOVE),
  122. DEFINE_MESSAGE(WM_LBUTTONDOWN),
  123. DEFINE_MESSAGE(WM_LBUTTONUP),
  124. DEFINE_MESSAGE(WM_LBUTTONDBLCLK),
  125. DEFINE_MESSAGE(WM_RBUTTONDOWN),
  126. DEFINE_MESSAGE(WM_RBUTTONUP),
  127. DEFINE_MESSAGE(WM_RBUTTONDBLCLK),
  128. DEFINE_MESSAGE(WM_MBUTTONDOWN),
  129. DEFINE_MESSAGE(WM_MBUTTONUP),
  130. DEFINE_MESSAGE(WM_MBUTTONDBLCLK),
  131. DEFINE_MESSAGE(WM_PARENTNOTIFY),
  132. DEFINE_MESSAGE(WM_MDICREATE),
  133. DEFINE_MESSAGE(WM_MDIDESTROY),
  134. DEFINE_MESSAGE(WM_MDIACTIVATE),
  135. DEFINE_MESSAGE(WM_MDIRESTORE),
  136. DEFINE_MESSAGE(WM_MDINEXT),
  137. DEFINE_MESSAGE(WM_MDIMAXIMIZE),
  138. DEFINE_MESSAGE(WM_MDITILE),
  139. DEFINE_MESSAGE(WM_MDICASCADE),
  140. DEFINE_MESSAGE(WM_MDIICONARRANGE),
  141. DEFINE_MESSAGE(WM_MDIGETACTIVE),
  142. DEFINE_MESSAGE(WM_MDISETMENU),
  143. DEFINE_MESSAGE(WM_CUT),
  144. DEFINE_MESSAGE(WM_COPYDATA),
  145. DEFINE_MESSAGE(WM_COPY),
  146. DEFINE_MESSAGE(WM_PASTE),
  147. DEFINE_MESSAGE(WM_CLEAR),
  148. DEFINE_MESSAGE(WM_UNDO),
  149. DEFINE_MESSAGE(WM_RENDERFORMAT),
  150. DEFINE_MESSAGE(WM_RENDERALLFORMATS),
  151. DEFINE_MESSAGE(WM_DESTROYCLIPBOARD),
  152. DEFINE_MESSAGE(WM_DRAWCLIPBOARD),
  153. DEFINE_MESSAGE(WM_PAINTCLIPBOARD),
  154. DEFINE_MESSAGE(WM_VSCROLLCLIPBOARD),
  155. DEFINE_MESSAGE(WM_SIZECLIPBOARD),
  156. DEFINE_MESSAGE(WM_ASKCBFORMATNAME),
  157. DEFINE_MESSAGE(WM_CHANGECBCHAIN),
  158. DEFINE_MESSAGE(WM_HSCROLLCLIPBOARD),
  159. DEFINE_MESSAGE(WM_QUERYNEWPALETTE),
  160. DEFINE_MESSAGE(WM_PALETTEISCHANGING),
  161. DEFINE_MESSAGE(WM_PALETTECHANGED),
  162. DEFINE_MESSAGE(WM_DDE_INITIATE),
  163. DEFINE_MESSAGE(WM_DDE_TERMINATE),
  164. DEFINE_MESSAGE(WM_DDE_ADVISE),
  165. DEFINE_MESSAGE(WM_DDE_UNADVISE),
  166. DEFINE_MESSAGE(WM_DDE_ACK),
  167. DEFINE_MESSAGE(WM_DDE_DATA),
  168. DEFINE_MESSAGE(WM_DDE_REQUEST),
  169. DEFINE_MESSAGE(WM_DDE_POKE),
  170. DEFINE_MESSAGE(WM_DDE_EXECUTE),
  171. DEFINE_MESSAGE(WM_DROPFILES),
  172. DEFINE_MESSAGE(WM_POWER),
  173. DEFINE_MESSAGE(WM_WINDOWPOSCHANGED),
  174. DEFINE_MESSAGE(WM_WINDOWPOSCHANGING),
  175. // MFC specific messages
  176. DEFINE_MESSAGE(WM_SIZEPARENT),
  177. DEFINE_MESSAGE(WM_SETMESSAGESTRING),
  178. DEFINE_MESSAGE(WM_IDLEUPDATECMDUI),
  179. DEFINE_MESSAGE(WM_INITIALUPDATE),
  180. DEFINE_MESSAGE(WM_COMMANDHELP),
  181. DEFINE_MESSAGE(WM_HELPHITTEST),
  182. DEFINE_MESSAGE(WM_EXITHELPMODE),
  183. DEFINE_MESSAGE(WM_HELP),
  184. DEFINE_MESSAGE(WM_NOTIFY),
  185. DEFINE_MESSAGE(WM_CONTEXTMENU),
  186. DEFINE_MESSAGE(WM_TCARD),
  187. DEFINE_MESSAGE(WM_MDIREFRESHMENU),
  188. DEFINE_MESSAGE(WM_MOVING),
  189. DEFINE_MESSAGE(WM_STYLECHANGED),
  190. DEFINE_MESSAGE(WM_STYLECHANGING),
  191. DEFINE_MESSAGE(WM_SIZING),
  192. DEFINE_MESSAGE(WM_SETHOTKEY),
  193. DEFINE_MESSAGE(WM_PRINT),
  194. DEFINE_MESSAGE(WM_PRINTCLIENT),
  195. DEFINE_MESSAGE(WM_POWERBROADCAST),
  196. DEFINE_MESSAGE(WM_HOTKEY),
  197. DEFINE_MESSAGE(WM_GETICON),
  198. DEFINE_MESSAGE(WM_EXITMENULOOP),
  199. DEFINE_MESSAGE(WM_ENTERMENULOOP),
  200. DEFINE_MESSAGE(WM_DISPLAYCHANGE),
  201. DEFINE_MESSAGE(WM_STYLECHANGED),
  202. DEFINE_MESSAGE(WM_STYLECHANGING),
  203. DEFINE_MESSAGE(WM_GETICON),
  204. DEFINE_MESSAGE(WM_SETICON),
  205. DEFINE_MESSAGE(WM_SIZING),
  206. DEFINE_MESSAGE(WM_MOVING),
  207. DEFINE_MESSAGE(WM_CAPTURECHANGED),
  208. DEFINE_MESSAGE(WM_DEVICECHANGE),
  209. DEFINE_MESSAGE(WM_PRINT),
  210. DEFINE_MESSAGE(WM_PRINTCLIENT),
  211. { 0, NULL, } // end of message list
  212. };
  213. #undef DEFINE_MESSAGE
  214. /////////////////////////////////////////////////////////////////////////////
  215. // DDE special case
  216. static void AFXAPI TraceDDE(LPCTSTR lpszPrefix, const MSG* pMsg)
  217. {
  218. if (pMsg->message == WM_DDE_EXECUTE)
  219. {
  220. UINT nDummy;
  221. HGLOBAL hCommands;
  222. if (!UnpackDDElParam(WM_DDE_EXECUTE, pMsg->lParam,
  223. &nDummy, (PUINT)&hCommands))
  224. {
  225. TRACE1("Warning: Unable to unpack WM_DDE_EXECUTE lParam %08lX.\n",
  226. pMsg->lParam);
  227. return;
  228. }
  229. ASSERT(hCommands != NULL);
  230. LPCTSTR lpszCommands = (LPCTSTR)::GlobalLock(hCommands);
  231. ASSERT(lpszCommands != NULL);
  232. TRACE2("%s: Execute '%s'.\n", lpszPrefix, lpszCommands);
  233. ::GlobalUnlock(hCommands);
  234. }
  235. else if (pMsg->message == WM_DDE_ADVISE)
  236. {
  237. ATOM aItem;
  238. HGLOBAL hAdvise;
  239. if (!UnpackDDElParam(WM_DDE_ADVISE, pMsg->lParam,
  240. (PUINT)&hAdvise, (PUINT)&aItem))
  241. {
  242. TRACE1("Warning: Unable to unpack WM_DDE_ADVISE lParam %08lX.\n",
  243. pMsg->lParam);
  244. return;
  245. }
  246. ASSERT(aItem != NULL);
  247. ASSERT(hAdvise != NULL);
  248. DDEADVISE* lpAdvise = (DDEADVISE*)::GlobalLock(hAdvise);
  249. ASSERT(lpAdvise != NULL);
  250. TCHAR szItem[80];
  251. szItem[0] = '\0';
  252. if (aItem != 0)
  253. ::GlobalGetAtomName(aItem, szItem, _countof(szItem));
  254. TCHAR szFormat[80];
  255. szFormat[0] = '\0';
  256. if (((UINT)0xC000 <= (UINT)lpAdvise->cfFormat) &&
  257. ((UINT)lpAdvise->cfFormat <= (UINT)0xFFFF))
  258. {
  259. ::GetClipboardFormatName(lpAdvise->cfFormat,
  260. szFormat, _countof(szFormat));
  261. // User defined clipboard formats have a range of 0xC000->0xFFFF
  262. // System clipboard formats have other ranges, but no printable
  263. // format names.
  264. }
  265. AfxTrace(
  266. _T("%s: Advise item='%s', Format='%s', Ack=%d, Defer Update= %d\n"),
  267. lpszPrefix, szItem, szFormat, lpAdvise->fAckReq,
  268. lpAdvise->fDeferUpd);
  269. ::GlobalUnlock(hAdvise);
  270. }
  271. }
  272. /////////////////////////////////////////////////////////////////////////////
  273. void AFXAPI _AfxTraceMsg(LPCTSTR lpszPrefix, const MSG* pMsg)
  274. {
  275. ASSERT(lpszPrefix != NULL);
  276. ASSERT(pMsg != NULL);
  277. if (pMsg->message == WM_MOUSEMOVE || pMsg->message == WM_NCMOUSEMOVE ||
  278. pMsg->message == WM_NCHITTEST || pMsg->message == WM_SETCURSOR ||
  279. pMsg->message == WM_CTLCOLORBTN ||
  280. pMsg->message == WM_CTLCOLORDLG ||
  281. pMsg->message == WM_CTLCOLOREDIT ||
  282. pMsg->message == WM_CTLCOLORLISTBOX ||
  283. pMsg->message == WM_CTLCOLORMSGBOX ||
  284. pMsg->message == WM_CTLCOLORSCROLLBAR ||
  285. pMsg->message == WM_CTLCOLORSTATIC ||
  286. pMsg->message == WM_ENTERIDLE || pMsg->message == WM_CANCELMODE ||
  287. pMsg->message == 0x0118) // WM_SYSTIMER (caret blink)
  288. {
  289. // don't report very frequently sent messages
  290. return;
  291. }
  292. LPCSTR lpszMsgName = NULL;
  293. char szBuf[80];
  294. // find message name
  295. if (pMsg->message >= 0xC000)
  296. {
  297. // Window message registered with 'RegisterWindowMessage'
  298. // (actually a USER atom)
  299. if (::GetClipboardFormatNameA(pMsg->message, szBuf, _countof(szBuf)))
  300. lpszMsgName = szBuf;
  301. }
  302. else if (pMsg->message >= WM_USER)
  303. {
  304. // User message
  305. wsprintfA(szBuf, "WM_USER+0x%04X", pMsg->message - WM_USER);
  306. lpszMsgName = szBuf;
  307. }
  308. else
  309. {
  310. // a system windows message
  311. const AFX_MAP_MESSAGE* pMapMsg = allMessages;
  312. for (/*null*/; pMapMsg->lpszMsg != NULL; pMapMsg++)
  313. {
  314. if (pMapMsg->nMsg == pMsg->message)
  315. {
  316. lpszMsgName = pMapMsg->lpszMsg;
  317. break;
  318. }
  319. }
  320. }
  321. if (lpszMsgName != NULL)
  322. {
  323. AfxTrace(_T("%s: hwnd=0x%04X, msg = %hs (0x%04X, 0x%08lX)\n"),
  324. lpszPrefix, (UINT)pMsg->hwnd, lpszMsgName,
  325. pMsg->wParam, pMsg->lParam);
  326. }
  327. else
  328. {
  329. AfxTrace(_T("%s: hwnd=0x%04X, msg = 0x%04X (0x%04X, 0x%08lX)\n"),
  330. lpszPrefix, (UINT)pMsg->hwnd, pMsg->message,
  331. pMsg->wParam, pMsg->lParam);
  332. }
  333. if (pMsg->message >= WM_DDE_FIRST && pMsg->message <= WM_DDE_LAST)
  334. TraceDDE(lpszPrefix, pMsg);
  335. }
  336. /////////////////////////////////////////////////////////////////////////////
  337. #endif // _DEBUG (entire file)