home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / sdktools / spy / app / wm.c < prev    next >
C/C++ Source or Header  |  1997-10-05  |  38KB  |  885 lines

  1.  
  2. /******************************************************************************\
  3. *       This is a part of the Microsoft Source Code Samples. 
  4. *       Copyright (C) 1993-1997 Microsoft Corporation.
  5. *       All rights reserved. 
  6. *       This source code is only intended as a supplement to 
  7. *       Microsoft Development Tools and/or WinHelp documentation.
  8. *       See these sources for detailed information regarding the 
  9. *       Microsoft samples programs.
  10. \******************************************************************************/
  11.  
  12. /*****************************************************************************\
  13. *
  14. * Module: wm.c
  15. *
  16. * Contains functions that lookup and format messages received by the
  17. * Windows debugging Spy SDK applet.
  18. *
  19. * Functions:
  20. *
  21. *    CalculatePrintfTabs()
  22. *    PrintMsg()
  23. *    DecodeGeneric()
  24. *    MsgCmp()
  25. *    mprintf()
  26. *
  27. * Comments:
  28. *
  29. \*****************************************************************************/
  30.  
  31. #include "spy.h"
  32. #include <stdlib.h>
  33. #include <dde.h>
  34.  
  35.  
  36. PRIVATE CHAR szFormatName[] = "%08X\t%s\t%08X\t%08X\r\n";
  37. PRIVATE CHAR szFormatUSER[] = "%08X\tWM_USER+%d\t%08X\t%08X\r\n";
  38. PRIVATE CHAR szFormatUnknown[] = "%08X\tWM_%04X\t%08X\t%08X\r\n";
  39.  
  40.  
  41.  
  42. VOID DecodeGeneric(HWND hwnd, UINT msg, PSPYMSGDATA psmd) {}
  43.  
  44.  
  45. //
  46. // Message description table.  Describes each message that can be spied on.
  47. // This table must be kept in sorted order.
  48. //
  49. MSGDESC gaMsgs[] =
  50. {
  51.     { "WM_NULL", WM_NULL,                                   // 0x0000
  52.         0, DecodeGeneric },
  53.     { "WM_CREATE", WM_CREATE,                               // 0x0001
  54.         0, DecodeGeneric },
  55.     { "WM_DESTROY", WM_DESTROY,                             // 0x0002
  56.         0, DecodeGeneric },
  57.     { "WM_MOVE", WM_MOVE,                                   // 0x0003
  58.         0, DecodeGeneric },
  59.     { "WM_SIZE", WM_SIZE,                                   // 0x0005
  60.         0, DecodeGeneric },
  61.     { "WM_ACTIVATE", WM_ACTIVATE,                           // 0x0006
  62.         0, DecodeGeneric },
  63.     { "WM_SETFOCUS", WM_SETFOCUS,                           // 0x0007
  64.         0, DecodeGeneric },
  65.     { "WM_KILLFOCUS", WM_KILLFOCUS,                         // 0x0008
  66.         0, DecodeGeneric },
  67.     { "WM_ENABLE", WM_ENABLE,                               // 0x000A
  68.         0, DecodeGeneric },
  69.     { "WM_SETREDRAW", WM_SETREDRAW,                         // 0x000B
  70.         0, DecodeGeneric },
  71.     { "WM_SETTEXT", WM_SETTEXT,                             // 0x000C
  72.         0, DecodeGeneric },
  73.     { "WM_GETTEXT", WM_GETTEXT,                             // 0x000D
  74.         0, DecodeGeneric },
  75.     { "WM_GETTEXTLENGTH", WM_GETTEXTLENGTH,                 // 0x000E
  76.         0, DecodeGeneric },
  77.     { "WM_PAINT", WM_PAINT,                                 // 0x000F
  78.         0, DecodeGeneric },
  79.     { "WM_CLOSE", WM_CLOSE,                                 // 0x0010
  80.         0, DecodeGeneric },
  81.     { "WM_QUERYENDSESSION", WM_QUERYENDSESSION,             // 0x0011
  82.         0, DecodeGeneric },
  83.     { "WM_QUIT", WM_QUIT,                                   // 0x0012
  84.         0, DecodeGeneric },
  85.     { "WM_QUERYOPEN", WM_QUERYOPEN,                         // 0x0013
  86.         0, DecodeGeneric },
  87.     { "WM_ERASEBKGND", WM_ERASEBKGND,                       // 0x0014
  88.         0, DecodeGeneric },
  89.     { "WM_SYSCOLORCHANGE", WM_SYSCOLORCHANGE,               // 0x0015
  90.         0, DecodeGeneric },
  91.     { "WM_ENDSESSION", WM_ENDSESSION,                       // 0x0016
  92.         0, DecodeGeneric },
  93.     { "WM_SHOWWINDOW", WM_SHOWWINDOW,                       // 0x0018
  94.         0, DecodeGeneric },
  95.     { "WM_WININICHANGE", WM_WININICHANGE,                   // 0x001A
  96.         0, DecodeGeneric },
  97.     { "WM_DEVMODECHANGE", WM_DEVMODECHANGE,                 // 0x001B
  98.         0, DecodeGeneric },
  99.     { "WM_ACTIVATEAPP", WM_ACTIVATEAPP,                     // 0x001C
  100.         0, DecodeGeneric },
  101.     { "WM_FONTCHANGE", WM_FONTCHANGE,                       // 0x001D
  102.         0, DecodeGeneric },
  103.     { "WM_TIMECHANGE", WM_TIMECHANGE,                       // 0x001E
  104.         0, DecodeGeneric },
  105.     { "WM_CANCELMODE", WM_CANCELMODE,                       // 0x001F
  106.         0, DecodeGeneric },
  107.     { "WM_SETCURSOR", WM_SETCURSOR,                         // 0x0020
  108.         MTF_TYPE_MOUSE, DecodeGeneric },
  109.     { "WM_MOUSEACTIVATE", WM_MOUSEACTIVATE,                 // 0x0021
  110.         MTF_TYPE_MOUSE, DecodeGeneric },
  111.     { "WM_CHILDACTIVATE", WM_CHILDACTIVATE,                 // 0x0022
  112.         0, DecodeGeneric },
  113.     { "WM_QUEUESYNC", WM_QUEUESYNC,                         // 0x0023
  114.         0, DecodeGeneric },
  115.     { "WM_GETMINMAXINFO", WM_GETMINMAXINFO,                 // 0x0024
  116.         0, DecodeGeneric },
  117.     { "WM_PAINTICON", WM_PAINTICON,                         // 0x0026
  118.         0, DecodeGeneric },
  119.     { "WM_ICONERASEBKGND", WM_ICONERASEBKGND,               // 0x0027
  120.         0, DecodeGeneric },
  121.     { "WM_NEXTDLGCTL", WM_NEXTDLGCTL,                       // 0x0028
  122.         0, DecodeGeneric },
  123.     { "WM_SPOOLERSTATUS", WM_SPOOLERSTATUS,                 // 0x002A
  124.         0, DecodeGeneric },
  125.     { "WM_DRAWITEM", WM_DRAWITEM,                           // 0x002B
  126.         0, DecodeGeneric },
  127.     { "WM_MEASUREITEM", WM_MEASUREITEM,                     // 0x002C
  128.         0, DecodeGeneric },
  129.     { "WM_DELETEITEM", WM_DELETEITEM,                       // 0x002D
  130.         0, DecodeGeneric },
  131.     { "WM_VKEYTOITEM", WM_VKEYTOITEM,                       // 0x002E
  132.         MTF_TYPE_KEYBD, DecodeGeneric },
  133.     { "WM_CHARTOITEM", WM_CHARTOITEM,                       // 0x002F
  134.         MTF_TYPE_KEYBD, DecodeGeneric },
  135.     { "WM_SETFONT", WM_SETFONT,                             // 0x0030
  136.         0, DecodeGeneric },
  137.     { "WM_GETFONT", WM_GETFONT,                             // 0x0031
  138.         0, DecodeGeneric },
  139.     { "WM_SETHOTKEY", WM_SETHOTKEY,                         // 0x0032
  140.         MTF_TYPE_KEYBD, DecodeGeneric },
  141.     { "WM_GETHOTKEY", WM_GETHOTKEY,                         // 0x0033
  142.         MTF_TYPE_KEYBD, DecodeGeneric },
  143.     { "WM_QUERYDRAGICON", WM_QUERYDRAGICON,                 // 0x0037
  144.         0, DecodeGeneric },
  145.     { "WM_COMPAREITEM", WM_COMPAREITEM,                     // 0x0039
  146.         0, DecodeGeneric },
  147.     { "WM_COMPACTING", WM_COMPACTING,                       // 0x0041
  148.         0, DecodeGeneric },
  149.     { "WM_WINDOWPOSCHANGING", WM_WINDOWPOSCHANGING,         // 0x0046
  150.         0, DecodeGeneric },
  151.     { "WM_WINDOWPOSCHANGED", WM_WINDOWPOSCHANGED,           // 0x0047
  152.         0, DecodeGeneric },
  153.     { "WM_POWER", WM_POWER,                                 // 0x0048
  154.         0, DecodeGeneric },
  155.     { "WM_COPYDATA", WM_COPYDATA,                           // 0x004A
  156.         0, DecodeGeneric },
  157.     { "WM_CANCELJOURNAL", WM_CANCELJOURNAL,                 // 0x004B
  158.         0, DecodeGeneric },
  159.     { "WM_NCCREATE", WM_NCCREATE,                           // 0x0081
  160.         MTF_TYPE_NC, DecodeGeneric },
  161.     { "WM_NCDESTROY", WM_NCDESTROY,                         // 0x0082
  162.         MTF_TYPE_NC, DecodeGeneric },
  163.     { "WM_NCCALCSIZE", WM_NCCALCSIZE,                       // 0x0083
  164.         MTF_TYPE_NC, DecodeGeneric },
  165.     { "WM_NCHITTEST", WM_NCHITTEST,                         // 0x0084
  166.         MTF_TYPE_NC | MTF_TYPE_MOUSE, DecodeGeneric },
  167.     { "WM_NCPAINT", WM_NCPAINT,                             // 0x0085
  168.         MTF_TYPE_NC, DecodeGeneric },
  169.     { "WM_NCACTIVATE", WM_NCACTIVATE,                       // 0x0086
  170.         MTF_TYPE_NC, DecodeGeneric },
  171.     { "WM_GETDLGCODE", WM_GETDLGCODE,                       // 0x0087
  172.         0, DecodeGeneric },
  173.     { "WM_NCMOUSEMOVE", WM_NCMOUSEMOVE,                     // 0x00A0
  174.         MTF_TYPE_NC | MTF_TYPE_MOUSE, DecodeGeneric },
  175.     { "WM_NCLBUTTONDOWN", WM_NCLBUTTONDOWN,                 // 0x00A1
  176.         MTF_TYPE_NC | MTF_TYPE_MOUSE, DecodeGeneric },
  177.     { "WM_NCLBUTTONUP", WM_NCLBUTTONUP,                     // 0x00A2
  178.         MTF_TYPE_NC | MTF_TYPE_MOUSE, DecodeGeneric },
  179.     { "WM_NCLBUTTONDBLCLK", WM_NCLBUTTONDBLCLK,             // 0x00A3
  180.         MTF_TYPE_NC | MTF_TYPE_MOUSE, DecodeGeneric },
  181.     { "WM_NCRBUTTONDOWN", WM_NCRBUTTONDOWN,                 // 0x00A4
  182.         MTF_TYPE_NC | MTF_TYPE_MOUSE, DecodeGeneric },
  183.     { "WM_NCRBUTTONUP", WM_NCRBUTTONUP,                     // 0x00A5
  184.         MTF_TYPE_NC | MTF_TYPE_MOUSE, DecodeGeneric },
  185.     { "WM_NCRBUTTONDBLCLK", WM_NCRBUTTONDBLCLK,             // 0x00A6
  186.         MTF_TYPE_NC | MTF_TYPE_MOUSE, DecodeGeneric },
  187.     { "WM_NCMBUTTONDOWN", WM_NCMBUTTONDOWN,                 // 0x00A7
  188.         MTF_TYPE_NC | MTF_TYPE_MOUSE, DecodeGeneric },
  189.     { "WM_NCMBUTTONUP", WM_NCMBUTTONUP,                     // 0x00A8
  190.         MTF_TYPE_NC | MTF_TYPE_MOUSE, DecodeGeneric },
  191.     { "WM_NCMBUTTONDBLCLK", WM_NCMBUTTONDBLCLK,             // 0x00A9
  192.         MTF_TYPE_NC | MTF_TYPE_MOUSE, DecodeGeneric },
  193.     { "EM_GETSEL", EM_GETSEL,                               // 0x00B0
  194.         MTF_TYPE_EM, DecodeGeneric },
  195.     { "EM_SETSEL", EM_SETSEL,                               // 0x00B1
  196.         MTF_TYPE_EM, DecodeGeneric },
  197.     { "EM_GETRECT", EM_GETRECT,                             // 0x00B2
  198.         MTF_TYPE_EM, DecodeGeneric },
  199.     { "EM_SETRECT", EM_SETRECT,                             // 0x00B3
  200.         MTF_TYPE_EM, DecodeGeneric },
  201.     { "EM_SETRECTNP", EM_SETRECTNP,                         // 0x00B4
  202.         MTF_TYPE_EM, DecodeGeneric },
  203.     { "EM_SCROLL", EM_SCROLL,                               // 0x00B5
  204.         MTF_TYPE_EM, DecodeGeneric },
  205.     { "EM_LINESCROLL", EM_LINESCROLL,                       // 0x00B6
  206.         MTF_TYPE_EM, DecodeGeneric },
  207.     { "EM_SCROLLCARET", EM_SCROLLCARET,                     // 0x00B7
  208.         MTF_TYPE_EM, DecodeGeneric },
  209.     { "EM_GETMODIFY", EM_GETMODIFY,                         // 0x00B8
  210.         MTF_TYPE_EM, DecodeGeneric },
  211.     { "EM_SETMODIFY", EM_SETMODIFY,                         // 0x00B9
  212.         MTF_TYPE_EM, DecodeGeneric },
  213.     { "EM_GETLINECOUNT", EM_GETLINECOUNT,                   // 0x00BA
  214.         MTF_TYPE_EM, DecodeGeneric },
  215.     { "EM_LINEINDEX", EM_LINEINDEX,                         // 0x00BB
  216.         MTF_TYPE_EM, DecodeGeneric },
  217.     { "EM_SETHANDLE", EM_SETHANDLE,                         // 0x00BC
  218.         MTF_TYPE_EM, DecodeGeneric },
  219.     { "EM_GETHANDLE", EM_GETHANDLE,                         // 0x00BD
  220.         MTF_TYPE_EM, DecodeGeneric },
  221.     { "EM_GETTHUMB", EM_GETTHUMB,                           // 0x00BE
  222.         MTF_TYPE_EM, DecodeGeneric },
  223.     { "EM_LINELENGTH", EM_LINELENGTH,                       // 0x00C1
  224.         MTF_TYPE_EM, DecodeGeneric },
  225.     { "EM_REPLACESEL", EM_REPLACESEL,                       // 0x00C2
  226.         MTF_TYPE_EM, DecodeGeneric },
  227.     { "EM_GETLINE", EM_GETLINE,                             // 0x00C4
  228.         MTF_TYPE_EM, DecodeGeneric },
  229.     { "EM_LIMITTEXT", EM_LIMITTEXT,                         // 0x00C5
  230.         MTF_TYPE_EM, DecodeGeneric },
  231.     { "EM_CANUNDO", EM_CANUNDO,                             // 0x00C6
  232.         MTF_TYPE_EM, DecodeGeneric },
  233.     { "EM_UNDO", EM_UNDO,                                   // 0x00C7
  234.         MTF_TYPE_EM, DecodeGeneric },
  235.     { "EM_FMTLINES", EM_FMTLINES,                           // 0x00C8
  236.         MTF_TYPE_EM, DecodeGeneric },
  237.     { "EM_LINEFROMCHAR", EM_LINEFROMCHAR,                   // 0x00C9
  238.         MTF_TYPE_EM, DecodeGeneric },
  239.     { "EM_SETTABSTOPS", EM_SETTABSTOPS,                     // 0x00CB
  240.         MTF_TYPE_EM, DecodeGeneric },
  241.     { "EM_SETPASSWORDCHAR", EM_SETPASSWORDCHAR,             // 0x00CC
  242.         MTF_TYPE_EM, DecodeGeneric },
  243.     { "EM_EMPTYUNDOBUFFER", EM_EMPTYUNDOBUFFER,             // 0x00CD
  244.         MTF_TYPE_EM, DecodeGeneric },
  245.     { "EM_GETFIRSTVISIBLELINE", EM_GETFIRSTVISIBLELINE,     // 0x00CE
  246.         MTF_TYPE_EM, DecodeGeneric },
  247.     { "EM_SETREADONLY", EM_SETREADONLY,                     // 0x00CF
  248.         MTF_TYPE_EM, DecodeGeneric },
  249.     { "EM_SETWORDBREAKPROC", EM_SETWORDBREAKPROC,           // 0x00D0
  250.         MTF_TYPE_EM, DecodeGeneric },
  251.     { "EM_GETWORDBREAKPROC", EM_GETWORDBREAKPROC,           // 0x00D1
  252.         MTF_TYPE_EM, DecodeGeneric },
  253.     { "EM_GETPASSWORDCHAR", EM_GETPASSWORDCHAR,             // 0x00D2
  254.         MTF_TYPE_EM, DecodeGeneric },
  255.     { "SBM_SETPOS", SBM_SETPOS,                             // 0x00E0
  256.         0, DecodeGeneric },
  257.     { "SBM_GETPOS", SBM_GETPOS,                             // 0x00E1
  258.         0, DecodeGeneric },
  259.     { "SBM_SETRANGE", SBM_SETRANGE,                         // 0x00E2
  260.         0, DecodeGeneric },
  261.     { "SBM_GETRANGE", SBM_GETRANGE,                         // 0x00E3
  262.         0, DecodeGeneric },
  263.     { "SBM_ENABLE_ARROWS", SBM_ENABLE_ARROWS,               // 0x00E4
  264.         0, DecodeGeneric },
  265.     { "SBM_SETRANGEREDRAW", SBM_SETRANGEREDRAW,             // 0x00E6
  266.         0, DecodeGeneric },
  267.     { "BM_GETCHECK", BM_GETCHECK,                           // 0x00F0
  268.         MTF_TYPE_BM, DecodeGeneric },
  269.     { "BM_SETCHECK", BM_SETCHECK,                           // 0x00F1
  270.         MTF_TYPE_BM, DecodeGeneric },
  271.     { "BM_GETSTATE", BM_GETSTATE,                           // 0x00F2
  272.         MTF_TYPE_BM, DecodeGeneric },
  273.     { "BM_SETSTATE", BM_SETSTATE,                           // 0x00F3
  274.         MTF_TYPE_BM, DecodeGeneric },
  275.     { "BM_SETSTYLE", BM_SETSTYLE,                           // 0x00F4
  276.         MTF_TYPE_BM, DecodeGeneric },
  277.     { "WM_KEYDOWN", WM_KEYDOWN,                             // 0x0100
  278.         MTF_TYPE_KEYBD, DecodeGeneric },
  279.     { "WM_KEYUP", WM_KEYUP,                                 // 0x0101
  280.         MTF_TYPE_KEYBD, DecodeGeneric },
  281.     { "WM_CHAR", WM_CHAR,                                   // 0x0102
  282.         MTF_TYPE_KEYBD, DecodeGeneric },
  283.     { "WM_DEADCHAR", WM_DEADCHAR,                           // 0x0103
  284.         MTF_TYPE_KEYBD, DecodeGeneric },
  285.     { "WM_SYSKEYDOWN", WM_SYSKEYDOWN,                       // 0x0104
  286.         MTF_TYPE_KEYBD, DecodeGeneric },
  287.     { "WM_SYSKEYUP", WM_SYSKEYUP,                           // 0x0105
  288.         MTF_TYPE_KEYBD, DecodeGeneric },
  289.     { "WM_SYSCHAR", WM_SYSCHAR,                             // 0x0106
  290.         MTF_TYPE_KEYBD, DecodeGeneric },
  291.     { "WM_SYSDEADCHAR", WM_SYSDEADCHAR,                     // 0x0107
  292.         MTF_TYPE_KEYBD, DecodeGeneric },
  293. #ifdef  FE_IME
  294.     { "WM_WNT_CONVERTREQUESTEX", WM_WNT_CONVERTREQUESTEX,   // 0x0109
  295.         MTF_TYPE_IME, DecodeGeneric },
  296.     { "WM_CONVERTREQUEST", WM_CONVERTREQUEST,               // 0x010A
  297.         MTF_TYPE_IME, DecodeGeneric },
  298.     { "WM_CONVERTRESULT", WM_CONVERTRESULT,                 // 0x010B
  299.         MTF_TYPE_IME, DecodeGeneric },
  300.     { "WM_INTERIM", WM_INTERIM,                             // 0x010C
  301.         MTF_TYPE_IME, DecodeGeneric },
  302. #   define TMP_MTF_TYPE_IME     MTF_TYPE_IME
  303. #else // not FE_IME
  304. #   define TMP_MTF_TYPE_IME     0
  305. #endif
  306.     { "WM_IME_STARTCOMPOSITION", WM_IME_STARTCOMPOSITION,   // 0x010D
  307.         TMP_MTF_TYPE_IME, DecodeGeneric },
  308.     { "WM_IME_ENDCOMPOSITION",   WM_IME_ENDCOMPOSITION,     // 0x010E
  309.         TMP_MTF_TYPE_IME, DecodeGeneric },
  310.     { "WM_IME_COMPOSITION",      WM_IME_COMPOSITION,        // 0x010F
  311.         TMP_MTF_TYPE_IME, DecodeGeneric },
  312.     { "WM_INITDIALOG", WM_INITDIALOG,                       // 0x0110
  313.         0, DecodeGeneric },
  314.     { "WM_COMMAND", WM_COMMAND,                             // 0x0111
  315.         0, DecodeGeneric },
  316.     { "WM_SYSCOMMAND", WM_SYSCOMMAND,                       // 0x0112
  317.         0, DecodeGeneric },
  318.     { "WM_TIMER", WM_TIMER,                                 // 0x0113
  319.         0, DecodeGeneric },
  320.     { "WM_HSCROLL", WM_HSCROLL,                             // 0x0114
  321.         0, DecodeGeneric },
  322.     { "WM_VSCROLL", WM_VSCROLL,                             // 0x0115
  323.         0, DecodeGeneric },
  324.     { "WM_INITMENU", WM_INITMENU,                           // 0x0116
  325.         0, DecodeGeneric },
  326.     { "WM_INITMENUPOPUP", WM_INITMENUPOPUP,                 // 0x0117
  327.         0, DecodeGeneric },
  328.     { "WM_MENUSELECT", WM_MENUSELECT,                       // 0x011F
  329.         0, DecodeGeneric },
  330.     { "WM_MENUCHAR", WM_MENUCHAR,                           // 0x0120
  331.         0, DecodeGeneric },
  332.     { "WM_ENTERIDLE", WM_ENTERIDLE,                         // 0x0121
  333.         0, DecodeGeneric },
  334.     { "WM_CTLCOLORMSGBOX", WM_CTLCOLORMSGBOX,               // 0x0132
  335.         0, DecodeGeneric },
  336.     { "WM_CTLCOLOREDIT", WM_CTLCOLOREDIT,                   // 0x0133
  337.         0, DecodeGeneric },
  338.     { "WM_CTLCOLORLISTBOX", WM_CTLCOLORLISTBOX,             // 0x0134
  339.         0, DecodeGeneric },
  340.     { "WM_CTLCOLORBTN", WM_CTLCOLORBTN,                     // 0x0135
  341.         0, DecodeGeneric },
  342.     { "WM_CTLCOLORDLG", WM_CTLCOLORDLG,                     // 0x0136
  343.         0, DecodeGeneric },
  344.     { "WM_CTLCOLORSCROLLBAR", WM_CTLCOLORSCROLLBAR,         // 0x0137
  345.         0, DecodeGeneric },
  346.     { "WM_CTLCOLORSTATIC", WM_CTLCOLORSTATIC,               // 0x0138
  347.         0, DecodeGeneric },
  348.     { "CB_GETEDITSEL", CB_GETEDITSEL,                       // 0x0140
  349.         MTF_TYPE_CB, DecodeGeneric },
  350.     { "CB_LIMITTEXT", CB_LIMITTEXT,                         // 0x0141
  351.         MTF_TYPE_CB, DecodeGeneric },
  352.     { "CB_SETEDITSEL", CB_SETEDITSEL,                       // 0x0142
  353.         MTF_TYPE_CB, DecodeGeneric },
  354.     { "CB_ADDSTRING", CB_ADDSTRING,                         // 0x0143
  355.         MTF_TYPE_CB, DecodeGeneric },
  356.     { "CB_DELETESTRING", CB_DELETESTRING,                   // 0x0144
  357.         MTF_TYPE_CB, DecodeGeneric },
  358.     { "CB_DIR", CB_DIR,                                     // 0x0145
  359.         MTF_TYPE_CB, DecodeGeneric },
  360.     { "CB_GETCOUNT", CB_GETCOUNT,                           // 0x0146
  361.         MTF_TYPE_CB, DecodeGeneric },
  362.     { "CB_GETCURSEL", CB_GETCURSEL,                         // 0x0147
  363.         MTF_TYPE_CB, DecodeGeneric },
  364.     { "CB_GETLBTEXT", CB_GETLBTEXT,                         // 0x0148
  365.         MTF_TYPE_CB, DecodeGeneric },
  366.     { "CB_GETLBTEXTLEN", CB_GETLBTEXTLEN,                   // 0x0149
  367.         MTF_TYPE_CB, DecodeGeneric },
  368.     { "CB_INSERTSTRING", CB_INSERTSTRING,                   // 0x014A
  369.         MTF_TYPE_CB, DecodeGeneric },
  370.     { "CB_RESETCONTENT", CB_RESETCONTENT,                   // 0x014B
  371.         MTF_TYPE_CB, DecodeGeneric },
  372.     { "CB_FINDSTRING", CB_FINDSTRING,                       // 0x014C
  373.         MTF_TYPE_CB, DecodeGeneric },
  374.     { "CB_SELECTSTRING", CB_SELECTSTRING,                   // 0x014D
  375.         MTF_TYPE_CB, DecodeGeneric },
  376.     { "CB_SETCURSEL", CB_SETCURSEL,                         // 0x014E
  377.         MTF_TYPE_CB, DecodeGeneric },
  378.     { "CB_SHOWDROPDOWN", CB_SHOWDROPDOWN,                   // 0x014F
  379.         MTF_TYPE_CB, DecodeGeneric },
  380.     { "CB_GETITEMDATA", CB_GETITEMDATA,                     // 0x0150
  381.         MTF_TYPE_CB, DecodeGeneric },
  382.     { "CB_SETITEMDATA", CB_SETITEMDATA,                     // 0x0151
  383.         MTF_TYPE_CB, DecodeGeneric },
  384.     { "CB_GETDROPPEDCONTROLRECT", CB_GETDROPPEDCONTROLRECT, // 0x0152
  385.         MTF_TYPE_CB, DecodeGeneric },
  386.     { "CB_SETITEMHEIGHT", CB_SETITEMHEIGHT,                 // 0x0153
  387.         MTF_TYPE_CB, DecodeGeneric },
  388.     { "CB_GETITEMHEIGHT", CB_GETITEMHEIGHT,                 // 0x0154
  389.         MTF_TYPE_CB, DecodeGeneric },
  390.     { "CB_SETEXTENDEDUI", CB_SETEXTENDEDUI,                 // 0x0155
  391.         MTF_TYPE_CB, DecodeGeneric },
  392.     { "CB_GETEXTENDEDUI", CB_GETEXTENDEDUI,                 // 0x0156
  393.         MTF_TYPE_CB, DecodeGeneric },
  394.     { "CB_GETDROPPEDSTATE", CB_GETDROPPEDSTATE,             // 0x0157
  395.         MTF_TYPE_CB, DecodeGeneric },
  396.     { "CB_FINDSTRINGEXACT", CB_FINDSTRINGEXACT,             // 0x0158
  397.         MTF_TYPE_CB, DecodeGeneric },
  398.     { "CB_SETLOCALE", CB_SETLOCALE,                         // 0x0159
  399.         MTF_TYPE_CB, DecodeGeneric },
  400.     { "CB_GETLOCALE", CB_GETLOCALE,                         // 0x015A
  401.         MTF_TYPE_CB, DecodeGeneric },
  402.     { "STM_SETICON", STM_SETICON,                           // 0x0170
  403.         MTF_TYPE_STM, DecodeGeneric },
  404.     { "STM_GETICON", STM_GETICON,                           // 0x0171
  405.         MTF_TYPE_STM, DecodeGeneric },
  406.     { "LB_ADDSTRING", LB_ADDSTRING,                         // 0x0180
  407.         MTF_TYPE_LB, DecodeGeneric },
  408.     { "LB_INSERTSTRING", LB_INSERTSTRING,                   // 0x0181
  409.         MTF_TYPE_LB, DecodeGeneric },
  410.     { "LB_DELETESTRING", LB_DELETESTRING,                   // 0x0182
  411.         MTF_TYPE_LB, DecodeGeneric },
  412.     { "LB_SELITEMRANGEEX", LB_SELITEMRANGEEX,               // 0x0183
  413.         MTF_TYPE_LB, DecodeGeneric },
  414.     { "LB_RESETCONTENT", LB_RESETCONTENT,                   // 0x0184
  415.         MTF_TYPE_LB, DecodeGeneric },
  416.     { "LB_SETSEL", LB_SETSEL,                               // 0x0185
  417.         MTF_TYPE_LB, DecodeGeneric },
  418.     { "LB_SETCURSEL", LB_SETCURSEL,                         // 0x0186
  419.         MTF_TYPE_LB, DecodeGeneric },
  420.     { "LB_GETSEL", LB_GETSEL,                               // 0x0187
  421.         MTF_TYPE_LB, DecodeGeneric },
  422.     { "LB_GETCURSEL", LB_GETCURSEL,                         // 0x0188
  423.         MTF_TYPE_LB, DecodeGeneric },
  424.     { "LB_GETTEXT", LB_GETTEXT,                             // 0x0189
  425.         MTF_TYPE_LB, DecodeGeneric },
  426.     { "LB_GETTEXTLEN", LB_GETTEXTLEN,                       // 0x018A
  427.         MTF_TYPE_LB, DecodeGeneric },
  428.     { "LB_GETCOUNT", LB_GETCOUNT,                           // 0x018B
  429.         MTF_TYPE_LB, DecodeGeneric },
  430.     { "LB_SELECTSTRING", LB_SELECTSTRING,                   // 0x018C
  431.         MTF_TYPE_LB, DecodeGeneric },
  432.     { "LB_DIR", LB_DIR,                                     // 0x018D
  433.         MTF_TYPE_LB, DecodeGeneric },
  434.     { "LB_GETTOPINDEX", LB_GETTOPINDEX,                     // 0x018E
  435.         MTF_TYPE_LB, DecodeGeneric },
  436.     { "LB_FINDSTRING", LB_FINDSTRING,                       // 0x018F
  437.         MTF_TYPE_LB, DecodeGeneric },
  438.     { "LB_GETSELCOUNT", LB_GETSELCOUNT,                     // 0x0190
  439.         MTF_TYPE_LB, DecodeGeneric },
  440.     { "LB_GETSELITEMS", LB_GETSELITEMS,                     // 0x0191
  441.         MTF_TYPE_LB, DecodeGeneric },
  442.     { "LB_SETTABSTOPS", LB_SETTABSTOPS,                     // 0x0192
  443.         MTF_TYPE_LB, DecodeGeneric },
  444.     { "LB_GETHORIZONTALEXTENT", LB_GETHORIZONTALEXTENT,     // 0x0193
  445.         MTF_TYPE_LB, DecodeGeneric },
  446.     { "LB_SETHORIZONTALEXTENT", LB_SETHORIZONTALEXTENT,     // 0x0194
  447.         MTF_TYPE_LB, DecodeGeneric },
  448.     { "LB_SETCOLUMNWIDTH", LB_SETCOLUMNWIDTH,               // 0x0195
  449.         MTF_TYPE_LB, DecodeGeneric },
  450.     { "LB_ADDFILE", LB_ADDFILE,                             // 0x0196
  451.         MTF_TYPE_LB, DecodeGeneric },
  452.     { "LB_SETTOPINDEX", LB_SETTOPINDEX,                     // 0x0197
  453.         MTF_TYPE_LB, DecodeGeneric },
  454.     { "LB_GETITEMRECT", LB_GETITEMRECT,                     // 0x0198
  455.         MTF_TYPE_LB, DecodeGeneric },
  456.     { "LB_GETITEMDATA", LB_GETITEMDATA,                     // 0x0199
  457.         MTF_TYPE_LB, DecodeGeneric },
  458.     { "LB_SETITEMDATA", LB_SETITEMDATA,                     // 0x019A
  459.         MTF_TYPE_LB, DecodeGeneric },
  460.     { "LB_SELITEMRANGE", LB_SELITEMRANGE,                   // 0x019B
  461.         MTF_TYPE_LB, DecodeGeneric },
  462.     { "LB_SETANCHORINDEX", LB_SETANCHORINDEX,               // 0x019C
  463.         MTF_TYPE_LB, DecodeGeneric },
  464.     { "LB_GETANCHORINDEX", LB_GETANCHORINDEX,               // 0x019D
  465.         MTF_TYPE_LB, DecodeGeneric },
  466.     { "LB_SETCARETINDEX", LB_SETCARETINDEX,                 // 0x019E
  467.         MTF_TYPE_LB, DecodeGeneric },
  468.     { "LB_GETCARETINDEX", LB_GETCARETINDEX,                 // 0x019F
  469.         MTF_TYPE_LB, DecodeGeneric },
  470.     { "LB_SETITEMHEIGHT", LB_SETITEMHEIGHT,                 // 0x01A0
  471.         MTF_TYPE_LB, DecodeGeneric },
  472.     { "LB_GETITEMHEIGHT", LB_GETITEMHEIGHT,                 // 0x01A1
  473.         MTF_TYPE_LB, DecodeGeneric },
  474.     { "LB_FINDSTRINGEXACT", LB_FINDSTRINGEXACT,             // 0x01A2
  475.         MTF_TYPE_LB, DecodeGeneric },
  476.     { "LB_SETLOCALE", LB_SETLOCALE,                         // 0x01A5
  477.         MTF_TYPE_LB, DecodeGeneric },
  478.     { "LB_GETLOCALE", LB_GETLOCALE,                         // 0x01A6
  479.         MTF_TYPE_LB, DecodeGeneric },
  480.     { "LB_SETCOUNT", LB_SETCOUNT,                           // 0x01A7
  481.         MTF_TYPE_LB, DecodeGeneric },
  482.     { "WM_MOUSEMOVE", WM_MOUSEMOVE,                         // 0x0200
  483.         MTF_TYPE_MOUSE, DecodeGeneric },
  484.     { "WM_LBUTTONDOWN", WM_LBUTTONDOWN,                     // 0x0201
  485.         MTF_TYPE_MOUSE, DecodeGeneric },
  486.     { "WM_LBUTTONUP", WM_LBUTTONUP,                         // 0x0202
  487.         MTF_TYPE_MOUSE, DecodeGeneric },
  488.     { "WM_LBUTTONDBLCLK", WM_LBUTTONDBLCLK,                 // 0x0203
  489.         MTF_TYPE_MOUSE, DecodeGeneric },
  490.     { "WM_RBUTTONDOWN", WM_RBUTTONDOWN,                     // 0x0204
  491.         MTF_TYPE_MOUSE, DecodeGeneric },
  492.     { "WM_RBUTTONUP", WM_RBUTTONUP,                         // 0x0205
  493.         MTF_TYPE_MOUSE, DecodeGeneric },
  494.     { "WM_RBUTTONDBLCLK", WM_RBUTTONDBLCLK,                 // 0x0206
  495.         MTF_TYPE_MOUSE, DecodeGeneric },
  496.     { "WM_MBUTTONDOWN", WM_MBUTTONDOWN,                     // 0x0207
  497.         MTF_TYPE_MOUSE, DecodeGeneric },
  498.     { "WM_MBUTTONUP", WM_MBUTTONUP,                         // 0x0208
  499.         MTF_TYPE_MOUSE, DecodeGeneric },
  500.     { "WM_MBUTTONDBLCLK", WM_MBUTTONDBLCLK,                 // 0x0209
  501.         MTF_TYPE_MOUSE, DecodeGeneric },
  502.     { "WM_PARENTNOTIFY", WM_PARENTNOTIFY,                   // 0x0210
  503.         MTF_TYPE_MOUSE, DecodeGeneric },
  504.     { "WM_ENTERMENULOOP", WM_ENTERMENULOOP,                 // 0x0211
  505.         0, DecodeGeneric },
  506.     { "WM_EXITMENULOOP", WM_EXITMENULOOP,                   // 0x0212
  507.         0, DecodeGeneric },
  508.     { "WM_MDICREATE", WM_MDICREATE,                         // 0x0220
  509.         0, DecodeGeneric },
  510.     { "WM_MDIDESTROY", WM_MDIDESTROY,                       // 0x0221
  511.         0, DecodeGeneric },
  512.     { "WM_MDIACTIVATE", WM_MDIACTIVATE,                     // 0x0222
  513.         0, DecodeGeneric },
  514.     { "WM_MDIRESTORE", WM_MDIRESTORE,                       // 0x0223
  515.         0, DecodeGeneric },
  516.     { "WM_MDINEXT", WM_MDINEXT,                             // 0x0224
  517.         0, DecodeGeneric },
  518.     { "WM_MDIMAXIMIZE", WM_MDIMAXIMIZE,                     // 0x0225
  519.         0, DecodeGeneric },
  520.     { "WM_MDITILE", WM_MDITILE,                             // 0x0226
  521.         0, DecodeGeneric },
  522.     { "WM_MDICASCADE", WM_MDICASCADE,                       // 0x0227
  523.         0, DecodeGeneric },
  524.     { "WM_MDIICONARRANGE", WM_MDIICONARRANGE,               // 0x0228
  525.         0, DecodeGeneric },
  526.     { "WM_MDIGETACTIVE", WM_MDIGETACTIVE,                   // 0x0229
  527.         0, DecodeGeneric },
  528.     { "WM_MDISETMENU", WM_MDISETMENU,                       // 0x0230
  529.         0, DecodeGeneric },
  530.     { "WM_ENTERSIZEMOVE", WM_ENTERSIZEMOVE,                 // 0x0231
  531.         0, DecodeGeneric },
  532.     { "WM_EXITSIZEMOVE", WM_EXITSIZEMOVE,                   // 0x0232
  533.         0, DecodeGeneric },
  534.     { "WM_DROPFILES", WM_DROPFILES,                         // 0x0233
  535.         0, DecodeGeneric },
  536.     { "WM_MDIREFRESHMENU", WM_MDIREFRESHMENU,               // 0x0234
  537.         0, DecodeGeneric },
  538. #ifdef  FE_IME
  539.     { "WM_IME_REPORT", WM_IME_REPORT,                       // 0x0280
  540.         MTF_TYPE_IME, DecodeGeneric },
  541. #endif
  542.     { "WM_IME_SETCONTEXT",      WM_IME_SETCONTEXT,          // 0x0281
  543.         TMP_MTF_TYPE_IME, DecodeGeneric },
  544.     { "WM_IME_NOTIFY",          WM_IME_NOTIFY,              // 0x0282
  545.         TMP_MTF_TYPE_IME, DecodeGeneric },
  546.     { "WM_IME_CONTROL",         WM_IME_CONTROL,             // 0x0283
  547.         TMP_MTF_TYPE_IME, DecodeGeneric },
  548.     { "WM_IME_COMPOSITIONFULL", WM_IME_COMPOSITIONFULL,     // 0x0284
  549.         TMP_MTF_TYPE_IME, DecodeGeneric },
  550.     { "WM_IME_SELECT",          WM_IME_SELECT,              // 0x0285
  551.         TMP_MTF_TYPE_IME, DecodeGeneric },
  552.     { "WM_IME_CHAR",            WM_IME_CHAR,                // 0x0286
  553.         TMP_MTF_TYPE_IME, DecodeGeneric },
  554. #ifdef  FE_IME
  555.     { "WM_IMEKEYDOWN", WM_IMEKEYDOWN,                       // 0x0290
  556.         MTF_TYPE_IME, DecodeGeneric },
  557.     { "WM_IMEKEYUP", WM_IMEKEYUP,                           // 0x0291
  558.         MTF_TYPE_IME, DecodeGeneric },
  559. #endif
  560.     { "WM_CUT", WM_CUT,                                     // 0x0300
  561.         MTF_TYPE_CLIP, DecodeGeneric },
  562.     { "WM_COPY", WM_COPY,                                   // 0x0301
  563.         MTF_TYPE_CLIP, DecodeGeneric },
  564.     { "WM_PASTE", WM_PASTE,                                 // 0x0302
  565.         MTF_TYPE_CLIP, DecodeGeneric },
  566.     { "WM_CLEAR", WM_CLEAR,                                 // 0x0303
  567.         MTF_TYPE_CLIP, DecodeGeneric },
  568.     { "WM_UNDO", WM_UNDO,                                   // 0x0304
  569.         MTF_TYPE_CLIP, DecodeGeneric },
  570.     { "WM_RENDERFORMAT", WM_RENDERFORMAT,                   // 0x0305
  571.         MTF_TYPE_CLIP, DecodeGeneric },
  572.     { "WM_RENDERALLFORMATS", WM_RENDERALLFORMATS,           // 0x0306
  573.         MTF_TYPE_CLIP, DecodeGeneric },
  574.     { "WM_DESTROYCLIPBOARD", WM_DESTROYCLIPBOARD,           // 0x0307
  575.         MTF_TYPE_CLIP, DecodeGeneric },
  576.     { "WM_DRAWCLIPBOARD", WM_DRAWCLIPBOARD,                 // 0x0308
  577.         MTF_TYPE_CLIP, DecodeGeneric },
  578.     { "WM_PAINTCLIPBOARD", WM_PAINTCLIPBOARD,               // 0x0309
  579.         MTF_TYPE_CLIP, DecodeGeneric },
  580.     { "WM_VSCROLLCLIPBOARD", WM_VSCROLLCLIPBOARD,           // 0x030A
  581.         MTF_TYPE_CLIP, DecodeGeneric },
  582.     { "WM_SIZECLIPBOARD", WM_SIZECLIPBOARD,                 // 0x030B
  583.         MTF_TYPE_CLIP, DecodeGeneric },
  584.     { "WM_ASKCBFORMATNAME", WM_ASKCBFORMATNAME,             // 0x030C
  585.         MTF_TYPE_CLIP, DecodeGeneric },
  586.     { "WM_CHANGECBCHAIN", WM_CHANGECBCHAIN,                 // 0x030D
  587.         MTF_TYPE_CLIP, DecodeGeneric },
  588.     { "WM_HSCROLLCLIPBOARD", WM_HSCROLLCLIPBOARD,           // 0x030E
  589.         MTF_TYPE_CLIP, DecodeGeneric },
  590.     { "WM_QUERYNEWPALETTE", WM_QUERYNEWPALETTE,             // 0x030F
  591.         0, DecodeGeneric },
  592.     { "WM_PALETTEISCHANGING", WM_PALETTEISCHANGING,         // 0x0310
  593.         0, DecodeGeneric },
  594.     { "WM_PALETTECHANGED", WM_PALETTECHANGED,               // 0x0311
  595.         0, DecodeGeneric },
  596.     { "WM_HOTKEY", WM_HOTKEY,                               // 0x0312
  597.         MTF_TYPE_KEYBD, DecodeGeneric },
  598.     { "WM_DDE_INITIATE", WM_DDE_INITIATE,                   // 0x03E0
  599.         MTF_TYPE_DDE, DecodeGeneric },
  600.     { "WM_DDE_TERMINATE", WM_DDE_TERMINATE,                 // 0x03E1
  601.         MTF_TYPE_DDE, DecodeGeneric },
  602.     { "WM_DDE_ADVISE", WM_DDE_ADVISE,                       // 0x03E2
  603.         MTF_TYPE_DDE, DecodeGeneric },
  604.     { "WM_DDE_UNADVISE", WM_DDE_UNADVISE,                   // 0x03E3
  605.         MTF_TYPE_DDE, DecodeGeneric },
  606.     { "WM_DDE_ACK", WM_DDE_ACK,                             // 0x03E4
  607.         MTF_TYPE_DDE, DecodeGeneric },
  608.     { "WM_DDE_DATA", WM_DDE_DATA,                           // 0x03E5
  609.         MTF_TYPE_DDE, DecodeGeneric },
  610.     { "WM_DDE_REQUEST", WM_DDE_REQUEST,                     // 0x03E6
  611.         MTF_TYPE_DDE, DecodeGeneric },
  612.     { "WM_DDE_POKE", WM_DDE_POKE,                           // 0x03E7
  613.         MTF_TYPE_DDE, DecodeGeneric },
  614.     { "WM_DDE_EXECUTE", WM_DDE_EXECUTE,                     // 0x03E8
  615.         MTF_TYPE_DDE, DecodeGeneric }
  616. };
  617.  
  618. INT gcMessages = sizeof(gaMsgs) / sizeof(MSGDESC);
  619.  
  620. //
  621. // Arrays of integers large enough to hold the indexes of all
  622. // the messages in the message table.  This is used when
  623. // selecting messages with the Messages dialog.
  624. //
  625. INT gaiSelected[sizeof(gaMsgs) / sizeof(MSGDESC)];
  626. INT gaiSelected2[sizeof(gaMsgs) / sizeof(MSGDESC)];
  627.  
  628. MSGGROUP gaMsgGroup[] =
  629. {
  630.     { DID_MSGSDDE,      MTF_TYPE_DDE,   0,  0 },
  631.     { DID_MSGSCLIP,     MTF_TYPE_CLIP,  0,  0 },
  632.     { DID_MSGSMOUSE,    MTF_TYPE_MOUSE, 0,  0 },
  633.     { DID_MSGSNC,       MTF_TYPE_NC,    0,  0 },
  634.     { DID_MSGSKEYBD,    MTF_TYPE_KEYBD, 0,  0 },
  635. #ifdef FE_IME
  636.     { DID_MSGSIME,      MTF_TYPE_IME,   0,  0 },
  637. #endif
  638.     { DID_MSGSBM,       MTF_TYPE_BM,    0,  0 },
  639.     { DID_MSGSCB,       MTF_TYPE_CB,    0,  0 },
  640.     { DID_MSGSEM,       MTF_TYPE_EM,    0,  0 },
  641.     { DID_MSGSLB,       MTF_TYPE_LB,    0,  0 },
  642.     { DID_MSGSSTM,      MTF_TYPE_STM,   0,  0 }
  643. };
  644.  
  645. INT gcMsgGroups = sizeof(gaMsgGroup) / sizeof(MSGGROUP);
  646.  
  647.  
  648. INT __cdecl  MsgCmp(const void *p1, const void *p2);
  649. PRIVATE VOID mprintf(LPSTR format, ...);
  650.  
  651.  
  652.  
  653. /*****************************************************************************\
  654. * MsgCmp
  655. *
  656. * Callback function for qsort that sorts messages.
  657. *
  658. * Arguments:
  659. *    void *p1 - pointer to first item
  660. *    void *p2 - pointer to second item
  661. *
  662. * Returns:
  663. *    -1 if first input less than second input
  664. *    1  if second input is less than first input
  665. *    0  if inputs are equal
  666. *
  667. \*****************************************************************************/
  668.  
  669. INT __cdecl
  670. MsgCmp(
  671.     const void *p1,
  672.     const void *p2
  673.     )
  674. {
  675.     MSGDESC *pmd1 = (PMSGDESC)p1;
  676.     MSGDESC *pmd2 = (PMSGDESC)p2;
  677.  
  678.     return pmd1->msg < pmd2->msg ? -1 : (pmd1->msg > pmd2->msg ? 1 : 0);
  679. }
  680.  
  681.  
  682.  
  683. /*****************************************************************************\
  684. * CalculatePrintfTabs
  685. *
  686. * Calculates the tabs needed for each field in the printf window.  This
  687. * is based on the largest string in the message table and the specified
  688. * font.
  689. *
  690. * Arguments:
  691. *   HFONT hfont - Font to use in the calculations.
  692. *
  693. * Returns:
  694. *   VOID
  695. \*****************************************************************************/
  696.  
  697. VOID
  698. CalculatePrintfTabs(
  699.     HFONT hfont
  700.     )
  701. {
  702.     MSGDESC *pmd;
  703.     HDC hdc;
  704.     INT dxMsg;
  705.     INT dxSpace;
  706.     INT dxHwnd;
  707.     INT tabs[3];
  708.     SIZE siz;
  709.     HFONT hfontOld;
  710.     INT i;
  711.  
  712.     hdc = GetDC(NULL);
  713.     hfontOld = SelectObject(hdc, hfont);
  714.     dxMsg = 0;
  715.     for (pmd = gaMsgs, i = 0; i < gcMessages; pmd++, i++)
  716.     {
  717.         GetTextExtentPoint(hdc, pmd->pszMsg, lstrlen(pmd->pszMsg), &siz);
  718.         dxMsg = max(dxMsg, siz.cx);
  719.     }
  720.  
  721.     //
  722.     // Calculate the widest possible hwnd value.  It is assumed that the
  723.     // font will have the same width for all digits (or that '0' would
  724.     // be the widest).
  725.     //
  726.     GetTextExtentPoint(hdc, "00000000", 8, &siz);
  727.     dxHwnd = siz.cx;
  728.     GetTextExtentPoint(hdc, "AAAAAAAA", 8, &siz);
  729.     dxHwnd = max(dxHwnd, siz.cx);
  730.     GetTextExtentPoint(hdc, "BBBBBBBB", 8, &siz);
  731.     dxHwnd = max(dxHwnd, siz.cx);
  732.     GetTextExtentPoint(hdc, "CCCCCCCC", 8, &siz);
  733.     dxHwnd = max(dxHwnd, siz.cx);
  734.     GetTextExtentPoint(hdc, "DDDDDDDD", 8, &siz);
  735.     dxHwnd = max(dxHwnd, siz.cx);
  736.     GetTextExtentPoint(hdc, "EEEEEEEE", 8, &siz);
  737.     dxHwnd = max(dxHwnd, siz.cx);
  738.     GetTextExtentPoint(hdc, "FFFFFFFF", 8, &siz);
  739.     dxHwnd = max(dxHwnd, siz.cx);
  740.  
  741.     GetTextExtentPoint(hdc, " ", 1, &siz);
  742.     dxSpace = siz.cx;
  743.  
  744.     SelectObject(hdc, hfontOld);
  745.     ReleaseDC(NULL, hdc);
  746.  
  747.     tabs[0] = dxHwnd + dxSpace;
  748.     tabs[1] = tabs[0] + dxMsg + dxSpace;
  749.     tabs[2] = tabs[1] + dxHwnd + dxSpace;
  750.  
  751.     SetPrintfTabs(3, tabs);
  752. }
  753.  
  754.  
  755.  
  756. /*****************************************************************************\
  757. * PrintMsg
  758. *
  759. * Writes out a specified message.
  760. *
  761. * Arguments:
  762. *    LPMSG lpMsg - message to print out
  763. *
  764. * Returns:
  765. *    VOID
  766. \*****************************************************************************/
  767.  
  768. VOID
  769. PrintMsg(
  770.     LPMSG lpMsg
  771.     )
  772. {
  773.     static MSGDESC md;
  774.     PMSGDESC pmd;
  775.  
  776.     md.msg = lpMsg->message;
  777.     pmd = (PMSGDESC)bsearch(&md, gaMsgs, gcMessages, sizeof(MSGDESC), MsgCmp);
  778.  
  779.     if (pmd)
  780.     {
  781.         if (pmd->Flags & MTF_SELECTED)
  782.         {
  783.             mprintf(szFormatName, lpMsg->hwnd, pmd->pszMsg, lpMsg->wParam,
  784.                 lpMsg->lParam);
  785.         }
  786.     }
  787.     else
  788.     {
  789.         if (lpMsg->message >= WM_USER)
  790.         {
  791.             if (gfMsgsUser)
  792.             {
  793.                 mprintf(szFormatUSER, lpMsg->hwnd, lpMsg->message - WM_USER,
  794.                     lpMsg->wParam, lpMsg->lParam);
  795.             }
  796.         }
  797.         else
  798.         {
  799.             if (gfMsgsUnknown)
  800.             {
  801.                 mprintf(szFormatUnknown, lpMsg->hwnd, lpMsg->message,
  802.                     lpMsg->wParam, lpMsg->lParam);
  803.             }
  804.         }
  805.     }
  806. }
  807.  
  808.  
  809.  
  810. /*****************************************************************************\
  811. * mprintf
  812. *
  813. * Writes out a message to the specified device.
  814. *
  815. * Arguments:
  816. *   LPSTR format - Format string.
  817. *   ...          - Optional arguments.
  818. *
  819. * Returns:
  820. *
  821. *
  822. \*****************************************************************************/
  823. PUBLIC INT FAR cdecl
  824. ITvwprintf(
  825. HWND  hwnd,
  826. LPSTR format,
  827. va_list marker
  828. )
  829. {
  830.     LPSTR p;
  831.     TCHAR szBuffer[512];
  832.     for( p = format; *p != '\0'; p++ ) {
  833.         if (*p == '\r')
  834.             *p = ' ';
  835.     }
  836.  
  837.     wvsprintf(szBuffer, format, marker );
  838.     return SendMessage( hwnd, WM_VWPRINTF, (WPARAM)szBuffer, (LPARAM)0 );
  839. }
  840.  
  841.  
  842. PRIVATE VOID
  843. mprintf(
  844.     LPSTR format,
  845.     ...
  846.     )
  847. {
  848.     va_list marker;
  849.     CHAR szTemp[MAXSTRING];
  850.     INT iLen;
  851.  
  852.     va_start(marker, format);
  853.  
  854.     if (gfOutputWin)
  855.     {
  856.         ITvwprintf(ghwndPrintf, format, marker);
  857.     }
  858.  
  859. #if 0
  860.     if (gfOutputCom1)
  861.     {
  862.         iLen = wvsprintf(szTemp, format, marker);
  863.         M_lwrite(INT2HFILE(FH_COM1), szTemp, iLen);
  864.     }
  865. #else //BUGBUG this doesn't work under NT.  The com device needs to be explicitly opened.
  866.     if (gfOutputCom1 && gfhCom1 != INVALID_HANDLE_VALUE)
  867.     {
  868.         DWORD   dwBytesWritten;
  869.  
  870.         iLen = wvsprintf(szTemp, format, marker);
  871.         WriteFile(gfhCom1, szTemp, iLen, &dwBytesWritten, NULL);
  872.         WriteFile(gfhCom1, "\r\n", 2,    &dwBytesWritten, NULL);
  873.     }
  874. #endif    // fix by Japanese team
  875.  
  876.     if (gfOutputFile && gfhFile)
  877.     {
  878.         iLen = wvsprintf(szTemp, format, marker);
  879.         _lwrite(gfhFile, szTemp, iLen);
  880. //BUGBUG        _lclose(DUPHFILE(gfhFile));    /* flush the file buffer */
  881.     }
  882.  
  883.     va_end(marker);
  884. }
  885.