Annotation of q_a/samples/spincube/spincube.c, revision 1.1

1.1     ! root        1: /************************************************************************\
        !             2: *
        !             3: *  MODULE:      SPINCUBE.C
        !             4: *
        !             5: *  PURPOSE:     Demonstrates how to create a custom control library which
        !             6: *               may be used by applications and the Dialog Editor.
        !             7: *
        !             8: *  FUNCTIONS:   DLLEntryPoint()      - Registers spincube class when a
        !             9: *                                      process loads this DLL.
        !            10: *               CustomControlInfoA() - Called by DLGEDIT to initialize
        !            11: *                                      a CCINFO structure(s).
        !            12: *               SpincubeStyle()      - Brings up dialog box which allows
        !            13: *                                      user to modify control style.
        !            14: *               SpincubeSizeToText() - Called by DLGEDIT if user requests
        !            15: *                                      that control be sized to fit text.
        !            16: *               SpincubeWndProc()    - Window procedure for spincube
        !            17: *                                      control.
        !            18: *               SpincubeDlgProc()    - Procedure for control style dialog.
        !            19: *
        !            20: *  COMMMENTS:   The dialog editor interface has changed since Win 3.0.
        !            21: *               I recommend browsing the NT CUSTCNTL.H file to get an
        !            22: *               idea of the new interface.
        !            23: *
        !            24: \************************************************************************/
        !            25: 
        !            26: #include <windows.h>
        !            27: #include "spincube.h"
        !            28: 
        !            29: void Paint (HWND);         /* function prototype for Paint() in PAINT.C */
        !            30: 
        !            31: 
        !            32: 
        !            33: /************************************************************************\
        !            34: *
        !            35: *  FUNCTION:    DLLEntryPoint
        !            36: *
        !            37: *  INPUTS:      hDLL       - DLL module handle
        !            38: *               dwReason   - reason being called (e.g. process attaching)
        !            39: *               lpReserved - reserved
        !            40: *
        !            41: *  RETURNS:     (Only used when dwReason == DLL_PROCESS_ATTACH)
        !            42: *               TRUE if initialization passed, or
        !            43: *               FALSE if initialization failed.
        !            44: *
        !            45: *  GLOBAL VARS: hMod - DLL module handle
        !            46: *
        !            47: *  COMMENTS:    On DLL_PROCESS_ATTACH registers the SPINCUBECLASS
        !            48: *
        !            49: \************************************************************************/
        !            50: 
        !            51: BOOL DLLEntryPoint (HANDLE hDLL, DWORD dwReason, LPVOID lpReserved)
        !            52: {
        !            53:   hMod = hDLL;
        !            54:   switch (dwReason)
        !            55:   {
        !            56:     case DLL_PROCESS_ATTACH:
        !            57:     {
        !            58:       WNDCLASS wc;
        !            59: 
        !            60:       wc.style         = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_CLASSDC |
        !            61:                          CS_GLOBALCLASS ;
        !            62:       wc.lpfnWndProc   = (WNDPROC) SpincubeWndProc;
        !            63:       wc.cbClsExtra    = 0;
        !            64:       wc.cbWndExtra    = SPINCUBE_EXTRA;
        !            65:       wc.hInstance     = hDLL;
        !            66:       wc.hIcon         = NULL;
        !            67:       wc.hCursor       = LoadCursor (NULL, IDC_ARROW);
        !            68:       wc.hbrBackground = NULL;
        !            69:       wc.lpszMenuName  = (LPSTR) NULL;
        !            70:       wc.lpszClassName = (LPSTR) SPINCUBECLASS;
        !            71: 
        !            72:       if (!RegisterClass (&wc))
        !            73:       {
        !            74:         MessageBox (NULL, "DLLEntryPoint(): RegisterClass() failed",
        !            75:                     "Err! - SPINCUBE.DLL", MB_OK | MB_ICONEXCLAMATION);
        !            76:         return FALSE;
        !            77:       }
        !            78:       break;
        !            79:     }
        !            80:     default:
        !            81:       break;
        !            82:   }
        !            83:   return TRUE;
        !            84: }
        !            85: 
        !            86: 
        !            87: 
        !            88: /************************************************************************\
        !            89: *
        !            90: *  FUNCTION:    CustomControlInfoA
        !            91: *
        !            92: *  INPUTS:      acci - pointer to an array od CCINFOA structures
        !            93: *
        !            94: *  RETURNS:     Number of controls supported by this DLL
        !            95: *
        !            96: *  COMMENTS:    See CUSTCNTL.H for more info
        !            97: *
        !            98: \************************************************************************/
        !            99: 
        !           100: UINT CALLBACK CustomControlInfoA (LPCCINFOA acci)
        !           101: {
        !           102:   if (!acci)     /* dlgedit is querying the number of controls this DLL */
        !           103:     return 1;    /*   supports, so return 1. Then we'll get called      */
        !           104:                  /*   again with a valid "acci"                         */
        !           105: 
        !           106:   acci[0].flOptions         = 0;
        !           107:   acci[0].cxDefault         = 40;      /* default width (dialog units)  */
        !           108:   acci[0].cyDefault         = 40;      /* default height (dialog units) */
        !           109:   acci[0].flStyleDefault    = WS_CHILD |
        !           110:                               WS_VISIBLE;
        !           111:   acci[0].flExtStyleDefault = 0;
        !           112:   acci[0].flCtrlTypeMask    = 0;
        !           113:   acci[0].cStyleFlags       = 1;    /* entries in following style table */
        !           114: 
        !           115:   if (!(acci[0].aStyleFlags = (LPCCSTYLEFLAG)
        !           116:                               LocalAlloc (LPTR, sizeof(CCSTYLEFLAG) +
        !           117:                                                 sizeof(STYLEDEFSTR) + 1)))
        !           118:     return 0;
        !           119: 
        !           120:   acci[0].aStyleFlags[0].flStyle     = 0;
        !           121:   acci[0].aStyleFlags[0].flStyleMask = 0;
        !           122:   acci[0].aStyleFlags[0].pszStyle    = (LPSTR) &acci[1];
        !           123:   acci[0].lpfnStyle                  = SpincubeStyle;
        !           124:   acci[0].lpfnSizeToText             = SpincubeSizeToText;
        !           125:   acci[0].dwReserved1                = 0;
        !           126:   acci[0].dwReserved2                = 0;
        !           127: 
        !           128:   lstrcpy (acci[0].szClass,        SPINCUBECLASS);
        !           129:   lstrcpy (acci[0].szDesc,         SPINCUBEDESCRIPTION);
        !           130:   lstrcpy (acci[0].szTextDefault,  SPINCUBEDEFTEXT);
        !           131:   lstrcpy ((char *)&acci[1],       STYLEDEFSTR);
        !           132: 
        !           133:   return 1;      /* return the number of controls that the DLL supports */
        !           134: }
        !           135: 
        !           136: 
        !           137: 
        !           138: /************************************************************************\
        !           139: *
        !           140: *  FUNCTION:    SpincubeStyle
        !           141: *
        !           142: *  INPUTS:      hWndParent - handle of parent window (dialog editor)
        !           143: *               pccs       - pointer to a CCSTYLE structure
        !           144: *
        !           145: *  RETURNS:     TRUE  if success,
        !           146: *               FALSE if error occured
        !           147: *
        !           148: *  GLOBAL VARS: gpccs - global pointer to a CCSTYLE structure
        !           149: *
        !           150: *  LOCAL VARS:  rc - return code from DialogBox
        !           151: *
        !           152: \************************************************************************/
        !           153: 
        !           154: BOOL CALLBACK SpincubeStyle (HWND hWndParent, LPCCSTYLE pccs)
        !           155: {
        !           156:   int rc;
        !           157: 
        !           158:   gpccs = pccs;
        !           159: 
        !           160:   if ((rc = DialogBox (hMod, "SpincubeStyle", hWndParent,
        !           161:                        (DLGPROC)SpincubeDlgProc)) == -1)
        !           162:   {
        !           163:     MessageBox (hWndParent, "SpincubeStyle(): DialogBox failed",
        !           164:                 "Err!- Spincube.dll",
        !           165:                 MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL);
        !           166:     rc = 0;
        !           167:   }
        !           168:   return (BOOL) rc;
        !           169: }
        !           170: 
        !           171: 
        !           172: 
        !           173: /************************************************************************\
        !           174: *
        !           175: *  FUNCTION:    SpincubeSizeToText
        !           176: *
        !           177: *  INPUTS:      flStyle    - control style
        !           178: *               flExtStyle - control extended style
        !           179: *               hFont      - handle of font used to draw text
        !           180: *               pszText    - control text
        !           181: *
        !           182: *  RETURNS:     Width (in pixels) control must be to accomodate text, or
        !           183: *               -1 if an error occurs.
        !           184: *
        !           185: *  COMMENTS:    Just no-op here
        !           186: *
        !           187: \************************************************************************/
        !           188: 
        !           189: INT CALLBACK SpincubeSizeToText (DWORD flStyle, DWORD flExtStyle,
        !           190:                                  HFONT hFont,   LPSTR pszText)
        !           191: {
        !           192:   return -1;
        !           193: }
        !           194: 
        !           195: 
        !           196: 
        !           197: 
        !           198: /************************************************************************\
        !           199: *
        !           200: *  FUNCTION:    SpincubeWndProc (standard window procedure INPUTS/RETURNS)
        !           201: *
        !           202: *  COMMENTS:    This is the window procedure for our custom control. At
        !           203: *               creation we alloc a SPINCUBEINFO struct, initialize it,
        !           204: *               and associate it with this particular control. We also
        !           205: *               start a timer which will invalidate the window every so
        !           206: *               often; this causes a repaint, and the cube gets drawn in
        !           207: *               a new position. Left button clicks will toggle the motion
        !           208: *               state of the control (and turn the timer on/off).
        !           209: *
        !           210: \************************************************************************/
        !           211: 
        !           212: LONG SpincubeWndProc (HWND hWnd, UINT msg, UINT wParam, LONG lParam)
        !           213: {
        !           214:   switch (msg)
        !           215:   {
        !           216:     case WM_CREATE:
        !           217:     {
        !           218:       /******************************************************************\
        !           219:       *  Alloc & init a SPINCUBEINFO struct for this particular control
        !           220:       \******************************************************************/
        !           221: 
        !           222:       HANDLE        hSCI = LocalAlloc (LHND, sizeof(SPINCUBEINFO));
        !           223:       PSPINCUBEINFO pSCI = (PSPINCUBEINFO) LocalLock (hSCI);
        !           224:       pSCI->xRotAngle = (float) 0.0;
        !           225:       pSCI->xRotAngle = (float) 0.0;
        !           226:       pSCI->xRotAngle = (float) 0.0;
        !           227:       pSCI->inMotion  = TRUE;
        !           228:       LocalUnlock (hSCI);
        !           229:       SetWindowLong (hWnd, GWL_SPINCUBEDATA, (LONG) hSCI);
        !           230: 
        !           231:       SetTimer (hWnd, SPIN_EVENT, SPIN_INTERVAL, NULL);
        !           232:       break;
        !           233:     }
        !           234: 
        !           235:     case WM_PAINT:
        !           236: 
        !           237:       Paint (hWnd);
        !           238:       break;
        !           239: 
        !           240:     case WM_TIMER:
        !           241: 
        !           242:       switch (wParam)
        !           243:       {
        !           244:         case SPIN_EVENT:
        !           245:           InvalidateRect (hWnd, NULL, FALSE);
        !           246:           break;
        !           247:       }
        !           248:       break;
        !           249: 
        !           250:     case WM_LBUTTONDOWN:
        !           251:     {
        !           252:       /******************************************************************\
        !           253:       *  Change the inMotion state of the control
        !           254:       \******************************************************************/
        !           255: 
        !           256:       HANDLE hSCI = (HANDLE) GetWindowLong (hWnd, GWL_SPINCUBEDATA);
        !           257:       PSPINCUBEINFO pSCI = (PSPINCUBEINFO) LocalLock (hSCI);
        !           258:       if (pSCI->inMotion)
        !           259:       {
        !           260:         KillTimer (hWnd, SPIN_EVENT);
        !           261:         pSCI->inMotion = FALSE;
        !           262:       }
        !           263:       else
        !           264:       {
        !           265:         SetTimer (hWnd, SPIN_EVENT, SPIN_INTERVAL, NULL);
        !           266:         pSCI->inMotion = TRUE;
        !           267:       }
        !           268:       LocalUnlock (hSCI);
        !           269: 
        !           270:       break;
        !           271:     }
        !           272:     case WM_DESTROY:
        !           273:     {
        !           274:       HANDLE hSCI = (HANDLE) GetWindowLong (hWnd, GWL_SPINCUBEDATA);
        !           275:       LocalFree (hSCI);
        !           276:       break;
        !           277:     }
        !           278:     default:
        !           279: 
        !           280:       return (DefWindowProc(hWnd, msg, wParam, lParam));
        !           281:   }
        !           282:   return ((LONG) TRUE);
        !           283: }
        !           284: 
        !           285: 
        !           286: 
        !           287: /************************************************************************\
        !           288: *
        !           289: *  FUNCTION:    SpincubeDlgProc (standard dialog procedure INPUTS/RETURNS)
        !           290: *
        !           291: *  GLOBAL VARS: gpccs - pointer to a CCSTYLE structure
        !           292: *
        !           293: *  COMMENTS:    The dialog comes up in response to a user requesting to
        !           294: *               modify the control style. This sample allows for changing
        !           295: *               the control's text, and this is done by modifying the
        !           296: *               CCSTYLE structure pointed at by "gpccs" (a pointer
        !           297: *               that was passed to us by dlgedit).
        !           298: *
        !           299: \************************************************************************/
        !           300: 
        !           301: BOOL SpincubeDlgProc (HWND hDlg, UINT msg, UINT wParam, LONG lParam)
        !           302: {
        !           303:   switch (msg)
        !           304:   {
        !           305:     case WM_INITDIALOG :
        !           306:     {
        !           307:       SetDlgItemText (hDlg, DID_EDIT, gpccs->szText);
        !           308:       break;
        !           309:     }
        !           310: 
        !           311:     case WM_COMMAND:
        !           312: 
        !           313:       switch (LOWORD(wParam))
        !           314:       {
        !           315:         case DID_CANCEL:
        !           316: 
        !           317:           EndDialog  (hDlg, 0);
        !           318:           break;
        !           319: 
        !           320:         case DID_OK:
        !           321: 
        !           322:           GetDlgItemText (hDlg, DID_EDIT, gpccs->szText,
        !           323:                           CCHCCTEXT);
        !           324:           EndDialog  (hDlg, 1);
        !           325:           break;
        !           326:       }
        !           327:       break;
        !           328:   }
        !           329:   return FALSE;
        !           330: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.