Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

314 lines
11 KiB

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.