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);