SPINCUBE.H

/******************************************************************************\ 
*
* SPINCUBE.H
*
\******************************************************************************/

#include <custcntl.h>



/******************************************************************************\
* SYMBOLIC CONSTANTS
\******************************************************************************/

#define SPINCUBECLASS "Spincube"
#define SPINCUBEDESCRIPTION "An animated control"
#define SPINCUBEDEFAULTTEXT ":-)"

#define CCHSTYLE 20 // size of style string, i.e. "SS_ERASE"

#define NUM_SPINCUBE_STYLES 2

#define SS_ERASE 0x0001 // spincube window styles
#define SS_INMOTION 0x0002


#define SPINCUBE_EXTRA 4 // number of extra bytes for spincube class

#define SPIN_EVENT 1 // timer event id to repaint control
#ifdef _ALPHA_
#define SPIN_INTERVAL 0 // milliseconds between repaints. what
// would be really cool is a way to
// dynamically adjust the interval-
// on real fast machines we might
// almost be able to get decent-looking
// animation! :)

#else
#define SPIN_INTERVAL 75 // milliseconds between repaints. what
// would be really cool is a way to
// dynamically adjust the interval-
// on real fast machines we might
// almost be able to get decent-looking
// animation! :)

#endif
#define DID_ERASE 101 // dialog control id's
#define DID_INMOTION 102
#define DID_OK 103

#define GWL_SPINCUBEDATA 0 // offset of control's instance data

#define SPINCUBE_REPAINT_BKGND 0x00000001

#define DO_ERASE(hwnd) GetWindowLong(hwnd,GWL_STYLE) & SS_ERASE \
? TRUE : FALSE

#define IN_MOTION(hwnd) GetWindowLong(hwnd,GWL_STYLE) & SS_INMOTION \
? TRUE : FALSE

#define REPAINT_BKGND(pSCI) pSCI->iOptions&SPINCUBE_REPAINT_BKGND \
? TRUE : FALSE

#define IDS_REGCLASSFAIL 16
#define IDS_UNREGFAIL 17
#define IDS_DLGBOXFAIL 18
#define IDS_ALLOCFAIL 19
#define IDS_CREATEDCFAIL 20
#define IDS_CREATEBITMAPFAIL 21



/******************************************************************************\
* TYPEDEFs
\******************************************************************************/

typedef struct
{
HDC hdcCompat; // the DC that will contain our off-screen
// image
HBITMAP hbmSave; // Save previous selected bitmap
HBITMAP hbmCompat; // The bitmap that will contain the actual
// image, i.e. we will always do our
// drawing on this bmp & then blt the
// result to the screen.

float fCurrentXRotation; // Angle (in radians) to rotate cube about
float fCurrentYRotation; // x, y, z axis
float fCurrentZRotation;

float fCurrentXRotationInc; // Amount to inc rotation angle each
float fCurrentYRotationInc; // time we repaint (and are in motion)
float fCurrentZRotationInc;

int iCurrentXTranslation; // Distance (in pels) to translate cube
int iCurrentYTranslation;
int iCurrentZTranslation;

int iCurrentXTranslationInc; // Amount to inc translation distance each
int iCurrentYTranslationInc; // time we repaint (and are in motion)
int iCurrentZTranslationInc;

RECT rcCubeBoundary; // Bounding rectangle (in 2D) of the last
// cube drawn. We invalidate only this
// region when we're doing animation
// and get the WM_TIMER- it's alot more
// efficient that invalidating the whole
// control (there's less screen flashing.

int iOptions; // Contains the current options for this
// ctrl, i.e. erase background.

} SPINCUBEINFO, *PSPINCUBEINFO;



/******************************************************************************\
* FUNCTION PROTOTYPES
\******************************************************************************/

INT CALLBACK SpincubeSizeToText (DWORD, DWORD, HFONT, LPSTR);
BOOL CALLBACK SpincubeStyle (HWND, LPCCSTYLE);
LRESULT CALLBACK SpincubeWndProc (HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK SpincubeDlgProc (HWND, UINT, WPARAM, LPARAM);