DLGEDIT.H


/******************************************************************************\
* This is a part of the Microsoft Source Code Samples.
* Copyright 1993 - 1998 Microsoft Corporation.
* All rights reserved.
* This source code is only intended as a supplement to
* Microsoft Development Tools and/or WinHelp documentation.
* See these sources for detailed information regarding the
* Microsoft samples programs.
\******************************************************************************/

/****************************** Module Header *******************************
* Module Name: dlgedit.h
*
* Main header file for the dialog box editor.
*
****************************************************************************/

#define NOMINMAX
#include <windows.h>
#include <custcntl.h>
#include <setjmp.h>
#include "ids.h"


/*
* For unicode support.
*/
LPWSTR itoaw(INT value, LPWSTR string, INT radix);
INT awtoi(LPWSTR string);

/*
* temporary define
*/
#define BS_PUSHBOX 0x0AL


#define STATICFN static

#define WINDOWPROC LONG APIENTRY
#define DIALOGPROC BOOL APIENTRY

typedef HWND FAR *LPHWND;

/*
* Used to create a window of "DIALOG" class.
*/
#define DIALOGCLASS 0x8002

#define ORDID_RT_RESOURCE32 0x00 // Aligned res file dummy resource.
#define ORDID_RT_DIALOG 0x05 // Dialog resource type.
#define ORDID_RT_DLGINCLUDE 0x11 // Dialog include file resource type.


/*
* The ordinal for the name of the DLGINCLUDE resource.
*/
#define ORDID_DLGINCLUDE_NAME 1


/*
* Macro to pack a point into a long value.
*/
#define POINT2LONG(pt, l) (l = MAKELONG(LOWORD((pt).x), LOWORD((pt).y)))


/*
* Macros to simplify working with menus.
*/
#define MyEnableMenuItem(hMenu, wIDEnableItem, fEnable) \
EnableMenuItem((hMenu),(wIDEnableItem),(fEnable)?MF_ENABLED:MF_GRAYED)

#define MyEnableMenuItemByPos(hMenu, wPosEnableItem, fEnable) \
EnableMenuItem((hMenu),(wPosEnableItem),(fEnable)? \
MF_ENABLED | MF_BYPOSITION:MF_GRAYED | MF_BYPOSITION)

#define MyCheckMenuItem(hMenu, wIDCheckItem, fCheck) \
CheckMenuItem((hMenu),(wIDCheckItem),(fCheck)?MF_CHECKED:MF_UNCHECKED)

/*
* This macro returns TRUE if the given string is an ordinal.
*/
#define IsOrd(psz) (((PORDINAL)(psz))->wReserved == \
(WORD)0xffff ? TRUE : FALSE)

/*
* This macro returns the ordinal id in the specified name/ord field.
*/
#define OrdID(psz) (((PORDINAL)(psz))->wOrdID)


/*
* Integer property values.
*/
#define PROP_FNCHILD MAKEINTRESOURCE(0x3345)

/*
* Macro to set/remove an NPCTYPE pointer into a control or dialog hwnd.
*/
#define SETPCINTOHWND(hwnd, npc) \
SetWindowLong((hwnd), GWL_USERDATA, (DWORD)(npc))

#define UNSETPCINTOHWND(hwnd) (hwnd)

/*
* Macro to extract an NPCTYPE from a control or dialog hwnd.
*/
#define PCFROMHWND(hwnd) ((NPCTYPE)GetWindowLong(hwnd, GWL_USERDATA))

/*
* Macros to set and retrieve the original window proc from
* a child window that has been subclassed by the editor.
*/
#define SETCHILDPROC(hwnd, lpfn) SetProp((hwnd), PROP_FNCHILD, (HANDLE)(lpfn))
#define GETCHILDPROC(hwnd) ((WNDPROC)GetProp((hwnd), PROP_FNCHILD))
#define UNSETCHILDPROC(hwnd) RemoveProp((hwnd), PROP_FNCHILD)


/*
* Used to indicate an "impossible" file position (offset).
*/
#define FPOS_MAX ((DWORD)(-1L))


/*
* Special flag I place in the resource that goes into the clipboard
* that means that only the controls in the dialog template in the
* clipboard are to be copied, not the entire dialog. Because this
* value is placed into the cx field of the dialog template, it can
* only be a WORD in size. I use 0xffff (-1) because this would be
* an impossible value for the width of a dialog.
*/
#define CONTROLS_ONLY ((WORD)0xffff)


/*
* Some colors used in the editor.
*/
#define LIGHTGRAY RGB(192, 192, 192)
#define DARKGRAY RGB(128, 128, 128)
#define REPLACECOLOR1 RGB(255, 255, 255) // White
#define REPLACECOLOR2 RGB(0, 0, 0) // Black

/*
* Maximum size of a file name plus path specification.
*/
#define CCHMAXPATH 260

/*
* Maximum length of a long hex value ("0x" + 8 digits) not counting the null.
*/
#define CCHHEXLONGMAX 10

/*
* Maximum number of characters in an ID not counting the null character.
* This allows room for "0xFFFF" or "-32768".
*/
#define CCHIDMAX 6

/*
* Width and height of a handle in pixels.
*/
#define CHANDLESIZE 6

/*
* Height in DU's of the edit field of a combobox.
*/
#define COMBOEDITHEIGHT 12


/*
* Character constants.
*/
#define CHAR_NULL L'\0'
#define CHAR_TAB L'\t'
#define CHAR_NEWLINE L'\n'
#define CHAR_RETURN L'\r'
#define CHAR_BACKSLASH L'\\'
#define CHAR_COLON L':'
#define CHAR_DOT L'.'
#define CHAR_UNDERLINE L'_'
#define CHAR_ASTERISK L'*'
#define CHAR_SLASH L'/'
#define CHAR_POUND L'#'
#define CHAR_ORSYMBOL L'|'
#define CHAR_COMMA L','
#define CHAR_SPACE L' '
#define CHAR_DBLQUOTE L'"'
#define CHAR_MINUS L'-'
#define CHAR_PLUS L'+'
#define CHAR_0 L'0'
#define CHAR_A L'a'
#define CHAR_CAP_A L'A'
#define CHAR_F L'f'
#define CHAR_CAP_F L'F'
#define CHAR_X L'x'
#define CHAR_CAP_X L'X'
#define CHAR_Z L'z'
#define CHAR_CAP_Z L'Z'
#define CHAR_DOSEOF L'\x1a'


/*
* Defines for the different drag handles.
*/
#define DRAG_CENTER (-1)
#define DRAG_LEFTBOTTOM 0
#define DRAG_BOTTOM 1
#define DRAG_RIGHTBOTTOM 2
#define DRAG_RIGHT 3
#define DRAG_RIGHTTOP 4
#define DRAG_TOP 5
#define DRAG_LEFTTOP 6
#define DRAG_LEFT 7

/*
* Count of lines to insert into listbox and combobox controls during
* test mode.
*/
#define CLBTESTLINES 25

#define CCHTEXTMAX 256
#define CCHFILEBUFFER 256

/*
* Timer ID for the pre-drag timer.
*/
#define TID_PREDRAG 5

/*
* The id of the "unused" item. This is the id value for controls
* that the user creates where they do not care about the value
* of the id because it will not be referenced in their code.
*/
#define IDUNUSED (-1)

/*
* Defines for the NextID() function.
*/
#define NEXTID_DIALOG 0 /* ID for a new dialog. */
#define NEXTID_CONTROL 1 /* ID for a new control. */
#define NEXTID_LABEL 2 /* ID for a new label. */

/*
* Flags for the GridizeRect function. They specify which points in
* the rectangle to apply gridding to.
*/
#define GRIDIZE_LEFT 0x0001 // Gridize the left edge.
#define GRIDIZE_BOTTOM 0x0002 // Gridize the bottom edge.
#define GRIDIZE_RIGHT 0x0004 // Gridize the right edge.
#define GRIDIZE_TOP 0x0008 // Gridize the top edge.
#define GRIDIZE_SAMESIZE 0x0010 // Don't change cx or cy.

/*
* Default spacing constants.
*/
#define DEFCXGRID 1 // X grid.
#define DEFCYGRID 1 // Y grid.
#define DEFXMARGIN 6 // Top/bottom margin.
#define DEFYMARGIN 6 // Left/right margin.
#define DEFXMINPUSHSPACE 3 // Min. horizontal button spacing.
#define DEFXMAXPUSHSPACE 16 // Max. horizontal button spacing.
#define DEFYPUSHSPACE 3 // Vertical button spacing.
#define DEFXSPACE 6 // Horizontal control spacing.
#define DEFYSPACE 0 // Vertical control spacing.

#define IC_UNKNOWN (-1)
#define IC_BUTTON 0
#define IC_SCROLLBAR 1
#define IC_EDIT 2
#define IC_STATIC 3
#define IC_LISTBOX 4
#define IC_COMBOBOX 5
#define IC_CUSTOM 6
#define IC_DIALOG 7
#define IC_WINDOW 8
#define IC_RESFLAGS 9
#define IC_EXSTYLE 10

#define MSG_DELETEDIALOG 0
#define MSG_OUTOFMEMORY 1
#define MSG_CANTCREATE 2
#define MSG_SYMNOCHANGE 3
#define MSG_IDSYMMISMATCH 4
#define MSG_CLOSING 5
#define MSG_BADRESFILE 6
#define MSG_INCLCLOSING 7
#define MSG_SYMEXISTS 8
#define MSG_BADSYMBOLID 9
#define MSG_LABELDUPID 10
#define MSG_SELECTFIRST 11
#define MSG_CTRLDUPID 12
#define MSG_BADCUSTDLL 13
#define MSG_NOCLIP 14
#define MSG_INTERNAL 15
#define MSG_NOMOUSE 16
#define MSG_NOINIT 17
#define MSG_GTZERO 18
#define MSG_ICONNAMEHASBLANKS 19
#define MSG_IDUPIDS 20
#define MSG_CREATECTRLERROR 21
#define MSG_CANTOPENRES 22
#define MSG_CONFIRMDISCARD 23
#define MSG_SYMNOTFOUND 24
#define MSG_NOCLASS 25
#define MSG_POSITIVENUM 26
#define MSG_MEMERROR 27
#define MSG_DLGNAMEHASBLANKS 28
#define MSG_NODLGNAME 29
#define MSG_CANTINITDLL 30
#define MSG_NOICONNAME 31
#define MSG_RESTOREDIALOG 32
#define MSG_ZEROPOINTSIZE 33
#define MSG_MINGTMAXSPACE 34
#define MSG_CUSTCNTLINUSE 35
#define MSG_CUSTALREADYLOADED 36
#define MSG_CANTLOADDLL 37
#define MSG_DLLBADEXPORTS 38
#define MSG_DLLBADCOUNT 39

/*
* The following defines are used as masks in the styles arrays.
* They each define a set of bits, all of which have to be set
* properly for any of the individual styles to be considered
* to be a match. They are used for groups of styles that do
* not have a single bit set. In other words, these styles
* depend on having some bits OFF, as well as other bits ON.
*/
#define BS_ALL (BS_PUSHBUTTON | BS_DEFPUSHBUTTON | BS_CHECKBOX | \
BS_AUTOCHECKBOX | BS_RADIOBUTTON | BS_3STATE | \
BS_AUTO3STATE | BS_GROUPBOX | BS_USERBUTTON | \
BS_AUTORADIOBUTTON | BS_PUSHBOX | BS_OWNERDRAW)
#define SS_ALL (SS_LEFT | SS_CENTER | SS_RIGHT | SS_ICON | \
SS_BLACKRECT | SS_GRAYRECT | SS_WHITERECT | \
SS_BLACKFRAME | SS_GRAYFRAME | SS_WHITEFRAME | \
SS_USERITEM | SS_SIMPLE | SS_LEFTNOWORDWRAP)
#define CBS_ALL (CBS_SIMPLE | CBS_DROPDOWN | CBS_DROPDOWNLIST)
#define SBS_ALL (SBS_HORZ | SBS_VERT)
#define ES_ALIGN (ES_LEFT | ES_CENTER | ES_RIGHT)
#define WS_CAPTIONALL (WS_CAPTION | WS_BORDER | WS_DLGFRAME)

/*
* Possible values for gState, which tells us about special modes
* (states) the editor is in.
*/
#define STATE_NORMAL 0 // Normal state.
#define STATE_DRAGGINGNEW 1 // Dragging a new control from the toolbox.
#define STATE_DRAGGING 2 // Dragging an existing control.
#define STATE_SELECTING 3 // Outline selecting is in progress.
#define STATE_PREDRAG 4 // During debounce period before dragging.

/*
* Control type (W_*) constants. These are used as indexes into the
* awcd structure that describes each type of class.
*/
#define W_NOTHING (-1)

#define W_TEXT 0
#define W_EDIT 1
#define W_GROUPBOX 2
#define W_PUSHBUTTON 3
#define W_CHECKBOX 4
#define W_RADIOBUTTON 5
#define W_COMBOBOX 6
#define W_LISTBOX 7
#define W_HORZSCROLL 8
#define W_VERTSCROLL 9
#define W_FRAME 10
#define W_RECT 11
#define W_ICON 12
#define W_CUSTOM 13

#define W_DIALOG 14

/*
* Number of control types. Note that this does NOT count the
* "W_DIALOG" type, only actual controls like "W_CHECKBOX", etc.
*/
#define CCONTROLS 14

/*
* The following defines have the location (by zero based position)
* of popup menu items. If the menu arrangement is changed in the
* .RC file, these defines MUST be updated!
*/
#define MENUPOS_FILE 0
#define MENUPOS_EDIT 1
#define MENUPOS_ARRANGE 2
#define MENUPOS_ARRANGEALIGN 0
#define MENUPOS_ARRANGESPACE 1
#define MENUPOS_ARRANGESIZE 2
#define MENUPOS_ARRANGEPUSH 3


/*
* Resource memory management flags.
*/
#define MMF_MOVEABLE 0x0010
#define MMF_PURE 0x0020
#define MMF_PRELOAD 0x0040
#define MMF_DISCARDABLE 0x1000

#define DEFDLGMEMFLAGS (MMF_MOVEABLE | MMF_PURE | MMF_DISCARDABLE)

/*
* Default location of a new dialog.
*/
#define DEFDIALOGXPOS 6
#define DEFDIALOGYPOS 18

/*
* Default point size for a new dialog's font. The default face name
* is in the string IDS_DEFFONTNAME.
*/
#ifdef JAPAN
#define DEFPOINTSIZE 12
#else
#define DEFPOINTSIZE 8
#endif


#define FILE_NOSHOW 0x0001 /* Save without prompting for name */
#define FILE_INCLUDE 0x0002 /* Save/load include file */
#define FILE_RESOURCE 0x0004 /* Save/load resource file */
#define FILE_SAVEAS 0x0008 /* Save as (prompt for file name). */
#define FILE_DLL 0x0010 /* A custom control DLL file. */


/*
* Special case ordinal id values for the predefined control classes.
*/
#define ORDID_BUTTONCLASS 0x80
#define ORDID_EDITCLASS 0x81
#define ORDID_STATICCLASS 0x82
#define ORDID_LISTBOXCLASS 0x83
#define ORDID_SCROLLBARCLASS 0x84
#define ORDID_COMBOBOXCLASS 0x85

/*
* This structure is used to link resources.
*/
typedef struct tagRESLINK {
struct tagRESLINK *prlNext; /* Next in list. */
BOOL fDlgResource; /* TRUE if this is a dialog resource. */
INT cbRes; /* Size of the resource. */
HANDLE hRes; /* Handle to global memory with the res.*/
LPTSTR pszName; /* Name/ord of the resource (if dialog).*/
WORD wLanguage; /* Language identifier (if dialog). */
} RESLINK, *PRESLINK;

/*
* Describes a window class.
*
* The flStyles field is the default styles that this control type will have
* when first created. The flStylesBad field is the styles that can cause
* problems when manipulating the control in work mode, such as *_OWNERDRAW
* and so forth. Controls with this style can be created with the editor
* and will be saved as such in the .DLG file, but the actual control created
* in work mode will not have any of these styles.
*/
typedef struct {
INT iType; /* Control type index, one of the W_ constants. */
DWORD flStyles; /* Default control styles for this window class.*/
DWORD flStylesBad; /* Styles NOT to use when creating this control.*/
DWORD flStylesTestBad; /* Styles NOT to use in Test mode. */
DWORD flExtStyle; /* Default extended styles. */
INT cxDefault; /* Default x size for this control. */
INT cyDefault; /* Default y size for this control. */
INT iClass; /* Index to the IC_ class for this window class.*/
LPTSTR pszClass; /* Class name (for custom controls). */
UINT fEmulated:1; /* TRUE if this is an emulated custom control. */
UINT fUnicodeDLL:1; /* TRUE if the DLL functions are UNICODE. */
UINT fHasText:1; /* TRUE if this control type can have text. */
UINT fSizeable:1; /* TRUE if the control can be sized. */
UINT fSizeToText:1; /* TRUE if the control can be sized to its text.*/
INT idStylesDialog; /* Styles dialog id for this window class. */
WNDPROC pfnStylesDlgProc; /* Styles dialog procedure. */
INT HelpContext; /* Help context ID for the styles dialog. */
UINT idsTextDefault; /* String id of default text. */
LPTSTR pszTextDefault; /* Default text for a new control of this type. */
WNDPROC pfnOldWndProc; /* Saves the old window proc when subclassing. */
INT idbmCtrlType; /* ID of the bitmap res. for this control type. */
HBITMAP hbmCtrlType; /* Handle of the bitmap for this control type. */
HBITMAP hbmCtrlTypeSel; /* The selected version of the above. */
INT idbmToolBtnUp; /* ID of "up" bmp res. for the Toolbox button. */
HBITMAP hbmToolBtnUp; /* hbm of "up" bitmap for the Toolbox button. */
INT idbmToolBtnDown; /* ID of "down" bmp res. for the Toolbox button.*/
HBITMAP hbmToolBtnDown; /* hbm of "down" bitmap for the Toolbox button. */
HANDLE hmod; /* Custom control DLL module handle. */
INT cStyleFlags; /* Count of custom control style flags. */
LPCCSTYLEFLAG aStyleFlags; /* Ptr to custom control style flag table. */
PROC lpfnStyle; /* Custom control Style function. */
PROC lpfnSizeToText; /* Custom control SizeToText function. */
DWORD flCtrlTypeMask; /* Mask for custom control type styles. */
} WINDOWCLASSDESC;
typedef WINDOWCLASSDESC *PWINDOWCLASSDESC;

typedef struct tagCTYPE {
struct tagCTYPE *npcNext; /* Next CTYPE in linked list. */
PWINDOWCLASSDESC pwcd; /* Points to the window class desc. struct. */
HWND hwnd; /* Handle of control window. */
HWND hwndDrag; /* Handle of the drag window for this ctrl. */
DWORD flStyle; /* Control style. */
DWORD flExtStyle; /* Control extended style. */
INT id; /* Control window id. */
LPTSTR text; /* Text for control window. */
RECT rc; /* Location and size of the control. */
UINT fSelected:1; /* TRUE if the control is selected. */
UINT fGroupEnd:1; /* TRUE if ctrl is the last one in a group. */
} CTYPE;
typedef CTYPE *NPCTYPE;

typedef struct tagLABEL {
struct tagLABEL *npNext; /* pointer to next in the list */
LPTSTR pszLabel; /* Name of the symbol */
INT id; /* ID value for this label */
INT idOrig; /* Original ID value for this label */
DWORD fpos; /* File pointer to "#define" in include file*/
INT nValueOffset; /* Offset to id value start from fpos */
} LABEL;
typedef LABEL *NPLABEL;

/*
* Structure that is used to link together a list of custom controls.
* Each link points to an associated WINDOWCLASSDESC structure that
* defines the custom control type in detail.
*/
typedef struct tagCUSTLINK {
struct tagCUSTLINK *pclNext;/* Next CUSTLINK in linked list. */
LPTSTR pszFileName; /* Full path to DLL file (NULL if emulated).*/
LPTSTR pszDesc; /* Short, descriptive text for the control. */
PWINDOWCLASSDESC pwcd; /* Points to the window class desc. struct. */
} CUSTLINK, *PCUSTLINK;

typedef struct {
UINT ids; /* String id for the message text. */
UINT fMessageBox; /* Flags for the MessageBox function. */
} MESSAGEDATA;

/*
* Class Style structure. Specifies the style bits that describe
* each style, along with a mask that specifies the bits to compare
* when looking for this style. The mask is necessary when more than
* one bit specifies a style. For example, look at the BS_* styles,
* which currently use the low 3 bits of the style flag to specify
* eight different styles. The idControl field is the checkbox or
* radio button control id in the styles dialogs that corresponds to
* this particular style, or zero if it is not settable by the user.
*/
typedef struct {
DWORD flStyle; /* Style bits that identify this style. */
DWORD flStyleMask; /* Mask with the relevant bits. */
INT idControl; /* ID of the control in the styles dlg. */
} CLASSSTYLE, *PCLASSSTYLE;

/*
* RC Keyword structure. This describes a predefined RC keyword, like
* "RADIOBUTTON" and "LISTBOX".
*
* rckwd, prckwd
*/
typedef struct {
DWORD flStyle; /* Style that identifies this keyword. */
DWORD flStyleMask; /* Mask with the relevant bits. */
DWORD flStyleDefault; /* Other style bits implicitly defined. */
UINT idsKeyword; /* The RC keyword. */
BOOL fHasText; /* TRUE if this keywd has a text field. */
} RCKEYWORD, *PRCKEYWORD;

/*
* Class style description structure. These contain information on each
* of the IC_* constants.
*
* csd, pcsd
*/
typedef struct {
UINT idsClass; /* Class string for this class. */
PCLASSSTYLE pacs; /* Pointer to class styles array. */
INT cClassStyles; /* Count of class styles. */
UINT idsStylesStart; /* Starting index to style strings. */
PRCKEYWORD parckwd; /* Pointer to predefined RC keywords. */
INT cKeywords; /* Count of predefined RC keywords. */
WORD idOrd; /* Predefined ordinal id for this class. */
} CLASSSTYLEDESC;

/*
* One single entry for an environment setting saved in the
* profile file. Used by ReadEnv and WriteEnv.
*/
typedef struct _INIENTRY {
LPTSTR pszKeyName;
PINT pnVar;
INT nDefault;
INT nSave;
} INIENTRY;

/*
* This structure defines additional information on the dialog being
* edited that only pertains to dialogs, not controls. This information
* is therefore in a separate structure rather than the CTYPE structure.
* Any dialog specific information that can be changed using the Dialog
* Styles dialog must be contained in this structure.
*/
typedef struct {
WORD fResFlags; /* Dialog resource memory flags. */
WORD wLanguage; /* Language identifier for the dialog. */
LPTSTR pszClass; /* The dialog's class (or NULL). */
LPTSTR pszMenu; /* The dialog's menu (or NULL). */
DWORD DataVersion; /* Data Version data for this dialog. */
DWORD Version; /* Version data for this dialog. */
DWORD Characteristics; /* Characteristics data for this dialog.*/
INT nPointSize; /* Point size of the dialog's font. */
TCHAR szFontName[LF_FACESIZE]; /* Face name of the dialog's font. */
} DIALOGINFO, *PDIALOGINFO;

/*
* This structure contains the globals that describe the current
* dialog being edited.
*/
typedef struct {
NPCTYPE npc; /* CTYPE structure for the dialog. */
LPTSTR pszDlgName; /* Current dialog's name. */
PRESLINK prl; /* NULL or the dlg's resource link. */
BOOL fFontSpecified; /* TRUE if a font is set for the dialog.*/
HFONT hFont; /* Font handle of the dialog's font. */
INT cxChar; /* Pixel width of character box. */
INT cyChar; /* Pixel height of character box. */
DIALOGINFO di; /* Additional info for current dialog. */
} CURRENTDLG;

/*
* Structure that maps a subject (like a menu id or a dialog id) with
* a help context to pass in to WinHelp.
*/
typedef struct {
INT idSubject; /* Subject, usually a menu or dialog id.*/
INT HelpContext; /* The matching help context. */
} HELPMAP;
typedef HELPMAP *PHELPMAP;


/*
* The aligned ordinal structure. Ordinals start with a word that is
* always 0xffff, followed by a word that contains the ordinal id.
*/
typedef struct {
WORD wReserved;
WORD wOrdID;
} ORDINAL, *PORDINAL;


typedef struct {
DWORD DataSize; // Size of data.
DWORD HeaderSize; // Size of the resource header.
} RES, *PRES;

typedef struct {
DWORD DataVersion; // Predefined resource data version.
WORD MemoryFlags; // Resource memory flags.
WORD LanguageId; // UNICODE support for NLS.
DWORD Version; // Version of the resource data.
DWORD Characteristics; // Characteristics of the data.
} RES2, *PRES2;


typedef struct {
DWORD lStyle; // Style for the dialog.
DWORD lExtendedStyle; // The extended style.
WORD NumberOfItems; // Number of controls.
WORD x; // Starting x location.
WORD y; // Starting y location.
WORD cx; // Dialog width.
WORD cy; // Dialog height.
} *PDIALOGBOXHEADER;

#define SIZEOF_DIALOGBOXHEADER ( \
sizeof(DWORD) + /* lStyle */ \
sizeof(DWORD) + /* lExtendedStyle */ \
sizeof(WORD) + /* NumberOfItems */ \
sizeof(WORD) + /* x */ \
sizeof(WORD) + /* y */ \
sizeof(WORD) + /* cx */ \
sizeof(WORD) /* cy */ \
)


typedef struct {
DWORD lStyle; // Style for the control.
DWORD lExtendedStyle; // The extended style.
WORD x; // Starting x location.
WORD y; // Starting y location.
WORD cx; // Control width.
WORD cy; // Control height.
WORD wId; // Control id.
} *PCONTROLDATA;

#define SIZEOF_CONTROLDATA ( \
sizeof(DWORD) + /* lStyle */ \
sizeof(DWORD) + /* lExtendedStyle */ \
sizeof(WORD) + /* x */ \
sizeof(WORD) + /* y */ \
sizeof(WORD) + /* cx */ \
sizeof(WORD) + /* cy */ \
sizeof(WORD)) /* wId */


/*
* SubLanguage table structure. This structure describes each entry of a
* sub language table. These tables are pointed to by each entry in
* the language table.
*/
typedef struct {
WORD wSubLang; // SubLanguage value.
INT idsSubLang; // String id of SUBLANG_* define.
INT idsSubLangDesc; // String id of sub-lang description.
} SUBLANGTABLE, *PSUBLANGTABLE;

/*
* Language table structure. This structure describes each entry in the
* language table, which describes each unicode language.
*/
typedef struct {
WORD wPrimary; // Language primary value.
INT idsLang; // String id of LANG_* define.
INT idsLangDesc; // String id of language description.
INT cSubLangs; // Number of sublanguages for this lang.
PSUBLANGTABLE asl; // Points to table of sublanguages.
} LANGTABLE;