                           CUSTCNTL.RW
                           ===========


1        Creating custom control classes
----------------------------------------

Windows provides standard control classes, such as list boxes and
radio buttons, that you can add to your dialog box resources. In
addition to these standard classes, Resource Workshop also lets
you create and use custom control classes. This file describes
the functions you'll need to use to make your custom controls
accessible to Resource Workshop.

See Chapter 4 in the Resource Workshop User's guide for
descriptions of the standard menu controls and of how to load and
use a custom control library.

You must store your custom controls in a dynamic-link library
(DLL) file. For an example of how to use the custom control
application program interface described in this file and to
create a sample DLL file, see the BITBTN demonstration programs
on your Resource Workshop distribution disks. These programs come
in a Pascal version and a C version.

The DLL file must contain functions that enable Resource Workshop
to work with the custom controls just as it works with the
standard Windows controls. In particular, you must implement the
ListClasses function and export it by name. This function
provides information to Resource Workshop about the custom
control classes in the DLL.

You must also provide the following functions for each custom
control window class:

- Info
- Style
- Flags

These functions can have any name. They must, however, be
exported by the DLL, and pointers to them must be supplied in the
ListClasses function.

The remainder of this file is divided into two sections, the
first for C programmers and the second for Pascal programmers.
The C programming section follows immediately. To skip to the
Pascal portion, search for "Pascal programming section".


2        C programming section
------------------------------

2.1      ListClasses function
-----------------------------

ListClasses is a programmer-implemented function that passes
information about the custom control classes back to Resource
Workshop. Exporting ListClasses marks your DLL as supporting this
custom control specification.

If ListClasses is present in the DLL, Resource Workshop calls the
function, passing information about itself along with two utility
function variables used in editing the custom control.

ListClasses should return a handle to global memory allocated by
calling GlobalAlloc.  The memory referenced by this handle holds
a structure of type CTLCLASSLIST, which describes the controls in
the library.  CTLCLASSLIST is described later in this section.
The handle is freed by Resource Workshop and should not be freed
by the DLL.

Return value:

    Returns a global handle to the data structure.

Syntax:

   HGLOBAL CALLBACK ListClasses( LPSTR szAppClass, UINT wVersion,
   LPFNLOADRES fnLoad, LPFNEDITRES fnEdit);

Parameters:

    szAppClass     The class name of the main window of the
                   calling application. This class name can be
                   used by the custom control to determine if it
                   is running under a resource editor. If
                   szAppClass is "rwswnd", the calling
                   application is Resource Workshop.

    wVersion       The version number of the calling application.
                   The major version is in the high-order byte
                   and the minor version in the low-order byte.
                   For example, version 1.02 is 0x0102.

    fnLoad         A pointer to a function a custom control can
                   use to obtain a binary version of any resource
                   in the project being edited by the calling
                   application--the equivalent of the Windows API
                   function LoadResource(). The function takes
                   two parameters, a resource type name and a
                   resource name. The custom control is
                   responsible for freeing the global handle (if
                   any) returned by this function.

    fnEdit         A pointer to a function a custom control can
                   use to start a resource editor for any
                   resource in the project being edited by
                   Resource Workshop. It takes two parameters, a
                   resource type name and a resource name.

Data structures:

    typedef struct
    {
      LPFNINFO  fnRWInfo;             // Info function
      LPFNSTYLE fnRWStyle;            // Style function
      LPFNFLAGS fnFlags;              // Flags function
      char  szClass[ CTLCLASS];       // Class name

    } RWCTLCLASS, FAR *LPRWCTLCLASS;

    typedef struct {
      short  nClasses;          // Number of classes in list
      RWCTLCLASS Classes[];           // Class list
    } CTLCLASSLIST, FAR *LPCTLCLASSLIST;

    The CTLCLASSLIST structure contains a variable number of
    RWCTLCLASS strucures, the number of which is determined by
    the nClasses field.

    Each control class in the DLL must have a corresponding
    RWCTLCLASS structure in the CTLCLASSLIST. The szClass field
    contains the name with which the class was registered. For
    example, if you called RegisterClass giving the class name as
    "MYBUTTON", szClass must be "MYBUTTON".

The function variables Info, Style, and Flags--which correspond
to the pointers fnRWInfo, fnRWStyle, and fnFlags--are described
in the following sections.


2.2      Info function
----------------------

The Info function is called by Resource Workshop to retrieve
information about the control class, including the string to add
to the control menu and the bitmap to add to the tool palette.
The function returns a memory handle that can be allocated by
GlobalAlloc. This handle must refer to memory that contains a
RWCTLINFO structure. Like ListClasses, the handle returned by
Info is freed by Resource Workshop and should not be freed by the
DLL. This function is called once by Resource Workshop upon
loading the DLL.

Syntax:

    HGLOBAL CALLBACK Info( void);

Parameters:

    None.

Structure:

    The RWCTLINFO structure, defined by a typedef in the file
    CUSTCNTL.H, has two basic parts:

    - The first part has a fixed length and provides information
      about the whole control class.

    - The second part is a variable-length array of fixed-length
      records. Each record provides information about a
      particular type or subclass of the control.

    /* general size definitions */
    #define     CTLTYPES   12   /* number of control types   */
    #define     CTLDESCR   22   /* size of control menu name */
    #define     CTLCLASS   20   /* max size of class name    */
    #define     CTLTITLE   94   /* max size of control text  */

     typedef struct {
       UINT         wVersion;            /* control version */
       UINT         wCtlTypes;           /* control types */
       char         szClass[CTLCLASS];   /* control class name */
       char         szTitle[CTLTITLE];   /* control title */
       char         szReserved[10];    // reserved for future use
       RWCTLTYPE    Type[CTLTYPES];      /* control type list */
     } RWCTLINFO;

     typedef RWCTLINFO *RWPCTLINFO;
     typedef RWCTLINFO FAR *LPRWCTLINFO;

    wVersion       The version number of the custom control
                   library. The major version is in the
                   high-order byte and the minor version is in
                   the low-order byte. For example, version 1.02
                   is 0x0102. This field is not used by Resource
                   Workshop.

    wCtlTypes      The number of control sub-types defined in the
                   Type array.

    szClass        The name of the class as registered with
                   Windows.  This is duplicated from the
                   CTLCLASSLIST structure to retain upward
                   compatiblity with the Windows custom control
                   specificiation.

    szReserved     Space reserved for future expansion.  Must be
                   cleared to null characters (0).

    Type           An array of sub-type description structures of
                   type RWCTLTYPE.

    /*
     * RWCTLTYPE DATA STRUCTURE
     *
     * This data structure is returned by the control options
     * function while inquiring about the capabilities of a
     * particular control. Each control may contain various types
     * (with predefined style bits) under one general class.
     *
     * The width and height fields provide the application with
     * a suggested size. Use pixels or dialog units for the
     * values in these fields. If you use pixels, turn on the
     * most significant bit (MSB). If you use dialog units, turn
     * off the MSB.
     *
     */

     typedef struct {
       UINT         wType;               /* type style */
       UINT         wWidth;              /* suggested width */
       UINT         wHeight;             /* suggested height */
       DWORD        dwStyle;             /* default style */
       char         szDescr[CTLDESCR];   /* menu name */
       HBITMAP      hToolBit;            // Toolbox bitmap
       HCURSOR      hDropCurs;           // Drag and drop cursor
     } RWCTLTYPE, FAR * LPRWCTLTYPE;

    wType          A user-defined value used to indicate the
                   sub-type of the control.  This value is not
                   used by Resource Workshop.

    wWidth         The default width for the control.  Resource
                   Workshop will use this value if, for example,
                   the control is created by dragging the icon
                   from the tool palette.  wWidth is in dialog
                   coordinates unless the most significant bit is
                   set, in which case the value is in pixels. For
                   example, a value of "32" is 32 in dialog
                   coordinates, but the value "32 | 0x8000" is in
                   pixels.

    wHeight        The default height for the control.  Resource
                   Workshop will use this value if, for example,
                   the control is created by dragging the icon
                   from the tool palette.  wHeight is in dialog
                   coordinates unless the most significant bit is
                   set, in which case the value is in pixels. For
                   example, a value of "32" is 32 in dialog
                   coordinates, but the value "32 | 0x8000" is in
                   pixels.

    wStyle         The default style Resource Workshop will use
                   to create the Window.  This is the key field
                   that you will use to distinguish one subtype
                   from another.

    szDescr        The description of the control subtype.  This
                   text is used by Resource Workshop to construct
                   a menu item that the user can use to create an
                   instance of your custom control.

    hToolBit       A handle to a bitmap which will be placed on
                   the tool palette.  Resource Workshop requires
                   the bitmap be a 22x22 black and gray bitmap
                   containing a 2-pixel border that is white on
                   the top and left and black on the bottom and
                   right. You can use the bitmaps contained in
                   BITBTN.RES as templates.

    hDropCurs      A cursor to be used while dragging the control
                   from the tool palette.


2.3      Style function
-----------------------

The Style function makes it possible for you to edit your custom
control. You must first create an appropriate dialog box in
Resource Workshop and then implement a Boolean function that
displays that dialog box. Resource Workshop calls this function
whenever you initiate a request to edit the custom control.
Resource Workshop passes the function a handle to the window that
is the parent of the dialog, a handle to memory containing the
RWCTLSTYLE structure, and two function variables for string
conversion.

Return value:

    If the user changes any options for the control, this
    function's return value is TRUE. If the user doesn't make any
    changes or if an error prevents changes, the return value is
    FALSE.

Syntax:

    BOOL CALLBACK Style( HWND hWnd, HGLOBAL hCtlStyle,
    LPFNSTRTOID lpfnStrToId, LPFNIDTOSTR lpfnIdToStr);

Parameters:

    hWnd           A handle to the parent window of the dialog
                   box displayed by this function.

    hCtlStyle      A handle to global memory containing the
                   RWCTLSTYLE structure to be edited.

    lpfnStrToId    A function variable that converts a string
                   into a control ID for the wId field of
                   RWCTLSTYLE. This allows the user to enter the
                   control ID using a constant identifier. This
                   routine evaluates the string as an expression,
                   returning the result.  The ID can be converted
                   back into a string by calling lpfnIdToStr.

    lpfnIdToStr    A function variable that converts the control
                   ID in the wId field of RWCTLSTYLE to a string
                   for editing. The ID can be converted back into
                   a word by calling lpfnStrToId. This function
                   variable allows the user to see the symbolic
                   constant that represents the control ID
                   instead of the word value.

Data structure:

    /*
     * CONTROL-STYLE DATA STRUCTURE
     *
     * The class style function uses this data structure
     * to set or reset various control attributes.
     *
     */

    typedef struct {
      UINT         wX;                  /* x origin of control */
      UINT         wY;                  /* y origin of control */
      UINT         wCx;                 /* width of control */
      UINT         wCy;                 /* height of control */
      UINT         wId;                 /* control child id */
      DWORD        dwStyle;             /* control style */
      char         szClass[CTLCLASS];   // name of control class
      char         szTitle[CTLTITLE];   /* control text */
      BYTE         CtlDataSize;         /* control data size */
      BYTE         CtlData[ CTLDATALENGTH]; /* control data */
    } RWCTLSTYLE;

    typedef RWCTLSTYLE *   PRWCTLSTYLE;
    typedef RWCTLSTYLE FAR *   LPRWCTLSTYLE;

    wX             The horizontal (X) location of the control in
                   dialog coordinates.

    wY             The vertical (Y) location of the control in
                   dialog coordinates.

    wCx            The width of the control in dialog
                   coordinates.

    wCy            The height of the control in dialog
                   coordinates.

    wId            The control's ID value.  This value must be
                   converted to a string by calling lpfnIdToStr
                   before being displayed for editing. It must be
                   converted back into a word for storage by
                   calling lpfnStrToId after editing.

    dwStyle        The style flags of the control.

    szClass        The class name of the control.

    szTitle        The title of the control.

    CtlDataSize    Windows allows controls in a resource file to
                   have up to 255 bytes of control-defined data.
                   This field indicates how much of that space is
                   being used by the control.  The data is stored
                   in CtlData.

    CtlData        This field holds up to 255 bytes of
                   control-specific data.  The amount used must
                   be recorded in the CtlDataSize field.  The use
                   of this data area is user-defined.

When you save your project, Resource Workshop saves the CtlData
array into the .RC or .RES file.

To enable a custom control to access this array from within your
program at run time, lParam of the WM_CREATE message points to a
CREATESTRUCT data structure. The CREATESTRUCT structure contains
a field, lpCreateParams, that is a pointer to the extra data you
stored in the CtlData array. If the pointer is NULL, there is no
CtlData.

The CtlDataSize variable is not available to your program. To
make the size data accessible to your program, the CtlData array
should either contain a fixed amount of data, or its first byte
should contain the length of the data.

The Style function first converts the ID to a string by passing
the numerical ID value to LPFNIDTOSTR. The Style function then
displays the string in the dialog box.

If the user changes the string that's returned by LPFNIDTOSTR,
the Style function verifies the string by passing it to
LPFNSTRTOID, which determines if the string is a valid constant
expression. If LPFNSTRTOID returns a zero in the LOWORD, the ID
is illegal and is displayed in the dialog box so the user can
change it to a valid ID. If LPFNSTRTOID is successful, it returns
a nonzero value in the LOWORD and the ID in the HIWORD.


2.4      Flags function
-----------------------

The Flags function is used by Resource Workshop to translate the
style of a control into text.  Resource Workshop inserts the text
into the .RC file being edited.  The function must only convert
the values unique to the control.  For example, if you were
creating a Flags function for the Windows button class, you would
only examine the lower sixteen bits of Flags and translate them
into one of the bs_XXXX constants.

Return value:

    Returns the number of bytes copied into the destination
    string. Returns 0 if the Flags word is not valid or the
    string exceeds MaxString in length.

Syntax:

    UINT CALLBACK Flags(DWORD dwFlags, LPSTR lpStyle, UINT
    wMaxString);

Parameters:

    dwFlags        The style of the control to be translated into
                   text.  This field is derived from the dwStyle
                   field of the RWCTLSTYLE structure passed to
                   the Style function variable.

    lpStyle        The location to write the translated
                   text.

    wMaxString     The maximum number of bytes the Flags function
                   can write into Style.


3        Pascal programming section
-----------------------------------

3.1      ListClasses function
-----------------------------

ListClasses is a programmer-implemented function that passes
information about the custom control classes back to Resource
Workshop. Exporting ListClasses marks your DLL as supporting this
custom control specification.

If ListClasses is present in the DLL, Resource Workshop calls the
function, passing information about itself along with two utility
function variables used in editing the custom control.

ListClasses should return a handle to global memory allocated by
calling GlobalAlloc.  The memory referenced by this handle holds
a record of type TCtlClassList, which describes the controls in
the library.  TCtlClassList is described later in this section.
The handle is freed by Resource Workshop and should not be freed
by the DLL.

Syntax:

    function ListClasses(AppName: PChar; Version: Word;
      Load: TLoad; Edit: TEdit): THandle; export;

Return value:

    Returns a handle to global memory containing a record of type
    TCtlClassList.

Parameters:

    AppName        The class name of the main window of the
                   calling application.  This value can be used
                   by the custom control to determine if it is
                   running under a resource editor. If AppName is
                   'rwswnd', the calling application is Resource
                   Workshop.

    Version        The version number of the calling application.
                   The major version is in the high-order byte
                   and the minor version in the low-order byte.
                   For example, version 1.02 is $0102.

    Load           A function variable that custom controls can
                   use to obtain the handle of a resource in the
                   project being edited by the calling
                   application (the equivalent of the Windows API
                   function LoadResource). The function takes two
                   parameters, a resource type name and a
                   resource name. The custom control is
                   responsible for freeing the global handle (if
                   any) returned by this function.

    Edit           A function variable that custom controls can
                   use to start a resource editor for any
                   resource in the project being edited by
                   Resource Workshop. The function takes two
                   parameters, a resource type name and a
                   resource name.

Return value records:

    PCtlClassList = ^TCtlClassList;
    TCtlClassList = record
      nClasses: Integer;           { Number of classes in list }
      Classes: array[0..0] of TRWCtlClass;     { Class list }
    end;

    TCtlClassList contains a variable number of TRWCtlClass
    records, the number of which is determined by the nClasses
    field.

    PRWCtlClass = ^TRWCtlClass;
    TRWCtlClass = record
      fnInfo:  TFnInfo;                       { Info function }
      fnStyle: TFnStyle;                      { Style function }
      fnFlags: TFnFlags;                      { Flags function }
      szClass: array[0..ctlClass-1] of Char;  { Class name }
    end;

    Each control class in the DLL must have a corresponding
    TRWCtlClass record in the TCtlClassList. The szClass field
    contains the name with which the class was registered. For
    example, if you called RegisterClass giving the class name as
    'MYBUTTON', szClass must be 'MYBUTTON'.

The function variables Info, Style, and Flags--which correspond
to the pointers TFnInfo, TFnStyle, and TFnFlags--are described in
the following sections.


3.2      Info function
----------------------

The Info function is called by Resource Workshop to retrieve
information about the control class, including the string to add
to the control menu and the bitmap to add to the tool palette.
The function returns a memory handle that can be allocated by
GlobalAlloc. This handle must refer to memory that contains a
TRWCtlInfo record.  Like ListClasses, the handle returned by Info
is freed by Resource Workshop and should not be freed by the DLL.
This function is called once by Resource Workshop upon loading
the DLL.

Syntax:

    function Info: Handle; export;

Return value:

    Returns a handle to global memory containing a record of type
    TRWCtlInfo.

Parameters:

    None.

Return value record:

    TRWCtlInfo has two parts:

    - A fixed-length part that provides information about the
      control class in general.

    - A variable-length array of records, with each record
      providing information about a particular type or subclass
      of the control.

    Each control class can include several control types. For
    example, Windows provides a BUTTON class that includes push
    buttons, radio buttons, and check boxes. This variety can be
    duplicated by your classes by providing two or more
    TRWCtlType records in the TRWCtlInfo record.

    The following is the declaration of TRWCtlInfo:

    PRWCtlInfo = ^TRWCtlInfo;
    TRWCtlInfo = record
      wVersion:   Word;           { control version }
      wCtlTypes:  Word;           { control types }
      szClass:    array[0..ctlClass-1] of Char;
                                  { control class name }
      szTitle:    array[0..ctlTitle-1] of Char;
                                  { control title }
      szReserved: array[0..9] of Char;
                                  { reserved for future use }
      ctType:     array[0..ctlTypes] of TRWCtlType;
                                  { control type list }
    end;

    wVersion       The version number of the custom control
                   library. The major version is in the
                   high-order byte and the minor version in the
                   low-order byte. For example, version 1.02 is
                   $0102. This field is not used by Resource
                   Workshop.

    wCtlTypes      The number of control sub-types defined in the
                   ctType array.

    szClass        The name of the class as registered with
                   Windows.  This is duplicated from the
                   TCtlClassList record to retain upward
                   compatiblity with the Windows custom control
                   specificiation.

    szReserved     Space reserved for future expansion.  Must be
                   cleared to null characters (#0).

    ctType         An array of sub-type description records of
                   type TRWCtlType.

    The following is the declaration of TRWCtlType:

    PRWCtlType = ^TRWCtlType;
    TRWCtlType = record
      wType:   Word;                         { type style }
      wWidth:  Word;                         { suggested width }
      wHeight: Word;                         { suggested height }
      dwStyle: LongInt;                      { default style }
      szDescr: array[0..ctlDescr-1] of Char; { menu name }
      hToolBit:  HBitmap;                    { toolbox bitmap }
      hDropCurs: HCursor;              { drag and drop cursor }
    end;

    wType          A user-defined value used to indicate the
                   sub-type of the control.  This value is not
                   used by Resource Workshop.

    wWidth         The default width for the control.  Resource
                   Workshop will use this value if, for example,
                   the control is created by dragging the icon
                   from the tool palette.  wWidth is in dialog
                   coordinates unless the most significant bit is
                   set, in which case the value is in pixels. For
                   example, a value of "32" is 32 in dialog
                   coordinates, but the value "32 or $8000" is in
                   pixels.

    wHeight        The default height for the control.  Resource
                   Workshop will use this value if, for example,
                   the control is created by dragging the icon
                   from the tool palette.  wHeight is in dialog
                   coordinates unless the most significant bit is
                   set, in which case the value is in pixels. For
                   example, a value of "32" is 32 in dialog
                   coordinates, but the value "32 or $8000" is in
                   pixels.

    wStyle         The default style Resource Workshop will use
                   to create the Window.  This is the key field
                   that you will use to distinguish one subtype
                   from another.

    szDescr        The description of the control subtype.  This
                   text is used by Resource Workshop to construct
                   a menu item that the user can use to create an
                   instance of your custom control.

    hToolBit       A handle to a bitmap which will be placed on
                   the tool palette.  Resource Workshop requires
                   the bitmap be a 22x22 black and gray bitmap
                   containing a 2-pixel border that is white on
                   the top and left and black on the bottom and
                   right. You can use the bitmaps contained in
                   BITBTN.RES as templates.

    hDropCurs      A cursor to be used while dragging the control
                   from the tool palette.


3.3      Style function
-----------------------

The Style function makes it possible for you to edit your custom
control. You must first create an appropriate dialog box in
Resource Workshop and then implement a Boolean function that
displays that dialog box. Resource Workshop calls this function
whenever you initiate a request to edit the custom control.
Resource Workshop passes the function a handle to the window that
is the parent of the dialog, a handle to memory containing the
TRWCtlStyle record, and two function variables for string
conversion.

Return value:

    The function must return true if the TRWCtlSytle record has
    been modified; otherwise, it must return false.

Syntax:

    function Style(Window: HWnd; CtlStyle: THandle; StrToId:
      TStrToId; IdToStr: TIdToStr): Bool; export;

Parameters:

    Window         A handle to the parent window of the dialog
                   box displayed by this function.

    CtlStyle       A handle to global memory containing the
                   TRWCtlStyle record to be edited.

    StrToId        A function variable that converts a string
                   into a control ID for the wId field of
                   TRWCtlStyle. This allows the user to enter the
                   control ID using a constant identifier. This
                   routine evaluates the string as an expression,
                   returning the result.  The ID can be converted
                   back into a string by calling IdToStr.

    IdToStr        A function variable that converts the control
                   ID in the wId field of TRWCtlStyle to a string
                   for editing. The ID can be converted back into
                   a word by calling StrToId. This function
                   variable allows the user to see the symbolic
                   constant that represents the control ID
                   instead of the word value.

CtlStyle record:

    The following is the record type referenced by the CtlStyle
    memory handle:

      PRWCtlStyle = ^TRWCtlStyle;
      TRWCtlStyle = record
        wX:   Word;               { x origin of control }
        wY:   Word;               { y origin of control }
        wCx:  Word;               { width of control }
        wCy:  Word;               { height of control }
        wId:  Word;               { control child id }
        dwStyle: LongInt;         { control style }
        szClass: array[0..ctlClass-1] of Char;
                                  { name of control class }
        szTitle: array[0..ctlTitle-1] of Char;
                                  { control text }
        CtlDataSize: Byte;        { control data size }
        CtlData: array[0..ctlDataLength-1] of Char;
                                  { control data }
      end;

      wX           The horizontal (X) location of the control in
                   dialog coordinates.

      wY           The vertical (Y) location of the control in
                   dialog coordinates.

      wCx          The width of the control in dialog
                   coordinates.

      wCy          The height of the control in dialog
                   coordinates.

      wId          The control's ID value.  This value must be
                   converted to a string by calling IdToStr
                   before being displayed for editing. It must be
                   converted back into a word for storage by
                   calling StrToId after editing.

      dwStyle      The style flags of the control.

      szClass      The class name of the control.

      szTitle      The title of the control.

      CtlDataSize  Windows allows controls in a resource file to
                   have up to 255 bytes of control-defined data.
                   This field indicates how much of that space is
                   being used by the control.  The data is stored
                   in CtlData.

      CtlData      This field holds up to 255 bytes of
                   control-specific data.  The amount used must
                   be recorded in the CtlDataSize field.  The use
                   of this data area is user-defined.

When you save your project, Resource Workshop saves the CtlData
array into the .RC or .RES file.

To enable a custom control to access this array from within your
program at run time, lParam of the WM_CREATE message points to a
CREATESTRUCT data structure. The CREATESTRUCT structure contains
a field, lpCreateParams, that is a pointer to the extra data you
stored in the CtlData array. If the pointer is nil, there is no
CtlData.

The CtlDataSize variable is not available to your program. To
make the size data accessible to your program, the CtlData array
should either contain a fixed amount of data, or its first byte
should contain the length of the data.

The Style function first converts the ID to a string by passing
the numerical ID value to IdToStr. The Style function then
displays the string in the dialog box.

If the user changes the string that's returned by IdToStr, the
Style function verifies the string by passing it to StrToId,
which determines if the string is a valid constant expression. If
StrToId returns a zero in the low word, the ID is illegal and is
displayed in the dialog box so the user can change it to a valid
ID. If StrToId is successful, it returns a nonzero value in the
low word and the ID in the high word.


3.4      Flags function
-----------------------

The Flags function is used by Resource Workshop to translate the
style of a control into text.  Resource Workshop inserts the text
into the .RC file being edited.  The function must only convert
the values unique to the control.  For example, if you were
creating a Flags function for the Windows button class, you would
only examine the lower sixteen bits of Flags and translate them
into one of the bs_XXXX constants.

Return value:

    Returns the number of bytes copied into the destination
    string. Returns 0 if the Flags word is not valid or the
    string exceeds MaxString in length.

Syntax:

    function Flags(Flags: LongInt; Style: PChar; MaxString:
      Word): Word;

  Parameters:

    Flags          The style of the control to be translated into
                   text.  This field is derived from the dwStyle
                   field of the TRWCtlStyle record passed to the
                   Style function variable.

    Style          The location to write the translated text.

    MaxString      The maximum number of bytes the Flags function
                   can write into Style.
                   

           ========= END OF FILE CUSTCNTL.RW =========
