745 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			745 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
//
 | 
						|
// ALGAUGE.CPP
 | 
						|
//
 | 
						|
//  Source file for ArchiveLib 2.0
 | 
						|
//
 | 
						|
//  Copyright (c) Greenleaf Software, Inc. 1994-1996
 | 
						|
//  All Rights Reserved
 | 
						|
//
 | 
						|
// CONTENTS
 | 
						|
//
 | 
						|
//  class ALGauge
 | 
						|
//  ALGauge::ALGauge()
 | 
						|
//  int ALGaugeInit()
 | 
						|
//  void ALGauge::gaugePaint()
 | 
						|
//  long ForceRepaint()
 | 
						|
//  gaugeWndProc()
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  This file contains all of the source code for the ALGauge object included
 | 
						|
//  in this library.  This is not really a part of ArchiveLib, it is
 | 
						|
//  included strictly for the purposes of demos.  This code is directly
 | 
						|
//  derived from code that Microsoft posted on CIS.
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//  May 20, 1994  1.0A  : First release
 | 
						|
//
 | 
						|
//  July 11, 1994 1.0B  : Modified the callback function to use AL_EXPORT
 | 
						|
//                        instead of _export.  This lets me build this
 | 
						|
//                        properly under NT.
 | 
						|
//
 | 
						|
//   February 14, 1996  2.0A : New release
 | 
						|
//
 | 
						|
 | 
						|
#include "arclib.h"
 | 
						|
#if !defined( AL_IBM )
 | 
						|
#pragma hdrstop
 | 
						|
#endif
 | 
						|
 | 
						|
#define STRICT
 | 
						|
#include <windows.h>
 | 
						|
#include "algauge.h"
 | 
						|
 | 
						|
//
 | 
						|
// class ALGauge
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  This class is confined entirely to this file. To use this control,
 | 
						|
//  you need to call the initialization routine.  The initialization
 | 
						|
//  routine registers the gauge class.  Whenever a new gauge object
 | 
						|
//  is created, a WM_CREATE message is sent to the window procedure.
 | 
						|
//  WM_CREATE then creates an instance of ALGauge.  The ALGauge
 | 
						|
//  object keeps track of everything about the particular gauge.
 | 
						|
//  The user of the gauge doesn't get to see this class, since his or her
 | 
						|
//  interface to the object goes strictly through messages to the 
 | 
						|
//  object.  
 | 
						|
//
 | 
						|
// DATA MEMBERS
 | 
						|
//
 | 
						|
//   static dwDefaultTextColor
 | 
						|
//   static dwDefaultBackgroundColor
 | 
						|
//                              When a new ALGauge object is created, it
 | 
						|
//                              is assigned these colors.  In theory, you
 | 
						|
//                              can change these colors later with the
 | 
						|
//                              right message.
 | 
						|
//
 | 
						|
//   static szClassName         One instance of the class name.
 | 
						|
//
 | 
						|
//   static iRegistered         This guy is used to keep track of whether
 | 
						|
//                              the class has been registered with Windows.
 | 
						|
//
 | 
						|
//   iRange                     The range of a gauge is normally 100, meaning
 | 
						|
//                              it can have a value ranging from 0 to 100.
 | 
						|
//
 | 
						|
//   iPosition                  The current position of the gauge, normally
 | 
						|
//                              set between 0 and iRange.
 | 
						|
//
 | 
						|
//   iOrientation               This is set to one of four possible
 | 
						|
//                              enumerated constants, indication which
 | 
						|
//                              way the gauge fills, left to right,
 | 
						|
//                              top to bottom, bottom to top, or right
 | 
						|
//                              to left.
 | 
						|
//
 | 
						|
//   hFont                      The font that that text will be displayed
 | 
						|
//                              in.
 | 
						|
//
 | 
						|
//   dwTextColor                The color the text will be displayed in.
 | 
						|
//
 | 
						|
//   dwBackgroundColor          The background color of the box.
 | 
						|
//
 | 
						|
// MEMBER FUNCTIONS
 | 
						|
//
 | 
						|
//   ALGauge()                  The constructor.  The end user never
 | 
						|
//                              gets to call this dude.
 | 
						|
//
 | 
						|
//   gaugePaint()               This guy gets called from WM_PAINT.
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//  May 20, 1994  1.0A  : First release
 | 
						|
//
 | 
						|
//   February 14, 1996  2.0A : New release
 | 
						|
//
 | 
						|
 | 
						|
// I'm not entirely sure why we need the _far declaration on the class.
 | 
						|
// Watcom doesn't like it, so I am trying it without.  Since the
 | 
						|
// pointer is a far  pointer anyway, shouldn't this work without the
 | 
						|
// _far type modifier on the class?
 | 
						|
 | 
						|
#if defined( AL_WATCOM ) || defined( AL_FLAT_MODEL )
 | 
						|
class ALGauge {  /* Tag protected class */
 | 
						|
#else
 | 
						|
class _far ALGauge {
 | 
						|
#endif
 | 
						|
    public :
 | 
						|
        ALGauge();
 | 
						|
        void gaugePaint( HWND hwnd );
 | 
						|
        static DWORD dwDefaultTextColor;
 | 
						|
        static DWORD dwDefaultBackgroundColor;
 | 
						|
        static char *szClassName;
 | 
						|
        static int iRegistered;
 | 
						|
        int iRange;
 | 
						|
        int iPosition;
 | 
						|
        ALGaugeOrientation iOrientation;
 | 
						|
        HFONT hFont;
 | 
						|
        DWORD dwTextColor;
 | 
						|
        DWORD dwBackgroundColor;
 | 
						|
};
 | 
						|
 | 
						|
//
 | 
						|
// The static variables for class ALGauge
 | 
						|
//
 | 
						|
DWORD ALGauge::dwDefaultTextColor = 0;
 | 
						|
DWORD ALGauge::dwDefaultBackgroundColor = 0;
 | 
						|
int ALGauge::iRegistered = 0;
 | 
						|
char * ALGauge::szClassName = "ALGauge";
 | 
						|
 | 
						|
/* internal function prototypes */
 | 
						|
LONG AL_EXPORT CALLBACK gaugeWndProc( HWND, UINT, WPARAM, LPARAM );
 | 
						|
 | 
						|
//
 | 
						|
// NAME
 | 
						|
//
 | 
						|
//  ALGauge::ALGauge()
 | 
						|
//
 | 
						|
// PLATFORMS/ENVIRONMENTS
 | 
						|
//
 | 
						|
//  Windows
 | 
						|
//  C++
 | 
						|
//
 | 
						|
// SHORT DESCRIPTION
 | 
						|
//
 | 
						|
//  Constructor for an ALGauge object.
 | 
						|
//
 | 
						|
// C++ SYNOPSIS
 | 
						|
//
 | 
						|
//  #include "arclib.h"
 | 
						|
//  #include "algauge.h"
 | 
						|
//
 | 
						|
//  ALGauge::ALGauge();
 | 
						|
//
 | 
						|
// C SYNOPSIS
 | 
						|
//
 | 
						|
//  None, this is an internal C++ function.
 | 
						|
//
 | 
						|
// VB SYNOPSIS
 | 
						|
//
 | 
						|
//  None, this is an internal C++ function.
 | 
						|
//
 | 
						|
// DELPHI SYNOPSIS
 | 
						|
//
 | 
						|
//  None, this is an internal C++ function.
 | 
						|
//
 | 
						|
// ARGUMENTS
 | 
						|
//
 | 
						|
//  None.
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  The constructor is called from the WndProc when the window is first
 | 
						|
//  created.  By initializing the member variables, we are all set for
 | 
						|
//  the WM_PAINT.
 | 
						|
//
 | 
						|
//  Please be sure to keep track of the fact that objects of class ALGauge
 | 
						|
//  are strictly for internal use by ArchiveLib.  If you want to use an
 | 
						|
//  ALGauge object, your ownly interface is through your Resource Editor
 | 
						|
//  and the initialization function.  In reality, the class is simply a
 | 
						|
//  handy place to hold a bunch of data regarding the gauge window.
 | 
						|
//
 | 
						|
// RETURNS
 | 
						|
//
 | 
						|
//  Nothing.
 | 
						|
//
 | 
						|
// EXAMPLE
 | 
						|
//
 | 
						|
// SEE ALSO
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   February 14, 1996  2.0A : New release
 | 
						|
//
 | 
						|
 | 
						|
ALGauge::ALGauge()  /* Tag protected function */
 | 
						|
{
 | 
						|
    iRange = 100;
 | 
						|
    iPosition = 0;
 | 
						|
    iOrientation = ALGaugeOrientLeftToRight;
 | 
						|
    dwTextColor = dwDefaultTextColor;
 | 
						|
    dwBackgroundColor = dwDefaultBackgroundColor;
 | 
						|
}
 | 
						|
 | 
						|
//
 | 
						|
// NAME
 | 
						|
//
 | 
						|
//  ALGaugeInit()
 | 
						|
//
 | 
						|
// PLATFORMS/ENVIRONMENTS
 | 
						|
//
 | 
						|
//  Windows
 | 
						|
//  C++  C
 | 
						|
//
 | 
						|
// SHORT DESCRIPTION
 | 
						|
//
 | 
						|
//  Initialize an ArchiveLib ALGuage object.
 | 
						|
//
 | 
						|
// C++ SYNOPSIS
 | 
						|
//
 | 
						|
//  #include "arclib.h"
 | 
						|
//  #include "algauge.h"
 | 
						|
//
 | 
						|
//  extern "C"
 | 
						|
//  int ALGaugeInit( HINSTANCE hInstance,
 | 
						|
//                   HINSTANCE hPrevInstance );
 | 
						|
//
 | 
						|
// C SYNOPSIS
 | 
						|
//
 | 
						|
//  #include "arclib.h"
 | 
						|
//  #include "algauge.h"
 | 
						|
//
 | 
						|
//  int ALGaugeInit( HINSTANCE hInstance,
 | 
						|
//                   HINSTANCE hPrevInstance );
 | 
						|
//
 | 
						|
// VB SYNOPSIS
 | 
						|
//
 | 
						|
//  None, can't drop controls on a VB form.
 | 
						|
//
 | 
						|
// DELPHI SYNOPSIS
 | 
						|
//
 | 
						|
//  None, don't know how to integrate an ALGauge object into Delphi.
 | 
						|
//
 | 
						|
// ARGUMENTS
 | 
						|
//
 | 
						|
//  hInstance  :    The instance handle of the running program, as was
 | 
						|
//                  passed to WinMain()
 | 
						|
//
 | 
						|
//  hPrevInstance : The previous instance handle.  See my comments
 | 
						|
//                  about this below.  A non-zero value here keeps
 | 
						|
//                  me from attempting to register the class.
 | 
						|
//
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  This function is the only function you have to call to initialize
 | 
						|
//  the ALGauge objects.  It registers the class and sets up the
 | 
						|
//  WndProc for this type of object.  This code is for the most
 | 
						|
//  part either a copy of or closely related to the original Microsoft
 | 
						|
//  code on CIS.
 | 
						|
//
 | 
						|
//  Looking over this function right now, while I am documenting it, I can
 | 
						|
//  see that I probably shouldn't be dinking with the hPrevInstance
 | 
						|
//  parameter.  The standalone program that demonstrated this class
 | 
						|
//  would have used that to prevent itself from registering twice.
 | 
						|
//  At least when inside the DLL, I prevent that by checking the
 | 
						|
//  iRegistered member.
 | 
						|
//
 | 
						|
// RETURNS
 | 
						|
//
 | 
						|
//  1 for success, 0 for failure.
 | 
						|
//
 | 
						|
// EXAMPLE
 | 
						|
//
 | 
						|
// SEE ALSO
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   February 14, 1996  2.0A : New release
 | 
						|
//
 | 
						|
 | 
						|
extern "C" AL_LINKAGE int AL_FUNCTION
 | 
						|
ALGaugeInit( HINSTANCE hInstance,  /* Tag public function */
 | 
						|
             HINSTANCE hPrevInstance )
 | 
						|
{
 | 
						|
    WNDCLASS wc;
 | 
						|
    HDC hdc;
 | 
						|
 | 
						|
    if ( ALGauge::iRegistered )
 | 
						|
        return 1;
 | 
						|
 | 
						|
    if ( hPrevInstance == 0 ) {
 | 
						|
        wc.hCursor          = LoadCursor( NULL, IDC_ARROW );
 | 
						|
        wc.hIcon            = NULL;
 | 
						|
        wc.lpszMenuName     = NULL;
 | 
						|
        wc.lpszClassName    = ALGauge::szClassName;
 | 
						|
        wc.hbrBackground    = (HBRUSH) (COLOR_WINDOW + 1);
 | 
						|
        wc.hInstance        = hInstance;
 | 
						|
#ifdef AL_BUILDING_DLL
 | 
						|
        wc.style            = CS_GLOBALCLASS | CS_HREDRAW | CS_VREDRAW;
 | 
						|
#else
 | 
						|
        wc.style            = CS_HREDRAW | CS_VREDRAW;
 | 
						|
#endif
 | 
						|
        wc.lpfnWndProc      = (WNDPROC) gaugeWndProc;
 | 
						|
        wc.cbClsExtra       = 0;
 | 
						|
#if defined ( AL_WATCOM ) || defined( AL_FLAT_MODEL )
 | 
						|
        wc.cbWndExtra       = sizeof( ALGauge * );
 | 
						|
#else
 | 
						|
        wc.cbWndExtra       = sizeof( ALGauge _far * );
 | 
						|
#endif
 | 
						|
        if ( !RegisterClass( &wc ) )
 | 
						|
            return 0;
 | 
						|
    }
 | 
						|
    hdc = CreateIC( "DISPLAY", NULL, NULL, NULL );
 | 
						|
    if ( !hdc ) {
 | 
						|
        UnregisterClass( ALGauge::szClassName, hInstance );
 | 
						|
        return 0;
 | 
						|
    }
 | 
						|
//
 | 
						|
// Select colors based on whether this is mono or color
 | 
						|
//
 | 
						|
    if ( GetDeviceCaps( hdc, BITSPIXEL ) == 1 &&
 | 
						|
         GetDeviceCaps( hdc, PLANES ) == 1 ) {
 | 
						|
        ALGauge::dwDefaultTextColor = RGB(255, 255, 255);
 | 
						|
        ALGauge::dwDefaultBackgroundColor = RGB(0, 0, 0);
 | 
						|
    } else {
 | 
						|
        ALGauge::dwDefaultTextColor = RGB(0, 0, 255);
 | 
						|
        ALGauge::dwDefaultBackgroundColor = RGB(255, 255, 255);
 | 
						|
    }
 | 
						|
    DeleteDC(hdc);
 | 
						|
    return ( ALGauge::iRegistered = 1);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
//
 | 
						|
// NAME
 | 
						|
//
 | 
						|
//  ALGauge::gaugePaint()
 | 
						|
//
 | 
						|
// PLATFORMS/ENVIRONMENTS
 | 
						|
//
 | 
						|
//  Windows
 | 
						|
//  C++
 | 
						|
//
 | 
						|
// SHORT DESCRIPTION
 | 
						|
//
 | 
						|
//  Interna
 | 
						|
//
 | 
						|
// C++ SYNOPSIS
 | 
						|
//
 | 
						|
//  #include "arclib.h"
 | 
						|
//  #include "algauge.h"
 | 
						|
//
 | 
						|
//  void ALGauge::gaugePaint( HWND hwnd );
 | 
						|
//
 | 
						|
// C SYNOPSIS
 | 
						|
//
 | 
						|
//  None, this is an internal support routine for ALGauge objects.
 | 
						|
//
 | 
						|
// VB SYNOPSIS
 | 
						|
//
 | 
						|
//  None, this is an internal support routine for ALGauge objects.
 | 
						|
//
 | 
						|
// DELPHI SYNOPSIS
 | 
						|
//
 | 
						|
//  None, this is an internal support routine for ALGauge objects.
 | 
						|
//
 | 
						|
// ARGUMENTS
 | 
						|
//
 | 
						|
//  hwnd        :  The handle of the control hat is being painted.
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  This guy is called when the window gets a WM_PAINT message.  How
 | 
						|
//  does that work when this is a member function?  Easy, when the
 | 
						|
//  window was created, we made a new ALGauge object, and stored its
 | 
						|
//  address in the window long word.
 | 
						|
//
 | 
						|
//  This is mostly Microsoft code.  I worked it over a little bit to
 | 
						|
//  get it to work with the ALGauge class, instead of using a bunch
 | 
						|
//  of static variables.  I had to muck with it a little bit more to
 | 
						|
//  get it to work with Win32s instead of Win16, but that was an easy bit.
 | 
						|
//
 | 
						|
//
 | 
						|
// RETURNS
 | 
						|
//
 | 
						|
//  Nothing.
 | 
						|
//
 | 
						|
// EXAMPLE
 | 
						|
//
 | 
						|
// SEE ALSO
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   February 14, 1996  2.0A : New release
 | 
						|
//
 | 
						|
 | 
						|
void
 | 
						|
ALGauge::gaugePaint( HWND hwnd )  /* Tag protected function */
 | 
						|
{
 | 
						|
    RECT rc1;
 | 
						|
    RECT rc2;
 | 
						|
    HFONT hLastFont;
 | 
						|
    PAINTSTRUCT ps;
 | 
						|
    char ach[ 6 ];
 | 
						|
 | 
						|
    BeginPaint( hwnd, &ps);
 | 
						|
    HDC hdc = ps.hdc;
 | 
						|
    SetTextColor( hdc, dwTextColor );
 | 
						|
    SetBkColor( hdc, dwBackgroundColor );
 | 
						|
    hLastFont = (HFONT) SelectObject( hdc, hFont );
 | 
						|
 | 
						|
    /* draw black rectangle for gauge */
 | 
						|
    GetClientRect(hwnd, &rc1);
 | 
						|
    FrameRect( hdc, &rc1, (HBRUSH) GetStockObject( BLACK_BRUSH ) );
 | 
						|
    InflateRect( &rc1, -2, -2 );
 | 
						|
    rc2 = rc1;
 | 
						|
 | 
						|
    /* get the range and position, make sure they are valid */
 | 
						|
    if ( iRange <= 0 )
 | 
						|
        iRange = 1;
 | 
						|
    if ( iPosition > iRange )
 | 
						|
        iPosition = iRange;
 | 
						|
    else if ( iPosition < 0 )
 | 
						|
        iPosition = 0;
 | 
						|
 | 
						|
    /* compute the actual size of the gauge */
 | 
						|
    int dx = rc1.right - rc1.left;
 | 
						|
    int dy = rc1.bottom - rc1.top;
 | 
						|
    int wGomerX = (WORD)((DWORD)iPosition * dx / iRange );
 | 
						|
    int wGomerY = (WORD)((DWORD)iPosition * dy / iRange );
 | 
						|
 | 
						|
    /* get the orientation and mung rects accordingly */
 | 
						|
    switch ( iOrientation ) {
 | 
						|
        case ALGaugeOrientRightToLeft :
 | 
						|
            rc1.left = rc2.right = (short int ) ( rc1.right - wGomerX );
 | 
						|
            break;
 | 
						|
        case ALGaugeOrientBottomToTop :
 | 
						|
            rc1.top = rc2.bottom = (short int) ( rc1.bottom - wGomerY );
 | 
						|
            break;
 | 
						|
        case ALGaugeOrientTopToBottom :
 | 
						|
            rc1.bottom = rc2.top += wGomerY;
 | 
						|
            break;
 | 
						|
        case ALGaugeOrientLeftToRight :
 | 
						|
        default:
 | 
						|
            rc1.right = rc2.left += wGomerX;
 | 
						|
            break;
 | 
						|
    } /* switch () */
 | 
						|
 | 
						|
    /* select the correct font */
 | 
						|
 | 
						|
    /* build up a string to blit out--ie the meaning of life: "42%" */
 | 
						|
    wsprintf(ach, "%3d%%", (WORD)((DWORD) iPosition * 100 / iRange ) );
 | 
						|
    SIZE size;
 | 
						|
    GetTextExtentPoint( hdc, ach, wGomerX = lstrlen(ach), &size );
 | 
						|
    /*  Draw the finished (ie the percent done) side of box.  If
 | 
						|
     *  ZYZG_WW_POSITION is 42, (in range of 0 to 100) this ExtTextOut
 | 
						|
     *  draws the meaning of life (42%) bar.
 | 
						|
     */
 | 
						|
 | 
						|
    ExtTextOut( hdc, (short int) (( dx - size.cx ) / 2 + 1 ), // 1 for the fram
 | 
						|
                     (short int ) (( dy - size.cy ) / 2 + 1 ),
 | 
						|
                     ETO_OPAQUE | ETO_CLIPPED, &rc2, ach, (short int) wGomerX, NULL);
 | 
						|
    /*  Reverse fore and back colors for drawing the undone (ie the non-
 | 
						|
     *  finished) side of the box.
 | 
						|
     */
 | 
						|
    SetBkColor( hdc, dwTextColor );
 | 
						|
    SetTextColor( hdc, dwBackgroundColor );
 | 
						|
    ExtTextOut( hdc,
 | 
						|
                (short int) (( dx - size.cx ) / 2 + 1), // 1 for the frame
 | 
						|
                (short int) (( dy - size.cy ) / 2 + 1),
 | 
						|
                ETO_OPAQUE | ETO_CLIPPED,
 | 
						|
                &rc1,
 | 
						|
                ach,
 | 
						|
                (short int) wGomerX,
 | 
						|
                NULL );
 | 
						|
    SelectObject( hdc, hLastFont );
 | 
						|
    EndPaint( hwnd, &ps );
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
//
 | 
						|
// NAME
 | 
						|
//
 | 
						|
//  ForceRepaint()
 | 
						|
//
 | 
						|
// PLATFORMS/ENVIRONMENTS
 | 
						|
//
 | 
						|
//  Windows
 | 
						|
//  C++
 | 
						|
//
 | 
						|
// SHORT DESCRIPTION
 | 
						|
//
 | 
						|
//  Forces a repaint on the given window.
 | 
						|
//
 | 
						|
// C++ SYNOPSIS
 | 
						|
//
 | 
						|
//  #include "arclib.h"
 | 
						|
//  #include "algauge.h"
 | 
						|
//
 | 
						|
//  long ForceRepaint( HWND hwnd );
 | 
						|
//
 | 
						|
// C SYNOPSIS
 | 
						|
//
 | 
						|
//  None, this is an internal support routine for ALGauge objects.
 | 
						|
//
 | 
						|
// VB SYNOPSIS
 | 
						|
//
 | 
						|
//  None, this is an internal support routine for ALGauge objects.
 | 
						|
//
 | 
						|
// DELPHI SYNOPSIS
 | 
						|
//
 | 
						|
//  None, this is an internal support routine for ALGauge objects.
 | 
						|
//
 | 
						|
// ARGUMENTS
 | 
						|
//
 | 
						|
//  hwnd  :  The handle of the bar gauge control.
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  Several of the messages that can be sent to the gauge control change
 | 
						|
//  things enough that we want to repaint.  Those routines can call
 | 
						|
//  this guy to force it to happen.
 | 
						|
//
 | 
						|
// RETURNS
 | 
						|
//
 | 
						|
//  0L, always.  So what is the point of having a return?  Not sure,
 | 
						|
//  I was just copying it.
 | 
						|
//
 | 
						|
// EXAMPLE
 | 
						|
//
 | 
						|
// SEE ALSO
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   February 14, 1996  2.0A : New release
 | 
						|
//
 | 
						|
 | 
						|
long
 | 
						|
ForceRepaint( HWND hwnd )  /* Tag protected function */
 | 
						|
{
 | 
						|
    RECT rc;
 | 
						|
 | 
						|
    GetClientRect(hwnd, &rc);
 | 
						|
    InflateRect( &rc, ~1, ~1 );
 | 
						|
    InvalidateRect( hwnd, &rc, FALSE );
 | 
						|
    UpdateWindow( hwnd );
 | 
						|
    return 0L;
 | 
						|
}
 | 
						|
 | 
						|
//
 | 
						|
// NAME
 | 
						|
//
 | 
						|
//  gaugeWndProc()
 | 
						|
//
 | 
						|
// PLATFORMS/ENVIRONMENTS
 | 
						|
//
 | 
						|
//  Windows
 | 
						|
//  C++
 | 
						|
//
 | 
						|
// SHORT DESCRIPTION
 | 
						|
//
 | 
						|
//  The Windows procedure for ALGauge controls.
 | 
						|
//
 | 
						|
// C++ SYNOPSIS
 | 
						|
//
 | 
						|
//  #include "arclib.h"
 | 
						|
//  #include "algauge.h"
 | 
						|
//
 | 
						|
//  LONG gaugeWndProc( HWND hwnd,
 | 
						|
//                     UINT uMsg,
 | 
						|
//                     WPARAM wParam,
 | 
						|
//                     LPARAM lParam );
 | 
						|
//
 | 
						|
// C SYNOPSIS
 | 
						|
//
 | 
						|
//  None, this is an internal support routine for ALGauge objects.
 | 
						|
//
 | 
						|
// VB SYNOPSIS
 | 
						|
//
 | 
						|
//  None, this is an internal support routine for ALGauge objects.
 | 
						|
//
 | 
						|
// DELPHI SYNOPSIS
 | 
						|
//
 | 
						|
//  None, this is an internal support routine for ALGauge objects.
 | 
						|
//
 | 
						|
// ARGUMENTS
 | 
						|
//
 | 
						|
//  hwnd       :  Standard argument for Windows procedure
 | 
						|
//
 | 
						|
//  uMsg       :  Standard argument for Windows procedure
 | 
						|
//
 | 
						|
//  wParam     :  Standard argument for Windows procedure
 | 
						|
//
 | 
						|
//  lParam     :  Standard argument for Windows procedure
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  This is the windows procedure for the ALGauge class.  In the
 | 
						|
//  demos for ArchiveLib, we pretty much are just going to use
 | 
						|
//  the WM_CREATE and WM_PAINT messages.  In theory you could send
 | 
						|
//  all these other messages, but that hasn't been tested.  In fact,
 | 
						|
//  looking at the code just now, I believe all the messages that
 | 
						|
//  can be used to set the position, font, etc, should all be part
 | 
						|
//  of the WM_COMMAND case, but that isn't even in there  Try to
 | 
						|
//  remember that this is just demo code!
 | 
						|
//
 | 
						|
// RETURNS
 | 
						|
//
 | 
						|
//  varies, see code.
 | 
						|
//
 | 
						|
// EXAMPLE
 | 
						|
//
 | 
						|
// SEE ALSO
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   February 14, 1996  2.0A : New release
 | 
						|
//
 | 
						|
 | 
						|
 | 
						|
//
 | 
						|
// There is a lot of code in here that is #ifdefed to let me declare the
 | 
						|
// class as a far object.  I'm not sure if that is necessary or not.  At
 | 
						|
// one time I was sure it was, but I am able to work with it under
 | 
						|
// Watcom in small  model.
 | 
						|
//
 | 
						|
 | 
						|
LONG AL_EXPORT CALLBACK
 | 
						|
gaugeWndProc( HWND hwnd,  /* Tag protected function */
 | 
						|
              UINT uMsg,
 | 
						|
              WPARAM wParam,
 | 
						|
              LPARAM lParam )
 | 
						|
{
 | 
						|
//
 | 
						|
// After the window has been created, the pointer to the ALGauge object
 | 
						|
// is kept in the windows long word.  I get it here so everyone else
 | 
						|
// can have access to it.
 | 
						|
//
 | 
						|
#if defined ( AL_WATCOM ) || defined( AL_FLAT_MODEL )
 | 
						|
    ALGauge *pgauge = (ALGauge *) GetWindowLong( hwnd, 0 );
 | 
						|
#else
 | 
						|
    ALGauge _far *pgauge = (ALGauge _far *) GetWindowLong( hwnd, 0 );
 | 
						|
#endif
 | 
						|
    switch (uMsg) {
 | 
						|
//
 | 
						|
// When I get the WM_CREATE message, I create a new ALGauge object, then
 | 
						|
// put its address in the Windows long word.
 | 
						|
//
 | 
						|
        case WM_CREATE:
 | 
						|
#if defined( AL_SYMANTEC ) || defined( AL_WATCOM ) || defined( AL_FLAT_MODEL )
 | 
						|
// Not sure about this yet
 | 
						|
            pgauge = new ALGauge;
 | 
						|
#else
 | 
						|
            pgauge = new _far ALGauge;
 | 
						|
#endif
 | 
						|
            if ( pgauge == 0 )
 | 
						|
                return (0L);
 | 
						|
            SetWindowLong( hwnd, 0, (LONG) pgauge );
 | 
						|
            SendMessage( hwnd, WM_SETFONT, NULL, 0L );
 | 
						|
            break;
 | 
						|
 | 
						|
        case WM_DESTROY:
 | 
						|
            if ( pgauge )
 | 
						|
#if defined( AL_SYMANTEC ) && !defined( AL_LARGE_DATA )
 | 
						|
                delete (void _near  *) pgauge;
 | 
						|
#else
 | 
						|
                delete pgauge;
 | 
						|
#endif
 | 
						|
            break;
 | 
						|
 | 
						|
        case ALGaugeGetPosition :
 | 
						|
            return pgauge->iPosition;
 | 
						|
 | 
						|
        case ALGaugeGetRange :
 | 
						|
            return pgauge->iRange;
 | 
						|
 | 
						|
        case ALGaugeGetOrientation :
 | 
						|
            return pgauge->iOrientation;
 | 
						|
 | 
						|
        case ALGaugeGetForegroundColor :
 | 
						|
            return pgauge->dwTextColor;
 | 
						|
 | 
						|
        case ALGaugeGetBackgroundColor:
 | 
						|
            return pgauge->dwBackgroundColor;
 | 
						|
 | 
						|
        case ALGaugeSetBackgroundColor :
 | 
						|
            pgauge->dwBackgroundColor = lParam;
 | 
						|
            return 0L;
 | 
						|
 | 
						|
        case ALGaugeSetForegroundColor :
 | 
						|
            pgauge->dwTextColor = lParam;
 | 
						|
            return 0L;
 | 
						|
 | 
						|
        case ALGaugeSetPosition :
 | 
						|
            pgauge->iPosition = wParam;
 | 
						|
            return ForceRepaint( hwnd );
 | 
						|
 | 
						|
        case ALGaugeSetRange :
 | 
						|
            pgauge->iRange = wParam;
 | 
						|
            return ForceRepaint( hwnd );
 | 
						|
 | 
						|
        case ALGaugeSetOrientation :
 | 
						|
            pgauge->iOrientation = (ALGaugeOrientation) wParam;
 | 
						|
            return ForceRepaint ( hwnd );
 | 
						|
 | 
						|
        case ALGaugeSetDeltaPosition :
 | 
						|
            pgauge->iPosition += (signed) wParam;
 | 
						|
            return ForceRepaint( hwnd );
 | 
						|
 | 
						|
        case WM_PAINT :
 | 
						|
            pgauge->gaugePaint( hwnd );
 | 
						|
            return (0L);
 | 
						|
 | 
						|
        case WM_GETFONT :
 | 
						|
            if ( pgauge->hFont == GetStockObject(SYSTEM_FONT) )
 | 
						|
                return NULL;
 | 
						|
            else
 | 
						|
                return (WORD) pgauge->hFont;
 | 
						|
 | 
						|
        case WM_SETFONT :
 | 
						|
            if ( wParam == 0 ) 
 | 
						|
                pgauge->hFont = (HFONT) GetStockObject( SYSTEM_FONT );
 | 
						|
            else
 | 
						|
                pgauge->hFont = (HFONT) wParam;
 | 
						|
            /* redraw if indicated in message */
 | 
						|
            if ( (BOOL) lParam ) {
 | 
						|
                InvalidateRect( hwnd, NULL, TRUE );
 | 
						|
                UpdateWindow( hwnd );
 | 
						|
            }
 | 
						|
            return (0L);
 | 
						|
    }
 | 
						|
    return ( DefWindowProc( hwnd, uMsg, wParam, lParam ) );
 | 
						|
}
 | 
						|
 |