NOTE:  This DLL is the same as that shipped with the OLE 2.0 SDK
but is updated from that shipped with "The Windows Interface" book
from Microsoft Press.  It is now compatible with Windows NT.


----------


Changes in BTTNCUR.DLL Source Code and Documentation from Version 1.00b
to Version 1.1.  See also below for 1.00 to 1.00b changes.

BTTNCUR.DLL version 1.1 is now fully compatible and tested under Windows
3.0.  Previously the demo application crashed under Windows 3.0
on calls to the non-existent MoveToEx (Win32 compatible).  Version 1.1 only
uses MoveToEx for builds where the symbol WINVER < 0x030a.

Windows NT changes are surrounded by #ifdef WIN32.  The largest change
is the DLL entry point:  LibMain.  Both Win3.1 and Win32 versions
call FInitialize now.

The images have been updated slightly and are now provided for 72dpi
(ega), 96dpi (vga), and 120dpi (super vga)

Version 1.1 completely handles system color changes unlike version 1.00x.
This new version will dynamically convert black, light gray, dark gray,
and white pixels in the image bitmap into system colors set for the
button text, button shadow, button face, and button highlight, respectively.
If you have blue, red, yellow, and green button colors, BTTNCUR.DLL will
now work perfectly with all of them.

BTTNCUR.DLL Version 1.1 also supports color images better by allowing
you to control which colors in the image bitmap are converted to system
colors.  By default, any black, gray, or white colors are converted
into system button colors as decribed in the last paragraph.  BTTNCUR.H
defines new PRESERVE_* flags for each of the four colors that are liable
to be converted.  By specifing one or more flags you prevent BTTNCUR
from changing that color to a system color.  For example, if you
want to preserve all black pixels in your image, specify PRESERVE_BLACK
when calling UIToolButtonDraw.

Applications should obtain configuration data for the current display
through UIToolConfigureForDisplay.  With this data the application can
configure itself for the correct toolbar size and button sizes and load
the appropriate application supplied bitmaps.

Applications using UIToolConfigureForDisplay should now use
UIToolButtonDrawTDD instead of UIToolButtonDraw, passing one extra
parameter, a pointer to the TOOLDISPLAYDATA.  Applications that
still call UIToolButtonDraw will always use 96dpi.


------------------------
BTTNCUR.H changes
    Added PRESERVE_ flags to allow application to control color conversions
    from black, dark gray, light gray, and white into the
    file compatible with C++.

    Added prototype for UIToolConfigureForDisplay, TOOLDISPLAYDATA structure,
    and definitions for button and image sizes on 72dpi, 96dpi, and 120dpi.

------------------------
BTTNCUR.RCV version changes
    FILEVERSION and PRODUCTVERSION changed from 1,0,0,2 to 1,0,1,0

    VALUE "FileVersion" and VALUE "ProductVersion" changed from
        "1.00b\0","\0" to "1.1\0","\0"


------------------------
BTTNCURI.H changes
    Defined STDCOLOR_* values as indices into an array in BTTNCUR.C
    that holds hard-coded default button color that never change
    regardless of the system colors.  Also defined SYSCOLOR_*
    flags that matched STDCOLOR_* flags for uniform array indices.

    Removed NEAR, FAR, and PASCAL from any function that didn't need it
    so we can port to Windows NT cleanly.

------------------------
BTTNCUR.C source code changes.  There are significant modifications.

Overall:
    Updated header comment

    Removed NEAR, FAR, and PASCAL from any function that didn't need it
    so we can port to Windows NT cleanly.

Globals:
    Eliminated the COLORREFs prefixed with RGB.  Only a few are needed
    statically and were moved to HBrushDitherCreate.

    Also added an array of standard colors used in the standard images:

    static const
    COLORREF crStandard[4]={ RGB(0, 0, 0)         //STDCOLOR_BLACK
                           , RGB(128, 128, 128)   //STDCOLOR_DKGRAY
                           , RGB(192, 192, 192)   //STDCOLOR_LTGRAY
                           , RGB(255, 255, 255)}; //STDCOLOR_WHITE

    Added an array of standard images instead of just 96dpi versions.

UIToolConfigureForDisplay:
    Added function to return the resolution of the display and
    size information about button and image sizes.


ToolButtonInit():
    Call to CreatePatternBrush moved into HBrushDitherCreate.
    Conditionally sets the highlight color for HDitherBrushCreate
    depending on Windows 3.x or Windows 3.0 (3.0 did not support
    COLOR_BTNHIGHLIGHT).


ToolButtonFree():
    Removed some old debug output no longer useful.


HDitherBitmapCreate()
    Renamed to HBrushDitherCreate.
    Moved CreatePatterBrush code from ToolButtonInit into this
    function.

    To support changing system colors, this function maintains
    static variables for the face and highlight colors that we
    use to create the brush.  If the function is called and the
    current colors in the global hBrushDither are different than
    the system colors, we recreate the brush and update the global
    hBrushDither, deleting the old brush.  Otherwise we just return
    hBrushDither.

    Note that if we fail to create the new brush we just maintain
    the old.  We'll paint something, albeit not in the right colors,
    but something nontheless.


UIToolButtonDraw():
    Calls UIToolButtonDrawTDD with default display configuration.

UIToolButtonDrawTDD():
    This is the function that was overhauled the most, specifically
    to handle variable colors.

    First, we added several local variables of which two are important.
    crSys is an array of system colors for the text, shadow, face,
    highlight, and frame, declared as static to keep references to
    it off DS instead of SS; if it's in SS things will crash.  The second
    important variable is uColor, which receives the color preservation
    flags passed in the hibyte of the uState parameter to UIToolButtonDraw.

    All the code to draw a blank button outline was moved into a separate
    function DrawBlankButton.  Since this procedure needs all the system
    colors to do it's thing, I've set it up to take an array of five
    COLORREFs (exactly crSys) in which it stores those color (it also
    uses it as its color variables).  This way we only have to call
    GetSysColor once for each system color.

    Anything dealing with the dithered brush is moved to the
    BUTTONGROUP_LIGHTFACE case where we just get the current brush
    by calling HBrushDitherCreate, passing it the current face
    and highlight colors.  Remember that is these colors match those
    used in the currently held global hBrushDither, this function just
    returns that global, so it's quite fast.  We have to be very careful
    not to delete this brush where we're done with it since it is global.

    The largest amount of new code is under the line:

    if ((uState & BUTTONGROUP_ACTIVE) && !(uState & BUTTONGROUP_BLANK))

    This has changed from a single BitBlt call to a much more complex
    operation to handle specific color conversions and preservations.
    A little optimization was done to detect when the system colors
    for buttons match the defaults, that is, black, dark gray, light gray,
    and white for text, shadow, face, and highlight.  If these colors
    all match, or if the caller requested preservation of all colors,
    the we just do the single BitBlt of old.

    Otherwise we loop through each of the black/white/gray colors
    that need possible conversion.  For each one we create a mask
    that contains 1's where the converting color exists in the image
    and 0's everywhere else.  For each color then we BitBlt the
    mask, a brush matching the system color we're converting to,
    and the destination bitmap (which we initialize with the unmodified
    image itself) using ROP_DSPDxax.  This leaves any color but the
    one under conversion alone and replaces the converted color with
    the system color.

    If the caller set a specific flag to preserve one or more specific
    colors, then we replace the standard color with the standard color,
    resulting in a no-op.

    Finally, to reduce flicker for this four Blt operation we create
    and build the final image in a temporary bitmap, making it 6 total
    Blts to handle the color changes.  But since we optimized for the
    99% case where the system colors are the standard colors, this isn't
    too much of a consideration.

    color conversions.


DrawBlankButton():
    New internal function.  Moved code from UIToolButtonDraw here.




------------------------
CURSORS.C
    Updated header comment

    Removed PASCAL on both internal functions.


    CursorsFree
        Eliminated all the code inside this function as it was unnecessary.

    UICursorLoad
        Eliminated code to revalidate a cursor in the array.  Unnecessary.


------------------------
BCDEMO.C

    Tested for running under Windows 3.0 and avoided MoveToEx calls,
    using MoveTo instead.  Calling MoveToEx in a Windows 3.1 app
    marked as 3.0 compatible under 3.0 causes an unknown GP fault.

    Uses UIToolButtonConfigureForDisplay and UIToolButtonDrawTDD.


------------------------------------------------------------------------------

Changes in BTTNCUR.DLL Source Code and Documentation from Version 1.00
to Version 1.00b

------------------------
BTTNCUR.H changes
    Added #ifdef __cplusplus to include extern "C" making the
    file compatible with C++.


------------------------
BTTNCURI.H changes
    Added #ifdef __cplusplus to include extern "C" making the
    file compatible with C++.

    Removed code contained between a #ifdef NEVER that is unused.


------------------------
BTTNCUR.RCV version changes
    FILEVERSION and PRODUCTVERSION changed from 1,0,0,0 to 1,0,0,2

    VALUE "FileVersion" and VALUE "ProductVersion" changed from
        "1.00\0","\0" to "1.00b\0","\0"


------------------------
BTTNCUR.C source code changes.

    Added a global for the frame color
    static COLORREF rgbFrame   =RGB(0, 0, 0);

WEP():
    Added comment about resource cleanup messages in DEBUG mode.


ToolButtonInit():
    Added the line below just before the assignment of hDCGlyphs:

        rgbFrame=GetSysColor(COLOR_WINDOWFRAME);

    This insures that the frame color is properly shown on plasma
    displays.


ToolButtonFree():
    Added the following lines just before return:

        if (NULL!=hBmpStandardImages)
            DeleteObject(hBmpStandardImages);
        hBmpStandardImages=NULL;


UIToolButtonDraw():
    The image centering is one too high.  The line 

        yOffsetGlyph=((dy-bmy) >> 1)-1;

    now reads:
   
        yOffsetGlyph=(dy-bmy) >> 1;


    The declaration HBITMAP hBmp; now read HBITMAP hBmp=NULL;

    The line hBmpT=SelectObject(hDCGlyphs, hBmp); is now two:

        if (NULL!=hBmp)
            SelectObject(hDCGlyphs, hBmp);

    The line SelectObject(hDCGlyphs, hBmpT); is now two:

        if (NULL!=hBmpT)
            SelectObject(hDCGlyphs, hBmpT);



------------------------
BTTNCUR.BMP
    Fixed the images to be 16*15 (the standard) instead of 16*16
    as they originally were.  Changed the label "16x16" to "16x15".

    Copied an image of the disabled state of Context-Sensitive Help
    to this bitmap as it was previously missing.
