GLOBALS.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:54k
源码类别:

Windows编程

开发平台:

Visual C++

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