home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / sdktools / winnt / dlgedit / globals.c < prev    next >
C/C++ Source or Header  |  1997-10-05  |  55KB  |  1,378 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. /****************************** Module Header *******************************
  13. * Module Name: globals.c
  14. *
  15. * Contains global data for the dialog box editor.
  16. *
  17. ****************************************************************************/
  18.  
  19. #include "dlgedit.h"
  20. #include "dlgextrn.h"           /* Including this verifies they are synched.*/
  21. #include "dlgfuncs.h"
  22. #include "dialogs.h"
  23. #include "dlghelp.h"
  24.  
  25. HANDLE ghInst;                  /* Application instance handle.         */
  26. HMENU ghMenuMain;               /* Main menu handle.                    */
  27. PRESLINK gprlHead = NULL;       /* Head of the linked list of resources.*/
  28. CURRENTDLG gcd;                 /* Describes the current dialog.        */
  29. HPEN hpenDarkGray;              /* A dark gray pen.                     */
  30. HANDLE ghAccTable;              /* The accelerator table handle.        */
  31. INT gMenuSelected = 0;          /* Currently selected menu item.        */
  32. HBITMAP ghbmDragHandle = NULL;  /* Handle for the drag handle bitmap.   */
  33. HBITMAP ghbmDragHandle2 = NULL; /* Handle for hollow drag handle bitmap.*/
  34. HDC ghDCMem = NULL;             /* Memory DC for drawing bitmaps.       */
  35. INT gCurTool = W_NOTHING;       /* Currently selected tool.             */
  36. PWINDOWCLASSDESC gpwcdCurTool = NULL; /* Describes current tool.        */
  37. BOOL gfToolLocked = FALSE;      /* TRUE if a tool is locked down.       */
  38. PCUSTLINK gpclHead = NULL;      /* Head of custom control linked list.  */
  39.  
  40. /*
  41.  * When the dialog editor displays one of its own dialogs, this value
  42.  * will contain the resource id of it.  It is zero if there is not a
  43.  * dialog up.
  44.  */
  45. INT gidCurrentDlg = 0;
  46.  
  47. /*
  48.  * Ordinal for the icon control to display in the dialog.  It will be
  49.  * initialized to one of the editor's own icons.
  50.  */
  51. ORDINAL gordIcon;
  52.  
  53. /*
  54.  * Bitmap handles for the up and down W_NOTHING (pointer) tool bitmaps.
  55.  */
  56. HBITMAP ghbmPointerToolUp = NULL;
  57. HBITMAP ghbmPointerToolDown = NULL;
  58.  
  59. /*-- Initialized "Preferences" Data ------------------------------------*/
  60.  
  61. /*
  62.  * Initialization data structure.  This describes each profile entry
  63.  * that is contained in the initialization file.
  64.  */
  65. INIENTRY gaie[] = {
  66.     { L"fHexMode",      &gfHexMode,         FALSE,              0 },
  67.     { L"fTranslateMode",&gfTranslateMode,   FALSE,              0 },
  68.     { L"fShowToolbox",  &gfShowToolbox,     TRUE,               0 },
  69.     { L"fUseNewKeywords",&gfUseNewKeywords, TRUE,               0 },
  70.     { L"cxGrid",        &gcxGrid,           DEFCXGRID,          0 },
  71.     { L"cyGrid",        &gcyGrid,           DEFCYGRID,          0 },
  72.     { L"xMargin",       &gxMargin,          DEFXMARGIN,         0 },
  73.     { L"yMargin",       &gyMargin,          DEFYMARGIN,         0 },
  74.     { L"xSpace",        &gxSpace,           DEFXSPACE,          0 },
  75.     { L"ySpace",        &gySpace,           DEFYSPACE,          0 },
  76.     { L"xMinPushSpace", &gxMinPushSpace,    DEFXMINPUSHSPACE,   0 },
  77.     { L"xMaxPushSpace", &gxMaxPushSpace,    DEFXMAXPUSHSPACE,   0 },
  78.     { L"yPushSpace",    &gyPushSpace,       DEFYPUSHSPACE,      0 },
  79.     { NULL,             NULL,               0,                  0 }
  80. };
  81.  
  82. BOOL gfHexMode;                 /* TRUE if in "hex" mode.               */
  83. BOOL gfTranslateMode;           /* TRUE if in "translate" mode.         */
  84. BOOL gfShowToolbox;             /* TRUE if Toolbox is to be shown.      */
  85. BOOL gfUseNewKeywords;          /* FALSE to only use "CONTROL" keyword. */
  86. INT gcxGrid;                    /* Current X grid.                      */
  87. INT gcyGrid;                    /* Current Y grid.                      */
  88. INT gxMargin;                   /* Top/bottom margin.                   */
  89. INT gyMargin;                   /* Left/right margin.                   */
  90. INT gxSpace;                    /* Horizontal control spacing.          */
  91. INT gySpace;                    /* Vertical control spacing.            */
  92. INT gxMinPushSpace;             /* Minimum horizontal button spacing.   */
  93. INT gxMaxPushSpace;             /* Maximum horizontal button spacing.   */
  94. INT gyPushSpace;                /* Vertical button spacing.             */
  95.  
  96. TCHAR szAppPos[] = L"AppPos";   /* App window's position keyname.       */
  97. TCHAR szTBPos[] = L"TBPos";     /* Toolbox window's position keyname.   */
  98. TCHAR szCustomDLL[] = L"CustomDLL";/* Section name for DLL cust. cntls. */
  99.  
  100. /*-- Sundry Handles.----------------------------------------------------*/
  101. HWND hwndStatus = NULL;         /* Status ribbon window handle.         */
  102. HWND ghwndToolbox = NULL;       /* Toolbox window handle.               */
  103. HWND ghwndTestDlg = NULL;       /* Handle of the Test Mode dialog.      */
  104. HWND ghwndMain = NULL;          /* Main application window.             */
  105. HWND ghwndSubClient = NULL;     /* The "fake" client area.              */
  106. HWND ghwndTrackOver = NULL;     /* Window being tracked over.           */
  107.  
  108. /*-- Some System constants.---------------------------------------------*/
  109. INT gcxSysChar;                 /* Pixel width of system font char box. */
  110. INT gcySysChar;                 /* Pixel height of system font char box.*/
  111. INT gcyBorder;                  /* System height of a border.           */
  112. INT gcxPreDragMax;              /* Max X mouse move during pre-drag.    */
  113. INT gcyPreDragMax;              /* Max Y mouse move during pre-drag.    */
  114. INT gmsecPreDrag;               /* The milliseconds that pre-drag lasts.*/
  115. INT gcyPixelsPerInch;           /* Vertical pixels/inch of system.      */
  116. INT gcyStatus;                  /* Saves height of the status window.   */
  117.  
  118. /*-- Some state variables.----------------------------------------------*/
  119. INT gState = STATE_NORMAL;      /* Has the editor "state" or mode.      */
  120. BOOL gfResChged = FALSE;        /* Tell if RES has changed              */
  121. BOOL gfIncChged = FALSE;        /* Tell if include has changed          */
  122. BOOL gfDlgChanged = FALSE;      /* TRUE if current dialog has changed.  */
  123. INT gcSelected = 0;             /* Count of selected windows.           */
  124. BOOL gfTestMode = FALSE;        /* TRUE if in "test" mode.              */
  125. BOOL gfDisabled = FALSE;        /* TRUE if editing is disabled for now. */
  126. BOOL gfEditingDlg = FALSE;      /* TRUE means a dlg is picked to edit.  */
  127. BOOL gfDlgSelected = FALSE;     /* TRUE if the dialog has the selection.*/
  128.  
  129. /*
  130.  * Contains the window rectangle, in window units, for the "client"
  131.  * area for the currently chosen dialog being edited.  This rectangle
  132.  * is relative to the dialog box window.  The xLeft and yBottom fields
  133.  * contain the offset from the window origin of the dialog box to the
  134.  * origin of the "client" area.
  135.  */
  136. RECT grcDlgClient;
  137.  
  138. /*
  139.  * Contains a rectangle that surrounds all the existing controls.  This
  140.  * is used during tracking of the dialog to limit the minimum size that
  141.  * the dialog can be sized to.
  142.  */
  143. RECT grcMinDialog;
  144.  
  145. /*
  146.  * Contains the offset from the origin of the currently selected
  147.  * control to the mouse pointer.  This is updated when a control
  148.  * is clicked on and is used for dragging calculations.
  149.  */
  150. POINT gptCursorOffset;
  151.  
  152. /*
  153.  * Contains the rectangle that surrounds the selected control(s).  This
  154.  * rectangle is only valid if there are selected controls.
  155.  */
  156. RECT grcSelected;
  157.  
  158. /*
  159.  * Contains the rectangle that surrounds the control(s) that are being
  160.  * copied.  This is also used during a clipboard paste operation.  In
  161.  * that case, it contains the rectangle that surrounds the control(s)
  162.  * as they are defined in the res image.
  163.  */
  164. RECT grcCopy;
  165.  
  166. /*
  167.  * These contain the current location of the tracking rectangle when
  168.  * dragging a control.  The values for grcTrackDU are in Dialog Units
  169.  * (DU's) and the values in grcTrackWin are in window units.  The
  170.  * grcTrackWin values will only be valid if gfTrackRectShown is TRUE;
  171.  */
  172. RECT grcTrackDU;                /* Track rect in dialog units.          */
  173. RECT grcTrackWin;               /* Track rect in window units.          */
  174. BOOL gfTrackRectShown = FALSE;  /* TRUE if track rect is visible.       */
  175. HDC ghDCTrack;                  /* Clip DC used when tracking.          */
  176.  
  177. /*
  178.  * Contains the current drag handle that is being tracked.  This will
  179.  * be one of the DRAG_* constants.
  180.  */
  181. INT gHandleHit = DRAG_CENTER;
  182.  
  183. /*
  184.  * Contains the overhang that is allowed during the current tracking
  185.  * operation.  This is used by various routines during dragging so
  186.  * that limiting the tracking to the dialog boundaries works properly.
  187.  * In actuality, this is only non-zero when a combo box control is
  188.  * being drapped or dragged.  It will be the height of the listbox
  189.  * portion of the combo.  This is how combos are allowed to extend
  190.  * below the bottom of the dialog.
  191.  */
  192. INT gnOverHang;                 /* Maximum overhang during the drag.    */
  193.  
  194. /*
  195.  * This pointer is either NULL, or else it points to a dialog resource.
  196.  * It is used when copying dialogs/controls, either with the Duplicate
  197.  * command or pasting from the clipboard.
  198.  */
  199. PRES gpResCopy;                 /* Copy of dialog/controls.             */
  200.  
  201. /*-- CTYPE linked lists.------------------------------------------------*/
  202. NPCTYPE npcHead = NULL;         /* Linked List of controls.             */
  203. INT cWindows = 0;               /* Number of Controls in pctype list.   */
  204.  
  205. /*
  206.  * Pointer to the CTYPE structure for the currently selected control.
  207.  * This will be NULL if there is no control selected.
  208.  */
  209. NPCTYPE gnpcSel = NULL;
  210.  
  211. /*-- Cursors used by editor.--------------------------------------------*/
  212. HCURSOR hcurArrow = NULL;       /* Normal arrow cursor.                 */
  213. HCURSOR hcurWait = NULL;        /* User Wait cursor, Hourglass.         */
  214. HCURSOR hcurOutSel = NULL;      /* Outline selection cursor.            */
  215. HCURSOR hcurMove = NULL;        /* System "Move" cursor.                */
  216. HCURSOR hcurInsert = NULL;      /* Insert cursor for Order/Group dialog.*/
  217. HCURSOR hcurDropTool = NULL;    /* Cursor for when dropping new ctrls.  */
  218. HCURSOR hcurSizeNESW = NULL;    /* System sizing "NESW" cursor.         */
  219. HCURSOR hcurSizeNS = NULL;      /* System sizing "NS" cursor.           */
  220. HCURSOR hcurSizeNWSE = NULL;    /* System sizing "NWSE" cursor.         */
  221. HCURSOR hcurSizeWE = NULL;      /* System sizing "WE" cursor.           */
  222. HBITMAP hbmTabStop = NULL;      /* Bitmap for showing WS_TABSTOP style. */
  223. HBITMAP hbmTabStopSel = NULL;   /* Selected version of the above.       */
  224.  
  225. /*-- Window Class Strings.----------------------------------------------*/
  226. TCHAR szMainClass[] = L"DlgEdit";/* Application window class.           */
  227. TCHAR szDragClass[] = L"Drag";  /* Class for drag handle windows.       */
  228. TCHAR szSubClientClass[] =
  229.     L"SubClient";               /* Short client area window class.      */
  230. TCHAR szToolboxClass[] =
  231.     L"Toolbox";                 /* Toolbox window class.                */
  232. TCHAR szToolBtnClass[] =
  233.     L"ToolBtn";                 /* Toolbox button window class.         */
  234. TCHAR szCustomClass[] =
  235.     L"DlgCustom";               /* Our custom emulator class.           */
  236.  
  237. /*-- Miscellaneous variables.-------------------------------------------*/
  238. UINT fmtDlg;                    /* The Dialog Clipboard format          */
  239. TCHAR szEmpty[] = L"";          /* An empty string.                     */
  240. HHOOK ghhkMsgFilter;            /* Hook handle for message filter func. */
  241.  
  242. /*-- Buffers.-----------------------------------------------------------*/
  243. TCHAR szFullResFile[CCHMAXPATH];    /* Full resource file name          */
  244. LPTSTR pszResFile;                  /* Points to resource file name     */
  245. TCHAR szFullIncludeFile[CCHMAXPATH];/* Full include file name           */
  246. LPTSTR pszIncludeFile;              /* Points to include file name      */
  247. TCHAR gszHelpFile[CCHMAXPATH];      /* Path to the help file.           */
  248.  
  249. /*
  250.  * Write buffer and index into it.  This buffer is used by several
  251.  * sections to write out the different files.  Note that only one
  252.  * file can be written out at a time using these globals.
  253.  */
  254. TCHAR gachWriteBuffer[CCHFILEBUFFER];/* Buffer for written file data.   */
  255. INT cbWritePos;                     /* Pointer into gachWriteBuffer.    */
  256.  
  257. /*-- Include Data.------------------------------------------------------*/
  258. NPLABEL plInclude = NULL;       /* Pointer to Include data              */
  259. NPLABEL plDelInclude = NULL;    /* Pointer to deleted includes          */
  260.  
  261. /*
  262.  * Describes each window class.  Indexed by the W_ defined constants.
  263.  * The define CCONTROLS needs to be updated if controls are added or
  264.  * removed from this array.  Note that CCONTROLS does NOT count the
  265.  * W_DIALOG type as a control, however.
  266.  */
  267. WINDOWCLASSDESC awcd[] = {
  268.     /*
  269.      * W_TEXT
  270.      */
  271.     {
  272.         W_TEXT,
  273.         WS_CHILD | WS_GROUP | WS_VISIBLE | SS_LEFT,
  274.         WS_DISABLED,
  275.         0,
  276.         0,
  277.         20, 8,
  278.         IC_STATIC, NULL,
  279.         FALSE, FALSE, TRUE, TRUE, TRUE,
  280.         DID_TEXTSTYLES, (WNDPROC)GenericStylesDlgProc,
  281.         HELPID_TEXTSTYLES, IDS_DEFTXTTEXT, NULL, NULL,
  282.         IDBM_CTTEXT, NULL, NULL,
  283.         IDBM_TUTEXT, NULL, IDBM_TDTEXT, NULL,
  284.         NULL, 0, NULL, NULL, NULL, 0
  285.     },
  286.     /*
  287.      * W_EDIT
  288.      */
  289.     {
  290.         W_EDIT,
  291.         WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_LEFT |
  292.         ES_AUTOHSCROLL,
  293.         WS_DISABLED,
  294.         0,
  295.         0,
  296.         32, 12,
  297.         IC_EDIT, NULL,
  298.         FALSE, FALSE, FALSE, TRUE, FALSE,
  299.         DID_EDITSTYLES, (WNDPROC)EditStylesDlgProc,
  300.         HELPID_EDITSTYLES, IDS_NULL, NULL, NULL,
  301.         IDBM_CTEDIT, NULL, NULL,
  302.         IDBM_TUEDIT, NULL, IDBM_TDEDIT, NULL,
  303.         NULL, 0, NULL, NULL, NULL, 0
  304.     },
  305.     /*
  306.      * W_GROUPBOX
  307.      */
  308.     {
  309.         W_GROUPBOX,
  310.         WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
  311.         WS_DISABLED,
  312.         0,
  313.         0,
  314.         48, 40,
  315.         IC_BUTTON, NULL,
  316.         FALSE, FALSE, TRUE, TRUE, FALSE,
  317.         DID_GROUPBOXSTYLES, (WNDPROC)GenericStylesDlgProc,
  318.         HELPID_GROUPBOXSTYLES, IDS_DEFTXTGROUP, NULL, NULL,
  319.         IDBM_CTGROUP, NULL, NULL,
  320.         IDBM_TUGROUP, NULL, IDBM_TDGROUP, NULL,
  321.         NULL, 0, NULL, NULL, NULL, 0
  322.     },
  323.     /*
  324.      * W_PUSHBUTTON
  325.      */
  326.     {
  327.         W_PUSHBUTTON,
  328.         WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP,
  329.         WS_DISABLED,
  330.         0,
  331.         0,
  332.         40, 14,
  333.         IC_BUTTON, NULL,
  334.         FALSE, FALSE, TRUE, TRUE, TRUE,
  335.         DID_PUSHBUTTONSTYLES, (WNDPROC)PushButtonStylesDlgProc,
  336.         HELPID_PUSHBUTTONSTYLES, IDS_DEFTXTPUSHBUTTON, NULL, NULL,
  337.         IDBM_CTPUSH, NULL, NULL,
  338.         IDBM_TUPUSH, NULL, IDBM_TDPUSH, NULL,
  339.         NULL, 0, NULL, NULL, NULL, 0
  340.     },
  341.     /*
  342.      * W_CHECKBOX
  343.      */
  344.     {
  345.         W_CHECKBOX,
  346.         WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX | WS_TABSTOP,
  347.         WS_DISABLED,
  348.         0,
  349.         0,
  350.         40, 10,
  351.         IC_BUTTON, NULL,
  352.         FALSE, FALSE, TRUE, TRUE, TRUE,
  353.         DID_CHECKBOXSTYLES, (WNDPROC)CheckBoxStylesDlgProc,
  354.         HELPID_CHECKBOXSTYLES, IDS_DEFTXTCHECKBOX, NULL, NULL,
  355.         IDBM_CTCHECK, NULL, NULL,
  356.         IDBM_TUCHECK, NULL, IDBM_TDCHECK, NULL,
  357.         NULL, 0, NULL, NULL, NULL, 0
  358.     },
  359.     /*
  360.      * W_RADIOBUTTON
  361.      */
  362.     {
  363.         W_RADIOBUTTON,
  364.         WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,
  365.         WS_DISABLED,
  366.         0,
  367.         0,
  368.         39, 10,
  369.         IC_BUTTON, NULL,
  370.         FALSE, FALSE, TRUE, TRUE, TRUE,
  371.         DID_RADIOBUTTONSTYLES, (WNDPROC)RadioButtonStylesDlgProc,
  372.         HELPID_RADIOBUTTONSTYLES, IDS_DEFTXTRADIOBUTTON, NULL, NULL,
  373.         IDBM_CTRADIO, NULL, NULL,
  374.         IDBM_TURADIO, NULL, IDBM_TDRADIO, NULL,
  375.         NULL, 0, NULL, NULL, NULL, 0
  376.     },
  377.     /*
  378.      * W_COMBOBOX
  379.      */
  380.     {
  381.         W_COMBOBOX,
  382.         WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | CBS_DROPDOWN |
  383.         CBS_SORT,
  384.         WS_DISABLED | CBS_OWNERDRAWFIXED | CBS_OWNERDRAWVARIABLE |
  385.         CBS_HASSTRINGS,
  386.         CBS_OWNERDRAWFIXED | CBS_OWNERDRAWVARIABLE | CBS_HASSTRINGS,
  387.         0,
  388.         48, 35,
  389.         IC_COMBOBOX, NULL,
  390.         FALSE, FALSE, FALSE, TRUE, FALSE,
  391.         DID_COMBOBOXSTYLES, (WNDPROC)ComboBoxStylesDlgProc,
  392.         HELPID_COMBOBOXSTYLES, IDS_NULL, NULL, NULL,
  393.         IDBM_CTCOMBO, NULL, NULL,
  394.         IDBM_TUCOMBO, NULL, IDBM_TDCOMBO, NULL,
  395.         NULL, 0, NULL, NULL, NULL, 0
  396.     },
  397.     /*
  398.      * W_LISTBOX
  399.      */
  400.     {
  401.         W_LISTBOX,
  402.         WS_CHILD | WS_VISIBLE | LBS_STANDARD | WS_TABSTOP,
  403.         WS_DISABLED | LBS_OWNERDRAWFIXED | LBS_OWNERDRAWVARIABLE |
  404.         LBS_HASSTRINGS | LBS_NODATA,
  405.         LBS_OWNERDRAWFIXED | LBS_OWNERDRAWVARIABLE | LBS_HASSTRINGS |
  406.         LBS_NODATA,
  407.         0,
  408.         48, 40,
  409.         IC_LISTBOX, NULL,
  410.         FALSE, FALSE, FALSE, TRUE, FALSE,
  411.         DID_LISTBOXSTYLES, (WNDPROC)ListBoxStylesDlgProc,
  412.         HELPID_LISTBOXSTYLES, IDS_NULL, NULL, NULL,
  413.         IDBM_CTLIST, NULL, NULL,
  414.         IDBM_TULIST, NULL, IDBM_TDLIST, NULL,
  415.         NULL, 0, NULL, NULL, NULL, 0
  416.     },
  417.     /*
  418.      * W_HORZSCROLL
  419.      */
  420.     {
  421.         W_HORZSCROLL,
  422.         WS_CHILD | WS_VISIBLE | SBS_HORZ,
  423.         WS_DISABLED,
  424.         0,
  425.         0,
  426.         48, 0,
  427.         IC_SCROLLBAR, NULL,
  428.         FALSE, FALSE, FALSE, TRUE, FALSE,
  429.         DID_HORZSCROLLSTYLES, (WNDPROC)GenericStylesDlgProc,
  430.         HELPID_HORZSCROLLSTYLES, IDS_NULL, NULL, NULL,
  431.         IDBM_CTHSCROL, NULL, NULL,
  432.         IDBM_TUHSCROL, NULL, IDBM_TDHSCROL, NULL,
  433.         NULL, 0, NULL, NULL, NULL, 0
  434.     },
  435.     /*
  436.      * W_VERTSCROLL
  437.      */
  438.     {
  439.         W_VERTSCROLL,
  440.         WS_CHILD | WS_VISIBLE | SBS_VERT,
  441.         WS_DISABLED,
  442.         0,
  443.         0,
  444.         0, 40,
  445.         IC_SCROLLBAR, NULL,
  446.         FALSE, FALSE, FALSE, TRUE, FALSE,
  447.         DID_VERTSCROLLSTYLES, (WNDPROC)GenericStylesDlgProc,
  448.         HELPID_VERTSCROLLSTYLES, IDS_NULL, NULL, NULL,
  449.         IDBM_CTVSCROL, NULL, NULL,
  450.         IDBM_TUVSCROL, NULL, IDBM_TDVSCROL, NULL,
  451.         NULL, 0, NULL, NULL, NULL, 0
  452.     },
  453.     /*
  454.      * W_FRAME
  455.      */
  456.     {
  457.         W_FRAME,
  458.         WS_CHILD | WS_VISIBLE | SS_BLACKFRAME,
  459.         WS_DISABLED,
  460.         0,
  461.         0,
  462.         20, 16,
  463.         IC_STATIC, NULL,
  464.         FALSE, FALSE, FALSE, TRUE, FALSE,
  465.         DID_FRAMESTYLES, (WNDPROC)GenericStylesDlgProc,
  466.         HELPID_FRAMESTYLES, IDS_NULL, NULL, NULL,
  467.         IDBM_CTFRAME, NULL, NULL,
  468.         IDBM_TUFRAME, NULL, IDBM_TDFRAME, NULL,
  469.         NULL, 0, NULL, NULL, NULL, 0
  470.     },
  471.     /*
  472.      * W_RECT
  473.      */
  474.     {
  475.         W_RECT,
  476.         WS_CHILD | WS_VISIBLE | SS_BLACKRECT,
  477.         WS_DISABLED,
  478.         0,
  479.         0,
  480.         20, 16,
  481.         IC_STATIC, NULL,
  482.         FALSE, FALSE, FALSE, TRUE, FALSE,
  483.         DID_RECTSTYLES, (WNDPROC)GenericStylesDlgProc,
  484.         HELPID_RECTSTYLES, IDS_NULL, NULL, NULL,
  485.         IDBM_CTRECT, NULL, NULL,
  486.         IDBM_TURECT, NULL, IDBM_TDRECT, NULL,
  487.         NULL, 0, NULL, NULL, NULL, 0
  488.     },
  489.     /*
  490.      * W_ICON
  491.      */
  492.     {
  493.         W_ICON,
  494.         WS_CHILD | WS_VISIBLE | SS_ICON,
  495.         WS_DISABLED,
  496.         0,
  497.         0,
  498.         0, 0,
  499.         IC_STATIC, NULL,
  500.         FALSE, FALSE, TRUE, FALSE, FALSE,
  501.         DID_ICONSTYLES, (WNDPROC)GenericStylesDlgProc,
  502.         HELPID_ICONSTYLES, IDS_NULL, NULL, NULL,
  503.         IDBM_CTICON, NULL, NULL,
  504.         IDBM_TUICON, NULL, IDBM_TDICON, NULL,
  505.         NULL, 0, NULL, NULL, NULL, 0
  506.     },
  507.     /*
  508.      * W_CUSTOM
  509.      *
  510.      * For Custom controls, we do not allow our emulator control
  511.      * to be created with any other styles than the default ones
  512.      * (WS_CHILD and WS_VISIBLE), but whatever styles the user
  513.      * specifies are written out to the .res and .dlg files,
  514.      * of course.
  515.      */
  516.     {
  517.         W_CUSTOM,
  518.         WS_CHILD | WS_VISIBLE,
  519.         WS_DISABLED,
  520.         0,
  521.         0,
  522.         40, 14,
  523.         IC_CUSTOM, NULL,
  524.         TRUE, FALSE, TRUE, TRUE, FALSE,
  525.         DID_CUSTOMSTYLES, (WNDPROC)CustomStylesDlgProc,
  526.         HELPID_CUSTOMSTYLES, IDS_NULL, NULL, NULL,
  527.         IDBM_CTCUSTOM, NULL, NULL,
  528.         IDBM_TUCUSTOM, NULL, IDBM_TDCUSTOM, NULL,
  529.         NULL, 0, NULL, NULL, NULL, 0
  530.     },
  531.     /*
  532.      * W_DIALOG
  533.      */
  534.     {
  535.         W_DIALOG,
  536.         WS_VISIBLE | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | WS_POPUP |
  537.         DS_SETFONT,
  538.         WS_DISABLED | DS_SYSMODAL | WS_CLIPCHILDREN | WS_CLIPSIBLINGS |
  539.         WS_CHILD,
  540.         DS_SYSMODAL,
  541.         0,
  542.         160, 100,
  543.         IC_DIALOG, NULL,
  544.         FALSE, FALSE, TRUE, TRUE, FALSE,
  545.         DID_DIALOGSTYLES, (WNDPROC)DialogStylesDlgProc,
  546.         HELPID_DIALOGSTYLES, IDS_DEFTXTDIALOG, NULL, NULL,
  547.         0, NULL, NULL,
  548.         0, NULL, 0, NULL,
  549.         NULL, 0, NULL, NULL, NULL, 0
  550.     }
  551. };
  552.  
  553. /*
  554.  * This table maps the BS_* style of a button control into its
  555.  * appropriate W_* type that is used internally by the editor.
  556.  * This table assumes that any value used to index into it is
  557.  * masked by BS_ALL.
  558.  */
  559. INT rgmpiClsBtnType[] = {
  560.     W_PUSHBUTTON,               /* BS_PUSHBUTTON                        */
  561.     W_PUSHBUTTON,               /* BS_DEFPUSHBUTTON                     */
  562.     W_CHECKBOX,                 /* BS_CHECKBOX                          */
  563.     W_CHECKBOX,                 /* BS_AUTOCHECKBOX                      */
  564.     W_RADIOBUTTON,              /* BS_RADIOBUTTON                       */
  565.     W_CHECKBOX,                 /* BS_3STATE                            */
  566.     W_CHECKBOX,                 /* BS_AUTO3STATE                        */
  567.     W_GROUPBOX,                 /* BS_GROUPBOX                          */
  568.     W_PUSHBUTTON,               /* BS_USERBUTTON                        */
  569.     W_RADIOBUTTON,              /* BS_AUTORADIOBUTTON                   */
  570.     W_PUSHBUTTON,               /* BS_PUSHBOX                           */
  571.     W_PUSHBUTTON                /* BS_OWNERDRAW                         */
  572. };
  573.  
  574. /* Map low word of Static Control Style to static type. */
  575. /*
  576.  * This table maps the SS_* style of a static control into its
  577.  * appropriate W_* type that is used internally by the editor.
  578.  * This table assumes that any value used to index into it is
  579.  * masked by SS_ALL.
  580.  */
  581. INT rgmpiClsStcType[] = {
  582.     W_TEXT,                     /* SS_LEFT                              */
  583.     W_TEXT,                     /* SS_CENTER                            */
  584.     W_TEXT,                     /* SS_RIGHT                             */
  585.     W_ICON,                     /* SS_ICON                              */
  586.     W_RECT,                     /* SS_BLACKRECT                         */
  587.     W_RECT,                     /* SS_GREYRECT                          */
  588.     W_RECT,                     /* SS_WHITERECT                         */
  589.     W_FRAME,                    /* SS_BLACKFRAME                        */
  590.     W_FRAME,                    /* SS_GRAYFRAME                         */
  591.     W_FRAME,                    /* SS_WHITEFRAME                        */
  592.     W_TEXT,                     /* SS_USERITEM                          */
  593.     W_TEXT,                     /* SS_SIMPLE                            */
  594.     W_TEXT                      /* SS_LEFTNOWORDWRAP                    */
  595. };
  596.  
  597. /*
  598.  * Following are the tables with the predefined RC keywords for each
  599.  * class (IC_*).  These tables describe each keyword other than the
  600.  * generic "CONTROL" keyword that is possible to use within a dialog
  601.  * template.  The style describes the minimum bits that must be set
  602.  * to define the keyword.  The mask allows a style to be specified
  603.  * that must have certain bits OFF for a match to occur.  The default
  604.  * styles flag specifies style bits that are implicitly turned on
  605.  * when this keyword is specified in the dialog template in the .DLG
  606.  * file.  These bits are checked against the style flag of the control
  607.  * that we are trying to match and if any of these default bits are
  608.  * NOT set for that control, we need to specify them in the .DLG file
  609.  * with a "NOT" in front of them to explicitly turn them off.
  610.  *
  611.  * The "Has Text" flag is set to FALSE in those cases where the syntax
  612.  * for the keyword does NOT include a text field, like "ICON" and
  613.  * "LISTBOX".
  614.  */
  615.  
  616. /*
  617.  * Array of the predefined RC keywords for Button styles.
  618.  */
  619. static RCKEYWORD arckwdButton[] = {
  620.     /*
  621.      * RADIOBUTTON
  622.      */
  623.     {
  624.         BS_RADIOBUTTON,
  625.         BS_ALL,
  626.         WS_CHILD | WS_VISIBLE,
  627.         IDS_KEYRADIOBUTTON, TRUE
  628.     },
  629.     /*
  630.      * CHECKBOX
  631.      */
  632.     {
  633.         BS_CHECKBOX,
  634.         BS_ALL,
  635.         WS_CHILD | WS_VISIBLE | WS_TABSTOP,
  636.         IDS_KEYCHECKBOX, TRUE
  637.     },
  638.     /*
  639.      * DEFPUSHBUTTON
  640.      */
  641.     {
  642.         BS_DEFPUSHBUTTON,
  643.         BS_ALL,
  644.         WS_CHILD | WS_VISIBLE | WS_TABSTOP,
  645.         IDS_KEYDEFPUSHBUTTON, TRUE
  646.     },
  647.     /*
  648.      * PUSHBUTTON
  649.      */
  650.     {
  651.         BS_PUSHBUTTON,
  652.         BS_ALL,
  653.         WS_CHILD | WS_VISIBLE | WS_TABSTOP,
  654.         IDS_KEYPUSHBUTTON, TRUE
  655.     },
  656.     /*
  657.      * GROUPBOX
  658.      */
  659.     {
  660.         BS_GROUPBOX,
  661.         BS_ALL,
  662.         WS_CHILD | WS_VISIBLE,
  663.         IDS_KEYGROUPBOX, TRUE
  664.     },
  665.     /*
  666.      * AUTO3STATE
  667.      */
  668.     {
  669.         BS_AUTO3STATE,
  670.         BS_ALL,
  671.         WS_CHILD | WS_VISIBLE | WS_TABSTOP,
  672.         IDS_KEYAUTO3STATE, TRUE
  673.     },
  674.     /*
  675.      * AUTOCHECKBOX
  676.      */
  677.     {
  678.         BS_AUTOCHECKBOX,
  679.         BS_ALL,
  680.         WS_CHILD | WS_VISIBLE | WS_TABSTOP,
  681.         IDS_KEYAUTOCHECKBOX, TRUE
  682.     },
  683.     /*
  684.      * AUTORADIOBUTTON
  685.      */
  686.     {
  687.         BS_AUTORADIOBUTTON,
  688.         BS_ALL,
  689.         WS_CHILD | WS_VISIBLE,
  690.         IDS_KEYAUTORADIOBUTTON, TRUE
  691.     },
  692.     /*
  693.      * STATE3
  694.      */
  695.     {
  696.         BS_3STATE,
  697.         BS_ALL,
  698.         WS_CHILD | WS_VISIBLE | WS_TABSTOP,
  699.         IDS_KEYSTATE3, TRUE
  700.     },
  701.     /*
  702.      * USERBUTTON
  703.      */
  704.     {
  705.         BS_USERBUTTON,
  706.         BS_ALL,
  707.         WS_CHILD | WS_VISIBLE | WS_TABSTOP,
  708.         IDS_KEYUSERBUTTON, TRUE
  709.     }
  710. };
  711.  
  712. /*
  713.  * Array of the predefined RC keywords for Edit control styles.
  714.  */
  715. static RCKEYWORD arckwdEdit[] = {
  716.     /*
  717.      * EDIT
  718.      */
  719.     {
  720.         0L,
  721.         0L,
  722.         WS_CHILD | WS_VISIBLE | ES_LEFT | WS_TABSTOP | WS_BORDER,
  723.         IDS_KEYEDITTEXT, FALSE
  724.     }
  725. };
  726.  
  727. /*
  728.  * Array of the predefined RC keywords for Static styles.
  729.  */
  730. static RCKEYWORD arckwdStatic[] = {
  731.     /*
  732.      * ICON
  733.      */
  734.     {
  735.         SS_ICON,
  736.         SS_ALL,
  737.         WS_CHILD | WS_VISIBLE,
  738.         IDS_KEYICON, TRUE
  739.     },
  740.     /*
  741.      * RTEXT
  742.      */
  743.     {
  744.         SS_RIGHT,
  745.         SS_ALL,
  746.         WS_CHILD | WS_GROUP | WS_VISIBLE,
  747.         IDS_KEYRTEXT, TRUE
  748.     },
  749.     /*
  750.      * CTEXT
  751.      */
  752.     {
  753.         SS_CENTER,
  754.         SS_ALL,
  755.         WS_CHILD | WS_GROUP | WS_VISIBLE,
  756.         IDS_KEYCTEXT, TRUE
  757.     },
  758.     /*
  759.      * LTEXT
  760.      */
  761.     {
  762.         SS_LEFT,
  763.         SS_ALL,
  764.         WS_CHILD | WS_GROUP | WS_VISIBLE,
  765.         IDS_KEYLTEXT, TRUE
  766.     }
  767. };
  768.  
  769. /*
  770.  * Array of the predefined RC keywords for ListBox styles.
  771.  */
  772. static RCKEYWORD arckwdLB[] = {
  773.     /*
  774.      * LISTBOX
  775.      */
  776.     {
  777.         0L,
  778.         0L,
  779.         WS_CHILD | WS_VISIBLE | WS_BORDER | LBS_NOTIFY,
  780.         IDS_KEYLISTBOX, FALSE
  781.     }
  782. };
  783.  
  784. /*
  785.  * Array of the predefined RC keywords for ComboBox styles.
  786.  */
  787. static RCKEYWORD arckwdComboBox[] = {
  788.     /*
  789.      * COMBOBOX
  790.      */
  791.     {
  792.         0L,
  793.         0L,
  794.         WS_CHILD | WS_VISIBLE,
  795.         IDS_KEYCOMBOBOX, FALSE
  796.     }
  797. };
  798.  
  799. /*
  800.  * Array of the predefined RC keywords for ScrollBar styles.
  801.  */
  802. static RCKEYWORD arckwdScrollBar[] = {
  803.     /*
  804.      * SCROLLBAR
  805.      */
  806.     {
  807.         0L,
  808.         0L,
  809.         WS_CHILD | WS_VISIBLE,
  810.         IDS_KEYSCROLLBAR, FALSE
  811.     }
  812. };
  813.  
  814.  
  815. /*
  816.  * Following are the Class Styles structures.  These tables define the
  817.  * styles for the different window classes (IC_*).  The first element
  818.  * is the style flag, followed by an optional style mask.  If the style
  819.  * mask is zero, the style flag becomes the mask also.  This is often good
  820.  * enough, but there are cases where the style depends on certain bits
  821.  * being off, as well as certain bits being on, to definitively identify
  822.  * a certain style.  An extreme example of this is the BS_PUSHBUTTON
  823.  * style, which is actually zero (no bits are on).  The mask for this
  824.  * style had to be set to include all four of the lower bits, or all
  825.  * buttons would be incorrectly figured to have the BS_PUSHBUTTON style.
  826.  * With the proper mask, only styles that have all four lower bits
  827.  * OFF will be considered to have the BS_PUSHBUTTON style.
  828.  */
  829.  
  830. /*
  831.  * Button styles.
  832.  */
  833. static CLASSSTYLE acsButton[] = {
  834.     {BS_PUSHBUTTON,         BS_ALL,     DID_BS_PUSHBUTTON           },
  835.     {BS_DEFPUSHBUTTON,      BS_ALL,     DID_BS_DEFPUSHBUTTON        },
  836.     {BS_CHECKBOX,           BS_ALL,     0                           },
  837.     {BS_AUTOCHECKBOX,       BS_ALL,     0                           },
  838.     {BS_RADIOBUTTON,        BS_ALL,     0                           },
  839.     {BS_3STATE,             BS_ALL,     0                           },
  840.     {BS_AUTO3STATE,         BS_ALL,     0                           },
  841.     {BS_GROUPBOX,           BS_ALL,     0                           },
  842.     {BS_USERBUTTON,         BS_ALL,     0                           },
  843.     {BS_AUTORADIOBUTTON,    BS_ALL,     0                           },
  844.     {BS_PUSHBOX,            BS_ALL,     0                           },
  845.     {BS_OWNERDRAW,          BS_ALL,     DID_BS_OWNERDRAW            },
  846.     {BS_LEFTTEXT,           0,          DID_BS_LEFTTEXT             }
  847. };
  848.  
  849. /*
  850.  * Scroll bar styles.
  851.  */
  852. static CLASSSTYLE acsSB[] = {
  853.     {SBS_HORZ,              SBS_ALL,    0                           },
  854.     {SBS_VERT,              SBS_ALL,    0                           },
  855.     {SBS_TOPALIGN,          0,          0                           },
  856.     {SBS_LEFTALIGN,         0,          0                           },
  857.     {SBS_BOTTOMALIGN,       0,          0                           },
  858.     {SBS_RIGHTALIGN,        0,          0                           },
  859.     {SBS_SIZEBOXTOPLEFTALIGN, 0,        0                           },
  860.     {SBS_SIZEBOXBOTTOMRIGHTALIGN, 0,    0                           },
  861.     {SBS_SIZEBOX,           0,          0                           }
  862. };
  863.  
  864. /*
  865.  * Entry field styles.
  866.  */
  867. static CLASSSTYLE acsEdit[] = {
  868.     {ES_LEFT,               ES_ALIGN,   DID_ES_LEFT                 },
  869.     {ES_CENTER,             ES_ALIGN,   DID_ES_CENTER               },
  870.     {ES_RIGHT,              ES_ALIGN,   DID_ES_RIGHT                },
  871.     {ES_MULTILINE,          0,          DID_ES_MULTILINE            },
  872.     {ES_UPPERCASE,          0,          DID_ES_UPPERCASE            },
  873.     {ES_LOWERCASE,          0,          DID_ES_LOWERCASE            },
  874.     {ES_PASSWORD,           0,          DID_ES_PASSWORD             },
  875.     {ES_AUTOVSCROLL,        0,          DID_ES_AUTOVSCROLL          },
  876.     {ES_AUTOHSCROLL,        0,          DID_ES_AUTOHSCROLL          },
  877.     {ES_NOHIDESEL,          0,          DID_ES_NOHIDESEL            },
  878.     {ES_OEMCONVERT,         0,          DID_ES_OEMCONVERT           },
  879.     {ES_READONLY,           0,          DID_ES_READONLY             }
  880. };
  881.  
  882. /*
  883.  * Static styles.
  884.  */
  885. static CLASSSTYLE acsStatic[] = {
  886.     {SS_LEFT,               SS_ALL,     DID_SS_LEFT                 },
  887.     {SS_CENTER,             SS_ALL,     DID_SS_CENTER               },
  888.     {SS_RIGHT,              SS_ALL,     DID_SS_RIGHT                },
  889.     {SS_ICON,               SS_ALL,     0                           },
  890.     {SS_BLACKRECT,          SS_ALL,     DID_SS_BLACKRECT            },
  891.     {SS_GRAYRECT,           SS_ALL,     DID_SS_GRAYRECT             },
  892.     {SS_WHITERECT,          SS_ALL,     DID_SS_WHITERECT            },
  893.     {SS_BLACKFRAME,         SS_ALL,     DID_SS_BLACKFRAME           },
  894.     {SS_GRAYFRAME,          SS_ALL,     DID_SS_GRAYFRAME            },
  895.     {SS_WHITEFRAME,         SS_ALL,     DID_SS_WHITEFRAME           },
  896.     {SS_USERITEM,           SS_ALL,     DID_SS_USERITEM             },
  897.     {SS_SIMPLE,             SS_ALL,     DID_SS_SIMPLE               },
  898.     {SS_LEFTNOWORDWRAP,     SS_ALL,     DID_SS_LEFTNOWORDWRAP       },
  899.     {SS_NOPREFIX,           0,          DID_SS_NOPREFIX             }
  900. };
  901.  
  902. /*
  903.  * List box styles.
  904.  */
  905. static CLASSSTYLE acsLB[] = {
  906.     {LBS_NOTIFY,            0,          DID_LBS_NOTIFY              },
  907.     {LBS_SORT,              0,          DID_LBS_SORT                },
  908.     {LBS_NOREDRAW,          0,          DID_LBS_NOREDRAW            },
  909.     {LBS_MULTIPLESEL,       0,          DID_LBS_MULTIPLESEL         },
  910.     {LBS_OWNERDRAWFIXED,    0,          DID_LBS_OWNERDRAWFIXED      },
  911.     {LBS_OWNERDRAWVARIABLE, 0,          DID_LBS_OWNERDRAWVARIABLE   },
  912.     {LBS_HASSTRINGS,        0,          DID_LBS_HASSTRINGS          },
  913.     {LBS_USETABSTOPS,       0,          DID_LBS_USETABSTOPS         },
  914.     {LBS_NOINTEGRALHEIGHT,  0,          DID_LBS_NOINTEGRALHEIGHT    },
  915.     {LBS_MULTICOLUMN,       0,          DID_LBS_MULTICOLUMN         },
  916.     {LBS_WANTKEYBOARDINPUT, 0,          DID_LBS_WANTKEYBOARDINPUT   },
  917.     {LBS_EXTENDEDSEL,       0,          DID_LBS_EXTENDEDSEL         },
  918.     {LBS_DISABLENOSCROLL,   0,          DID_LBS_DISABLENOSCROLL     },
  919.     {LBS_NODATA,            0,          DID_LBS_NODATA              }
  920. };
  921.  
  922. /*
  923.  * Combo Box styles.
  924.  */
  925. static CLASSSTYLE acsComboBox[] = {
  926.     {CBS_SIMPLE,            CBS_ALL,    DID_CBS_SIMPLE              },
  927.     {CBS_DROPDOWN,          CBS_ALL,    DID_CBS_DROPDOWN            },
  928.     {CBS_DROPDOWNLIST,      CBS_ALL,    DID_CBS_DROPDOWNLIST        },
  929.     {CBS_OWNERDRAWFIXED,    0,          DID_CBS_OWNERDRAWFIXED      },
  930.     {CBS_OWNERDRAWVARIABLE, 0,          DID_CBS_OWNERDRAWVARIABLE   },
  931.     {CBS_AUTOHSCROLL,       0,          DID_CBS_AUTOHSCROLL         },
  932.     {CBS_OEMCONVERT,        0,          DID_CBS_OEMCONVERT          },
  933.     {CBS_SORT,              0,          DID_CBS_SORT                },
  934.     {CBS_HASSTRINGS,        0,          DID_CBS_HASSTRINGS          },
  935.     {CBS_NOINTEGRALHEIGHT,  0,          DID_CBS_NOINTEGRALHEIGHT    },
  936.     {CBS_DISABLENOSCROLL,   0,          DID_CBS_DISABLENOSCROLL     }
  937. };
  938.  
  939. /*
  940.  * Dialog styles.
  941.  */
  942. static CLASSSTYLE acsDialog[] = {
  943.     {DS_ABSALIGN,           0,          DID_DS_ABSALIGN             },
  944.     {DS_SYSMODAL,           0,          DID_DS_SYSMODAL             },
  945.     {DS_LOCALEDIT,          0,          DID_DS_LOCALEDIT            },
  946.     {DS_SETFONT,            0,          0                           },
  947.     {DS_MODALFRAME,         0,          DID_DS_MODALFRAME           },
  948.     {DS_NOIDLEMSG,          0,          DID_DS_NOIDLEMSG            },
  949.     /*
  950.      * The following two styles are the same bits as WS_GROUP and
  951.      * WS_TABSTOP, so they must be in this table and there has
  952.      * to be special case code for writing the appropriate string
  953.      * out when writing dialog styles.
  954.      */
  955.     {WS_MINIMIZEBOX,        0,          DID_WS_MINIMIZEBOX          },
  956.     {WS_MAXIMIZEBOX,        0,          DID_WS_MAXIMIZEBOX          }
  957. };
  958.  
  959. /*
  960.  * Window styles.
  961.  */
  962. static CLASSSTYLE acsWindow[] = {
  963.     {WS_POPUP,              0,          DID_WS_POPUP                },
  964.     {WS_CHILD,              0,          DID_WS_CHILD                },
  965.     {WS_MINIMIZE,           0,          DID_WS_MINIMIZE             },
  966.     {WS_VISIBLE,            0,          DID_WS_VISIBLE              },
  967.     {WS_DISABLED,           0,          DID_WS_DISABLED             },
  968.     {WS_CLIPSIBLINGS,       0,          DID_WS_CLIPSIBLINGS         },
  969.     {WS_CLIPCHILDREN,       0,          DID_WS_CLIPCHILDREN         },
  970.     {WS_MAXIMIZE,           0,          DID_WS_MAXIMIZE             },
  971.     {WS_CAPTION,            WS_CAPTIONALL, DID_WS_CAPTION           },
  972.     {WS_BORDER,             WS_CAPTIONALL, DID_WS_BORDER            },
  973.     {WS_DLGFRAME,           WS_CAPTIONALL, DID_WS_DLGFRAME          },
  974.     {WS_VSCROLL,            0,          DID_WS_VSCROLL              },
  975.     {WS_HSCROLL,            0,          DID_WS_HSCROLL              },
  976.     {WS_SYSMENU,            0,          DID_WS_SYSMENU              },
  977.     {WS_THICKFRAME,         0,          DID_WS_THICKFRAME           },
  978.     {WS_GROUP,              0,          DID_WS_GROUP                },
  979.     {WS_TABSTOP,            0,          DID_WS_TABSTOP              }
  980. };
  981.  
  982. /*
  983.  * Resource Flags styles.
  984.  */
  985. static CLASSSTYLE acsResFlags[] = {
  986.     {MMF_MOVEABLE,          0,          DID_MMF_MOVEABLE            },
  987.     {MMF_PURE,              0,          DID_MMF_PURE                },
  988.     {MMF_PRELOAD,           0,          DID_MMF_PRELOAD             },
  989.     {MMF_DISCARDABLE,       0,          DID_MMF_DISCARDABLE         }
  990. };
  991.  
  992. /*
  993.  * Extended Styles.
  994.  */
  995. static CLASSSTYLE acsExStyle[] = {
  996.     {WS_EX_DLGMODALFRAME,   0,          0                           },
  997.     {0x0002 /*WS_EX_DRAGOBJECT*/, 0,    0                           },
  998.     {WS_EX_NOPARENTNOTIFY,  0,          0                           },
  999.     {WS_EX_TOPMOST,         0,          0                           },
  1000.     {WS_EX_ACCEPTFILES,     0,          0                           },
  1001.     {WS_EX_TRANSPARENT,     0,          0                           }
  1002. };
  1003.  
  1004.  
  1005. /*
  1006.  * Array of class style description structures.  These are indexed by
  1007.  * the IC_* constants and describe each class.  They contain pointers
  1008.  * to both the class styles array and the predefined keywords array
  1009.  * for each class.
  1010.  *
  1011.  * The last few entries are included in the table for convenience,
  1012.  * and are used to describe things like the various window (WS_*, WS_EX_*)
  1013.  * and resource memory flags (MMF_*) styles, although they don't exactly
  1014.  * map to an IC_* style that a control will have.
  1015.  */
  1016. CLASSSTYLEDESC acsd[] = {
  1017.     /*
  1018.      * IC_BUTTON
  1019.      */
  1020.     {
  1021.         IDS_WCBUTTON,
  1022.         acsButton, sizeof(acsButton) / sizeof(CLASSSTYLE), IDS_IC_BUTTON,
  1023.         arckwdButton, sizeof(arckwdButton) / sizeof(RCKEYWORD),
  1024.         ORDID_BUTTONCLASS
  1025.     },
  1026.     /*
  1027.      * IC_SCROLLBAR
  1028.      */
  1029.     {
  1030.         IDS_WCSCROLLBAR,
  1031.         acsSB, sizeof(acsSB) / sizeof(CLASSSTYLE), IDS_IC_SCROLLBAR,
  1032.         arckwdScrollBar, sizeof(arckwdScrollBar) / sizeof(RCKEYWORD),
  1033.         ORDID_SCROLLBARCLASS
  1034.     },
  1035.     /*
  1036.      * IC_EDIT
  1037.      */
  1038.     {
  1039.         IDS_WCEDIT,
  1040.         acsEdit, sizeof(acsEdit) / sizeof(CLASSSTYLE), IDS_IC_EDIT,
  1041.         arckwdEdit, sizeof(arckwdEdit) / sizeof(RCKEYWORD),
  1042.         ORDID_EDITCLASS
  1043.     },
  1044.     /*
  1045.      * IC_STATIC
  1046.      */
  1047.     {
  1048.         IDS_WCSTATIC,
  1049.         acsStatic, sizeof(acsStatic) / sizeof(CLASSSTYLE), IDS_IC_STATIC,
  1050.         arckwdStatic, sizeof(arckwdStatic) / sizeof(RCKEYWORD),
  1051.         ORDID_STATICCLASS
  1052.     },
  1053.     /*
  1054.      * IC_LISTBOX
  1055.      */
  1056.     {
  1057.         IDS_WCLISTBOX,
  1058.         acsLB, sizeof(acsLB) / sizeof(CLASSSTYLE), IDS_IC_LISTBOX,
  1059.         arckwdLB, sizeof(arckwdLB) / sizeof(RCKEYWORD),
  1060.         ORDID_LISTBOXCLASS
  1061.     },
  1062.     /*
  1063.      * IC_COMBOBOX
  1064.      */
  1065.     {
  1066.         IDS_WCCOMBOBOX,
  1067.         acsComboBox, sizeof(acsComboBox) / sizeof(CLASSSTYLE), IDS_IC_COMBOBOX,
  1068.         arckwdComboBox, sizeof(arckwdComboBox) / sizeof(RCKEYWORD),
  1069.         ORDID_COMBOBOXCLASS
  1070.     },
  1071.     /*
  1072.      * IC_CUSTOM
  1073.      */
  1074.     {
  1075.         IDS_WCCUSTOM,
  1076.         NULL, 0, 0,
  1077.         NULL, 0,
  1078.         0
  1079.     },
  1080.     /*
  1081.      * IC_DIALOG
  1082.      */
  1083.     {
  1084.         IDS_WCDIALOG,
  1085.         acsDialog, sizeof(acsDialog) / sizeof(CLASSSTYLE), IDS_IC_DIALOG,
  1086.         NULL, 0,
  1087.         0
  1088.     },
  1089.     /*
  1090.      * IC_WINDOW
  1091.      */
  1092.     {
  1093.         IDS_NULL,
  1094.         acsWindow, sizeof(acsWindow) / sizeof(CLASSSTYLE), IDS_IC_WINDOW,
  1095.         NULL, 0,
  1096.         0
  1097.     },
  1098.     /*
  1099.      * IC_RESFLAGS
  1100.      */
  1101.     {
  1102.         IDS_NULL,
  1103.         acsResFlags, sizeof(acsResFlags) / sizeof(CLASSSTYLE), 0,
  1104.         NULL, 0,
  1105.         0
  1106.     },
  1107.     /*
  1108.      * IC_EXSTYLE
  1109.      */
  1110.     {
  1111.         IDS_NULL,
  1112.         acsExStyle, sizeof(acsExStyle) / sizeof(CLASSSTYLE), IDS_IC_EXSTYLE,
  1113.         NULL, 0,
  1114.         0
  1115.     }
  1116. };
  1117.  
  1118. /*
  1119.  * Message box messages, for the Message() function.
  1120.  */
  1121. MESSAGEDATA gamdMessages[] = {
  1122.     { IDS_DELETEDIALOG,     MB_YESNO | MB_ICONEXCLAMATION       },
  1123.     { IDS_OUTOFMEMORY,      MB_OK | MB_ICONHAND                 },
  1124.     { IDS_CANTCREATE,       MB_OK | MB_ICONEXCLAMATION          },
  1125.     { IDS_SYMNOCHANGE,      MB_OK | MB_ICONEXCLAMATION          },
  1126.     { IDS_IDSYMMISMATCH,    MB_OK | MB_ICONEXCLAMATION          },
  1127.     { IDS_CLOSING,          MB_YESNOCANCEL | MB_ICONEXCLAMATION },
  1128.     { IDS_BADRESFILE,       MB_OK | MB_ICONEXCLAMATION          },
  1129.     { IDS_INCLCLOSING,      MB_YESNOCANCEL | MB_ICONEXCLAMATION },
  1130.     { IDS_SYMEXISTS,        MB_OK | MB_ICONEXCLAMATION          },
  1131.     { IDS_BADSYMBOLID,      MB_OK | MB_ICONEXCLAMATION          },
  1132.     { IDS_LABELDUPID,       MB_OK | MB_ICONEXCLAMATION          },
  1133.     { IDS_SELECTFIRST,      MB_OK | MB_ICONEXCLAMATION          },
  1134.     { IDS_CTRLDUPID,        MB_OK | MB_ICONEXCLAMATION          },
  1135.     { IDS_BADCUSTDLL,       MB_OK | MB_ICONEXCLAMATION          },
  1136.     { IDS_NOCLIP,           MB_OK | MB_ICONEXCLAMATION          },
  1137.     { IDS_INTERNAL,         MB_OK | MB_ICONEXCLAMATION          },
  1138.     { IDS_NOMOUSE,          MB_OK | MB_ICONEXCLAMATION          },
  1139.     { IDS_NOINIT,           MB_OK | MB_ICONEXCLAMATION          },
  1140.     { IDS_GTZERO,           MB_OK | MB_ICONEXCLAMATION          },
  1141.     { IDS_ICONNAMEHASBLANKS,MB_OK | MB_ICONEXCLAMATION          },
  1142.     { IDS_IDUPIDS,          MB_OK | MB_ICONEXCLAMATION          },
  1143.     { IDS_CREATECTRLERROR,  MB_OK | MB_ICONEXCLAMATION          },
  1144.     { IDS_CANTOPENRES,      MB_OK | MB_ICONEXCLAMATION          },
  1145.     { IDS_CONFIRMDISCARD,   MB_YESNO | MB_ICONEXCLAMATION       },
  1146.     { IDS_SYMNOTFOUND,      MB_OK | MB_ICONEXCLAMATION          },
  1147.     { IDS_NOCLASS,          MB_OK | MB_ICONEXCLAMATION          },
  1148.     { IDS_POSITIVENUM,      MB_OK | MB_ICONEXCLAMATION          },
  1149.     { IDS_MEMERROR,         MB_OK | MB_ICONHAND                 },
  1150.     { IDS_DLGNAMEHASBLANKS, MB_OK | MB_ICONEXCLAMATION          },
  1151.     { IDS_NODLGNAME,        MB_OK | MB_ICONEXCLAMATION          },
  1152.     { IDS_CANTINITDLL,      MB_OK | MB_ICONEXCLAMATION          },
  1153.     { IDS_NOICONNAME,       MB_OK | MB_ICONEXCLAMATION          },
  1154.     { IDS_RESTOREDIALOG,    MB_YESNO | MB_ICONEXCLAMATION       },
  1155.     { IDS_ZEROPOINTSIZE,    MB_OK | MB_ICONEXCLAMATION          },
  1156.     { IDS_MINGTMAXSPACE,    MB_OK | MB_ICONEXCLAMATION          },
  1157.     { IDS_CUSTCNTLINUSE,    MB_OK | MB_ICONEXCLAMATION          },
  1158.     { IDS_CUSTALREADYLOADED,MB_OK | MB_ICONEXCLAMATION          },
  1159.     { IDS_CANTLOADDLL,      MB_OK | MB_ICONEXCLAMATION          },
  1160.     { IDS_DLLBADEXPORTS,    MB_OK | MB_ICONEXCLAMATION          },
  1161.     { IDS_DLLBADCOUNT,      MB_OK | MB_ICONEXCLAMATION          }
  1162. };
  1163.  
  1164. /*
  1165.  * Table that maps menu items to help context id's for them.
  1166.  */
  1167. HELPMAP gahmapMenu[] = {
  1168.     {MENU_NEWRES,               HELPID_FILE_NEWRES              },
  1169.     {MENU_OPEN,                 HELPID_FILE_OPEN                },
  1170.     {MENU_SAVE,                 HELPID_FILE_SAVE                },
  1171.     {MENU_SAVEAS,               HELPID_FILE_SAVEAS              },
  1172.     {MENU_SETINCLUDE,           HELPID_FILE_SETINCLUDE          },
  1173.     {MENU_NEWCUST,              HELPID_FILE_NEWCUST             },
  1174.     {MENU_OPENCUST,             HELPID_FILE_OPENCUST            },
  1175.     {MENU_REMCUST,              HELPID_FILE_REMCUST             },
  1176.     {MENU_EXIT,                 HELPID_FILE_EXIT                },
  1177.  
  1178.     {MENU_RESTOREDIALOG,        HELPID_EDIT_RESTOREDIALOG       },
  1179.     {MENU_CUT,                  HELPID_EDIT_CUT                 },
  1180.     {MENU_COPY,                 HELPID_EDIT_COPY                },
  1181.     {MENU_PASTE,                HELPID_EDIT_PASTE               },
  1182.     {MENU_DELETE,               HELPID_EDIT_DELETE              },
  1183.     {MENU_DUPLICATE,            HELPID_EDIT_DUPLICATE           },
  1184.     {MENU_SYMBOLS,              HELPID_EDIT_SYMBOLS             },
  1185.     {MENU_STYLES,               HELPID_EDIT_STYLES              },
  1186.     {MENU_SIZETOTEXT,           HELPID_EDIT_SIZETOTEXT          },
  1187.     {MENU_NEWDIALOG,            HELPID_EDIT_NEWDIALOG           },
  1188.     {MENU_SELECTDIALOG,         HELPID_EDIT_SELECTDIALOG        },
  1189.  
  1190.     {MENU_ALIGNLEFT,            HELPID_ARRANGE_ALIGNLEFT        },
  1191.     {MENU_ALIGNVERT,            HELPID_ARRANGE_ALIGNVERT        },
  1192.     {MENU_ALIGNRIGHT,           HELPID_ARRANGE_ALIGNRIGHT       },
  1193.     {MENU_ALIGNTOP,             HELPID_ARRANGE_ALIGNTOP         },
  1194.     {MENU_ALIGNHORZ,            HELPID_ARRANGE_ALIGNHORZ        },
  1195.     {MENU_ALIGNBOTTOM,          HELPID_ARRANGE_ALIGNBOTTOM      },
  1196.     {MENU_SPACEHORZ,            HELPID_ARRANGE_SPACEHORZ        },
  1197.     {MENU_SPACEVERT,            HELPID_ARRANGE_SPACEVERT        },
  1198.     {MENU_ARRSIZEWIDTH,         HELPID_ARRANGE_ARRSIZEWIDTH     },
  1199.     {MENU_ARRSIZEHEIGHT,        HELPID_ARRANGE_ARRSIZEHEIGHT    },
  1200.     {MENU_ARRPUSHBOTTOM,        HELPID_ARRANGE_ARRPUSHBOTTOM    },
  1201.     {MENU_ARRPUSHRIGHT,         HELPID_ARRANGE_ARRPUSHRIGHT     },
  1202.     {MENU_ORDERGROUP,           HELPID_ARRANGE_ORDERGROUP       },
  1203.     {MENU_ARRSETTINGS,          HELPID_ARRANGE_ARRSETTINGS      },
  1204.  
  1205.     {MENU_TESTMODE,             HELPID_OPTIONS_TESTMODE         },
  1206.     {MENU_HEXMODE,              HELPID_OPTIONS_HEXMODE          },
  1207.     {MENU_TRANSLATE,            HELPID_OPTIONS_TRANSLATE        },
  1208.     {MENU_USENEWKEYWORDS,       HELPID_OPTIONS_USENEWKEYWORDS   },
  1209.     {MENU_SHOWTOOLBOX,          HELPID_OPTIONS_SHOWTOOLBOX      },
  1210.  
  1211.     {MENU_CONTENTS,             HELPID_HELP_CONTENTS            },
  1212.     {MENU_SEARCH,               HELPID_HELP_SEARCH              },
  1213.     // No help for the About menu command.
  1214.  
  1215.     {0,                         0                               }
  1216. };
  1217.  
  1218. /*
  1219.  * Table that maps dialog ids to help context id's for them.
  1220.  */
  1221. HELPMAP gahmapDialog[] = {
  1222.     // No help for the About dialog.
  1223.     {DID_ARRSETTINGS,           HELPID_ARRSETTINGS              },
  1224.     {DID_CHECKBOXSTYLES,        HELPID_CHECKBOXSTYLES           },
  1225.     {DID_COMBOBOXSTYLES,        HELPID_COMBOBOXSTYLES           },
  1226.     {DID_CUSTOMSTYLES,          HELPID_CUSTOMSTYLES             },
  1227.     {DID_DIALOGSTYLES,          HELPID_DIALOGSTYLES             },
  1228.     {DID_EDITSTYLES,            HELPID_EDITSTYLES               },
  1229.     {DID_FRAMESTYLES,           HELPID_FRAMESTYLES              },
  1230.     {DID_GROUPBOXSTYLES,        HELPID_GROUPBOXSTYLES           },
  1231.     {DID_ORDERGROUP,            HELPID_ORDERGROUP               },
  1232.     {DID_HORZSCROLLSTYLES,      HELPID_HORZSCROLLSTYLES         },
  1233.     {DID_ICONSTYLES,            HELPID_ICONSTYLES               },
  1234.     {DID_LISTBOXSTYLES,         HELPID_LISTBOXSTYLES            },
  1235.     {DID_NEWCUST,               HELPID_NEWCUST                  },
  1236.     {DID_PUSHBUTTONSTYLES,      HELPID_PUSHBUTTONSTYLES         },
  1237.     {DID_RADIOBUTTONSTYLES,     HELPID_RADIOBUTTONSTYLES        },
  1238.     {DID_RECTSTYLES,            HELPID_RECTSTYLES               },
  1239.     {DID_REMCUST,               HELPID_REMCUST                  },
  1240.     {DID_SELECTDIALOG,          HELPID_SELECTDIALOG             },
  1241.     {DID_SYMBOLS,               HELPID_SYMBOLS                  },
  1242.     {DID_TEXTSTYLES,            HELPID_TEXTSTYLES               },
  1243.     {DID_VERTSCROLLSTYLES,      HELPID_VERTSCROLLSTYLES         },
  1244.  
  1245.     {DID_COMMONFILEOPENINCLUDE, HELPID_COMMONFILEOPENINCLUDE    },
  1246.     {DID_COMMONFILEOPENRES,     HELPID_COMMONFILEOPENRES        },
  1247.     {DID_COMMONFILESAVEINCLUDE, HELPID_COMMONFILESAVEINCLUDE    },
  1248.     {DID_COMMONFILESAVERES,     HELPID_COMMONFILESAVERES        },
  1249.     {DID_COMMONFILEOPENDLL,     HELPID_COMMONFILEOPENDLL        },
  1250.  
  1251.     {DID_TOOLBOX,               HELPID_TOOLBOX                  },
  1252.     {DID_STATUS,                HELPID_PROPERTIESBAR            },
  1253.  
  1254.     {0,                         0                               }
  1255. };
  1256.  
  1257.  
  1258. /*
  1259.  * Language and Sub Language tables.
  1260.  */
  1261.  
  1262. static SUBLANGTABLE aslNeutral[] = {
  1263.     { SUBLANG_NEUTRAL,      IDS_SUBLANG_NEUTRAL,        IDS_SL_NEUTRAL      },
  1264.     { SUBLANG_DEFAULT,      IDS_SUBLANG_DEFAULT,        IDS_SL_DEFAULT      }
  1265. };
  1266.  
  1267. static SUBLANGTABLE aslChinese[] = {
  1268.     { SUBLANG_NEUTRAL,      IDS_SUBLANG_NEUTRAL,        IDS_SL_NEUTRAL      },
  1269.     { SUBLANG_CHINESE_SIMPLIFIED, IDS_SUBLANG_CHINESE_SIMPLIFIED, IDS_SL_CHINESE_SIMPLIFIED   },
  1270.     { SUBLANG_CHINESE_TRADITIONAL, IDS_SUBLANG_CHINESE_TRADITIONAL, IDS_SL_CHINESE_TRADITIONAL  }
  1271. };
  1272.  
  1273. static SUBLANGTABLE aslDutch[] = {
  1274.     { SUBLANG_NEUTRAL,      IDS_SUBLANG_NEUTRAL,        IDS_SL_NEUTRAL      },
  1275.     { SUBLANG_DUTCH,        IDS_SUBLANG_DUTCH,          IDS_SL_DUTCH        },
  1276.     { SUBLANG_DUTCH_BELGIAN,IDS_SUBLANG_DUTCH_BELGIAN,  IDS_SL_DUTCH_BELGIAN}
  1277. };
  1278.  
  1279. static SUBLANGTABLE aslEnglish[] = {
  1280.     { SUBLANG_NEUTRAL,      IDS_SUBLANG_NEUTRAL,        IDS_SL_NEUTRAL      },
  1281.     { SUBLANG_ENGLISH_US,   IDS_SUBLANG_ENGLISH_US,     IDS_SL_ENGLISH_US   },
  1282.     { SUBLANG_ENGLISH_UK,   IDS_SUBLANG_ENGLISH_UK,     IDS_SL_ENGLISH_UK   },
  1283.     { SUBLANG_ENGLISH_AUS,  IDS_SUBLANG_ENGLISH_AUS,    IDS_SL_ENGLISH_AUS  },
  1284.     { SUBLANG_ENGLISH_CAN,  IDS_SUBLANG_ENGLISH_CAN,    IDS_SL_ENGLISH_CAN  }
  1285. };
  1286.  
  1287. static SUBLANGTABLE aslFrench[] = {
  1288.     { SUBLANG_NEUTRAL,      IDS_SUBLANG_NEUTRAL,        IDS_SL_NEUTRAL      },
  1289.     { SUBLANG_FRENCH,       IDS_SUBLANG_FRENCH,         IDS_SL_FRENCH       },
  1290.     { SUBLANG_FRENCH_BELGIAN, IDS_SUBLANG_FRENCH_BELGIAN, IDS_SL_FRENCH_BELGIAN  },
  1291.     { SUBLANG_FRENCH_CANADIAN, IDS_SUBLANG_FRENCH_CANADIAN, IDS_SL_FRENCH_CANADIAN },
  1292.     { SUBLANG_FRENCH_SWISS, IDS_SUBLANG_FRENCH_SWISS,   IDS_SL_FRENCH_SWISS }
  1293. };
  1294.  
  1295. static SUBLANGTABLE aslGerman[] = {
  1296.     { SUBLANG_NEUTRAL,      IDS_SUBLANG_NEUTRAL,        IDS_SL_NEUTRAL      },
  1297.     { SUBLANG_GERMAN,       IDS_SUBLANG_GERMAN,         IDS_SL_GERMAN       },
  1298.     { SUBLANG_GERMAN_SWISS, IDS_SUBLANG_GERMAN_SWISS,   IDS_SL_GERMAN_SWISS }
  1299. };
  1300.  
  1301. static SUBLANGTABLE aslItalian[] = {
  1302.     { SUBLANG_NEUTRAL,      IDS_SUBLANG_NEUTRAL,        IDS_SL_NEUTRAL      },
  1303.     { SUBLANG_ITALIAN,      IDS_SUBLANG_ITALIAN,        IDS_SL_ITALIAN      },
  1304.     { SUBLANG_ITALIAN_SWISS, IDS_SUBLANG_ITALIAN_SWISS, IDS_SL_ITALIAN_SWISS }
  1305. };
  1306.  
  1307. static SUBLANGTABLE aslNorwegian[] = {
  1308.     { SUBLANG_NEUTRAL,      IDS_SUBLANG_NEUTRAL,        IDS_SL_NEUTRAL      },
  1309.     { SUBLANG_NORWEGIAN_BOKMAL, IDS_SUBLANG_NORWEGIAN_BOKMAL, IDS_SL_NORWEGIAN_BOKMAL },
  1310.     { SUBLANG_NORWEGIAN_NYNORSK, IDS_SUBLANG_NORWEGIAN_NYNORSK, IDS_SL_NORWEGIAN_NYNORSK }
  1311. };
  1312.  
  1313. static SUBLANGTABLE aslPortuguese[] = {
  1314.     { SUBLANG_NEUTRAL,      IDS_SUBLANG_NEUTRAL,        IDS_SL_NEUTRAL      },
  1315.     { SUBLANG_PORTUGUESE,   IDS_SUBLANG_PORTUGUESE,     IDS_SL_PORTUGUESE   },
  1316.     { SUBLANG_PORTUGUESE_BRAZILIAN, IDS_SUBLANG_PORTUGUESE_BRAZILIAN, IDS_SL_PORTUGUESE_BRAZILIAN }
  1317. };
  1318.  
  1319.  
  1320. static SUBLANGTABLE aslSpanish[] = {
  1321.     { SUBLANG_NEUTRAL,      IDS_SUBLANG_NEUTRAL,        IDS_SL_NEUTRAL      },
  1322.     { SUBLANG_SPANISH,      IDS_SUBLANG_SPANISH,        IDS_SL_SPANISH      },
  1323.     { SUBLANG_SPANISH_MEXICAN, IDS_SUBLANG_SPANISH_MEXICAN, IDS_SL_SPANISH_MEXICAN },
  1324.     { SUBLANG_SPANISH_MODERN, IDS_SUBLANG_SPANISH_MODERN, IDS_SL_SPANISH_MODERN }
  1325. };
  1326.  
  1327.  
  1328. LANGTABLE gaLangTable[] = {
  1329.     { LANG_NEUTRAL,         IDS_LANG_NEUTRAL,           IDS_L_NEUTRAL,
  1330.           sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
  1331.     { LANG_CHINESE,         IDS_LANG_CHINESE,           IDS_L_CHINESE,
  1332.         sizeof(aslChinese) / sizeof(SUBLANGTABLE), aslChinese },
  1333.     { LANG_CZECH,           IDS_LANG_CZECH,             IDS_L_CZECH,
  1334.         sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
  1335.     { LANG_DANISH,          IDS_LANG_DANISH,            IDS_L_DANISH,
  1336.         sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
  1337.     { LANG_DUTCH,           IDS_LANG_DUTCH,             IDS_L_DUTCH,
  1338.         sizeof(aslDutch) / sizeof(SUBLANGTABLE), aslDutch },
  1339.     { LANG_ENGLISH,         IDS_LANG_ENGLISH,           IDS_L_ENGLISH,
  1340.         sizeof(aslEnglish) / sizeof(SUBLANGTABLE), aslEnglish },
  1341.     { LANG_FINNISH,         IDS_LANG_FINNISH,           IDS_L_FINNISH,
  1342.         sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
  1343.     { LANG_FRENCH,          IDS_LANG_FRENCH,            IDS_L_FRENCH,
  1344.         sizeof(aslFrench) / sizeof(SUBLANGTABLE), aslFrench },
  1345.     { LANG_GERMAN,          IDS_LANG_GERMAN,            IDS_L_GERMAN,
  1346.         sizeof(aslGerman) / sizeof(SUBLANGTABLE), aslGerman },
  1347.     { LANG_GREEK,           IDS_LANG_GREEK,             IDS_L_GREEK,
  1348.           sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
  1349.     { LANG_HUNGARIAN,       IDS_LANG_HUNGARIAN,         IDS_L_HUNGARIAN,
  1350.         sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
  1351.     { LANG_ICELANDIC,       IDS_LANG_ICELANDIC,         IDS_L_ICELANDIC,
  1352.         sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
  1353.     { LANG_ITALIAN,         IDS_LANG_ITALIAN,           IDS_L_ITALIAN,
  1354.         sizeof(aslItalian) / sizeof(SUBLANGTABLE), aslItalian },
  1355.     { LANG_JAPANESE,        IDS_LANG_JAPANESE,          IDS_L_JAPANESE,
  1356.         sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
  1357.     { LANG_KOREAN,          IDS_LANG_KOREAN,            IDS_L_KOREAN,
  1358.         sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
  1359.     { LANG_NORWEGIAN,       IDS_LANG_NORWEGIAN,         IDS_L_NORWEGIAN,
  1360.         sizeof(aslNorwegian) / sizeof(SUBLANGTABLE), aslNorwegian },
  1361.     { LANG_POLISH,          IDS_LANG_POLISH,            IDS_L_POLISH,
  1362.         sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
  1363.     { LANG_PORTUGUESE,      IDS_LANG_PORTUGUESE,        IDS_L_PORTUGUESE,
  1364.           sizeof(aslPortuguese) / sizeof(SUBLANGTABLE), aslPortuguese },
  1365.     { LANG_RUSSIAN,         IDS_LANG_RUSSIAN,           IDS_L_RUSSIAN,
  1366.           sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
  1367.     { LANG_SLOVAK,          IDS_LANG_SLOVAK,            IDS_L_SLOVAK,
  1368.         sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
  1369.     { LANG_SPANISH,         IDS_LANG_SPANISH,           IDS_L_SPANISH,
  1370.         sizeof(aslSpanish) / sizeof(SUBLANGTABLE), aslSpanish },
  1371.     { LANG_SWEDISH,         IDS_LANG_SWEDISH,           IDS_L_SWEDISH,
  1372.           sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
  1373.     { LANG_TURKISH,         IDS_LANG_TURKISH,           IDS_L_TURKISH,
  1374.           sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
  1375. };
  1376.  
  1377. INT gcLanguages = sizeof(gaLangTable) / sizeof(LANGTABLE);
  1378.