Annotation of mstools/samples/spincube/spincube.c, revision 1.1.1.1

1.1       root        1: /******************************************************************************\
                      2: *
                      3: *  MODULE:      SPINCUBE.C
                      4: *
                      5: *
                      6: *  PURPOSE:     To provide a generic Windows NT dynamic link library
                      7: *               sample demonstrating the use of DLL entry points, exported
                      8: *               variables, using C runtime in a DLL, etc...
                      9: *
                     10: *               This module also provides a functional example of how
                     11: *               to create a custom control library which may be used by
                     12: *               applications (i.e. SPINTEST.EXE) and the Dialog Editor.
                     13: *
                     14: *
                     15: *  FUNCTIONS:   DllMain()      - Registers spincube class when a
                     16: *                                      process loads this DLL.
                     17: *               CustomControlInfoA() - Called by DLGEDIT to initialize
                     18: *                                      a CCINFO structure(s).
                     19: *               SpincubeStyle()      - Brings up dialog box which allows
                     20: *                                      user to modify control style.
                     21: *               SpincubeSizeToText() - Called by DLGEDIT if user requests
                     22: *                                      that control be sized to fit text.
                     23: *               SpincubeWndProc()    - Window procedure for spincube
                     24: *                                      control.
                     25: *               SpincubeDlgProc()    - Procedure for control style dialog.
                     26: *
                     27: *
                     28: *  COMMMENTS:   The dialog editor interface has changed since Win 3.0.
                     29: *               Recommend browsing the NT CUSTCNTL.H file to get an
                     30: *               idea of the new interface.
                     31: *
                     32: *
                     33: *                                  Dan Knudson
                     34: *                           Microsoft Developer Support
                     35: *                  Copyright (c) 1992, 1993 Microsoft Corporation
                     36: *
                     37: \******************************************************************************/
                     38: 
                     39: #include <windows.h>
                     40: #include <stdlib.h>
                     41: #include "spincube.h"
                     42: 
                     43: 
                     44: //
                     45: // function prototype for C runtime initialization routine
                     46: //
                     47: 
                     48: BOOL WINAPI _CRT_INIT (HINSTANCE hDLL, DWORD dwReason, LPVOID lpReserved);
                     49: 
                     50: 
                     51: //
                     52: // function prototype for Paint() in PAINT.C
                     53: //
                     54: 
                     55: void Paint (HWND);
                     56: 
                     57: 
                     58: //
                     59: // Declared below are the module's 2 exported variables.
                     60: //
                     61: //   giNumSpincubesThisProcess is an instance variable that contains
                     62: //   the number of (existing) Spincube controls created by the
                     63: //   current process.
                     64: //
                     65: //   giNumSpincubesAllProcesses is a shared (between processes) variable
                     66: //   which contains the total number of (existing) Spincube controls
                     67: //   created by all processes in the system.
                     68: //
                     69: //
                     70: 
                     71: int giNumSpincubesThisProcess = 0;
                     72: 
                     73: #pragma data_seg(".MYSEG")
                     74: 
                     75:   int giNumSpincubesAllProcesses = 0;
                     76: 
                     77: #pragma data_seg()
                     78: 
                     79: 
                     80: //
                     81: // Some global vars for this module
                     82: //
                     83: 
                     84: HANDLE    ghMod;   // DLL's module handle
                     85: LPCCSTYLE gpccs;   // global pointer to a CCSTYLE structure
                     86: 
                     87: CCSTYLEFLAGA aSpincubeStyleFlags[] = { { SS_ERASE,    0, "SS_ERASE"    },
                     88:                                        { SS_INMOTION, 0, "SS_INMOTION" } };
                     89: 
                     90: 
                     91: 
                     92: /******************************************************************************\
                     93: *
                     94: *  FUNCTION:    DllMain
                     95: *
                     96: *  INPUTS:      hDLL       - DLL module handle
                     97: *               dwReason   - reason being called (e.g. process attaching)
                     98: *               lpReserved - reserved
                     99: *
                    100: *  RETURNS:     TRUE if initialization passed, or
                    101: *               FALSE if initialization failed.
                    102: *
                    103: *  COMMENTS:    On DLL_PROCESS_ATTACH registers the SPINCUBECLASS
                    104: *
                    105: *               DLL initialization serialization is guaranteed within a
                    106: *               process (if multiple threads then DLL entry points are
                    107: *               serialized), but is not guaranteed across processes.
                    108: *
                    109: *               When synchronization objects are created, it is necesaary
                    110: *               to check the return code of GetLastError even if the create
                    111: *               call succeeded. If the object existed, ERROR_ALREADY_EXISTED
                    112: *               will be returned.
                    113: *
                    114: *               If your DLL uses any C runtime functions then you should
                    115: *               always call _CRT_INIT so that the C runtime can initialize
                    116: *               itself appropriately. Failure to do this may result in
                    117: *               indeterminate behavior. When the DLL entry point is called
                    118: *               for DLL_PROCESS_ATTACH & DLL_THREAD_ATTACH circumstances,
                    119: *               _CRT_INIT should be called before any other initilization
                    120: *               is performed. When the DLL entry point is called for
                    121: *               DLL_PROCESS_DETACH & DLL_THREAD_DETACH circumstances,
                    122: *               _CRT_INIT should be called after all cleanup has been
                    123: *               performed, i.e. right before the function returns.
                    124: *
                    125: \******************************************************************************/
                    126: 
                    127: BOOL WINAPI DllMain (HANDLE hDLL, DWORD dwReason, LPVOID lpReserved)
                    128: {
                    129:   ghMod = hDLL;
                    130:   switch (dwReason)
                    131:   {
                    132:     case DLL_PROCESS_ATTACH:
                    133:     {
                    134:       WNDCLASS wc;
                    135: 
                    136:       if (!_CRT_INIT (hDLL, dwReason, lpReserved))
                    137: 
                    138:         return FALSE;
                    139: 
                    140:       wc.style         = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_OWNDC |
                    141:                          CS_GLOBALCLASS ;
                    142:       wc.lpfnWndProc   = (WNDPROC) SpincubeWndProc;
                    143:       wc.cbClsExtra    = 0;
                    144:       wc.cbWndExtra    = SPINCUBE_EXTRA;
                    145:       wc.hInstance     = hDLL;
                    146:       wc.hIcon         = NULL;
                    147:       wc.hCursor       = LoadCursor (NULL, IDC_ARROW);
                    148:       wc.hbrBackground = NULL;
                    149:       wc.lpszMenuName  = (LPSTR) NULL;
                    150:       wc.lpszClassName = (LPSTR) SPINCUBECLASS;
                    151: 
                    152:       if (!RegisterClass (&wc))
                    153:       {
                    154:         MessageBox (NULL,
                    155:                     (LPCTSTR) "DllMain(): RegisterClass() failed",
                    156:                     (LPCTSTR) "Err! - SPINCUBE.DLL",
                    157:                     MB_OK | MB_ICONEXCLAMATION);
                    158: 
                    159:         return FALSE;
                    160:       }
                    161: 
                    162:       break;
                    163:     }
                    164: 
                    165:     default:
                    166: 
                    167:       if (!_CRT_INIT (hDLL, dwReason, lpReserved))
                    168: 
                    169:         return FALSE;
                    170: 
                    171:       break;
                    172:   }
                    173:   return TRUE;
                    174: }
                    175: 
                    176: 
                    177: 
                    178: /******************************************************************************\
                    179: *
                    180: *  FUNCTION:    CustomControlInfoA
                    181: *
                    182: *  INPUTS:      acci - pointer to an array od CCINFOA structures
                    183: *
                    184: *  RETURNS:     Number of controls supported by this DLL
                    185: *
                    186: *  COMMENTS:    See CUSTCNTL.H for more info
                    187: *
                    188: \******************************************************************************/
                    189: 
                    190: UINT CALLBACK CustomControlInfoA (LPCCINFOA acci)
                    191: {
                    192:   //
                    193:   // Dlgedit is querying the number of controls this DLL supports, so return 1.
                    194:   //   Then we'll get called again with a valid "acci"
                    195:   //
                    196: 
                    197:   if (!acci)
                    198: 
                    199:     return 1;
                    200: 
                    201: 
                    202:   //
                    203:   // Fill in the constant calues.
                    204:   //
                    205: 
                    206:   acci[0].flOptions         = 0;
                    207:   acci[0].cxDefault         = 40;      // default width  (dialog units)
                    208:   acci[0].cyDefault         = 40;      // default height (dialog units)
                    209:   acci[0].flStyleDefault    = WS_CHILD |
                    210:                               WS_VISIBLE |
                    211:                               SS_INMOTION;
                    212:   acci[0].flExtStyleDefault = 0;
                    213:   acci[0].flCtrlTypeMask    = 0;
                    214:   acci[0].cStyleFlags       = NUM_SPINCUBE_STYLES;
                    215:   acci[0].aStyleFlags       = aSpincubeStyleFlags;
                    216:   acci[0].lpfnStyle         = SpincubeStyle;
                    217:   acci[0].lpfnSizeToText    = SpincubeSizeToText;
                    218:   acci[0].dwReserved1       = 0;
                    219:   acci[0].dwReserved2       = 0;
                    220: 
                    221: 
                    222:   //
                    223:   // Copy the strings
                    224:   //
                    225:   // NOTE: MAKE SURE THE STRINGS COPIED DO NOT EXCEED THE LENGTH OF
                    226:   //       THE BUFFERS IN THE CCINFO STRUCTURE!
                    227:   //
                    228: 
                    229:   lstrcpy (acci[0].szClass, SPINCUBECLASS);
                    230:   lstrcpy (acci[0].szDesc,  SPINCUBEDESCRIPTION);
                    231:   lstrcpy (acci[0].szTextDefault, SPINCUBEDEFAULTTEXT);
                    232: 
                    233: 
                    234:   //
                    235:   // Return the number of controls that the DLL supports
                    236:   //
                    237: 
                    238:   return 1;
                    239: }
                    240: 
                    241: 
                    242: 
                    243: /******************************************************************************\
                    244: *
                    245: *  FUNCTION:    SpincubeStyle
                    246: *
                    247: *  INPUTS:      hWndParent - handle of parent window (dialog editor)
                    248: *               pccs       - pointer to a CCSTYLE structure
                    249: *
                    250: *  RETURNS:     TRUE  if success,
                    251: *               FALSE if error occured
                    252: *
                    253: *  LOCAL VARS:  rc - return code from DialogBox
                    254: *
                    255: \******************************************************************************/
                    256: 
                    257: BOOL CALLBACK SpincubeStyle (HWND hWndParent, LPCCSTYLE pccs)
                    258: {
                    259:   int rc;
                    260: 
                    261:   gpccs = pccs;
                    262: 
                    263:   if ((rc = DialogBox (ghMod, "SpincubeStyle", hWndParent,
                    264:                        (DLGPROC)SpincubeDlgProc)) == -1)
                    265:   {
                    266:     MessageBox (hWndParent, (LPCTSTR) "SpincubeStyle(): DialogBox failed",
                    267:                 (LPCTSTR) "Err!- Spincube.dll",
                    268:                 MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL);
                    269:     rc = 0;
                    270:   }
                    271: 
                    272:   return (BOOL) rc;
                    273: }
                    274: 
                    275: 
                    276: 
                    277: /******************************************************************************\
                    278: *
                    279: *  FUNCTION:    SpincubeSizeToText
                    280: *
                    281: *  INPUTS:      flStyle    - control style
                    282: *               flExtStyle - control extended style
                    283: *               hFont      - handle of font used to draw text
                    284: *               pszText    - control text
                    285: *
                    286: *  RETURNS:     Width (in pixels) control must be to accomodate text, or
                    287: *               -1 if an error occurs.
                    288: *
                    289: *  COMMENTS:    Just no-op here (since we never actually display text in
                    290: *               the control it doesn't need to be resized).
                    291: *
                    292: \******************************************************************************/
                    293: 
                    294: INT CALLBACK SpincubeSizeToText (DWORD flStyle, DWORD flExtStyle,
                    295:                                  HFONT hFont,   LPSTR pszText)
                    296: {
                    297:   return -1;
                    298: }
                    299: 
                    300: 
                    301: 
                    302: /******************************************************************************\
                    303: *
                    304: *  FUNCTION:    SpincubeWndProc (standard window procedure INPUTS/RETURNS)
                    305: *
                    306: *  COMMENTS:    This is the window procedure for our custom control. At
                    307: *               creation we alloc a SPINCUBEINFO struct, initialize it,
                    308: *               and associate it with this particular control. We also
                    309: *               start a timer which will invalidate the window every so
                    310: *               often; this causes a repaint, and the cube gets drawn in
                    311: *               a new position. Left button clicks will turn toggle the
                    312: *               erase option, causing a "trail" of cubes to be left when
                    313: *               off. Right button clicks will toggle the motion state of
                    314: *               the control (and turn the timer on/off).
                    315: *
                    316: \******************************************************************************/
                    317: 
                    318: LRESULT CALLBACK SpincubeWndProc (HWND hwnd, UINT msg, WPARAM wParam,
                    319:                                   LPARAM lParam)
                    320: {
                    321:   switch (msg)
                    322:   {
                    323:     case WM_CREATE:
                    324:     {
                    325:       //
                    326:       // Alloc & init a SPINCUBEINFO struct for this particular control
                    327:       //
                    328: 
                    329:       HDC            hdc;
                    330:       LPCREATESTRUCT lpcs = (LPCREATESTRUCT) lParam;
                    331:       PSPINCUBEINFO  pSCI = (PSPINCUBEINFO) LocalAlloc (LPTR,
                    332:                                                         sizeof(SPINCUBEINFO));
                    333:       if (!pSCI)
                    334:       {
                    335:         MessageBox (NULL,
                    336:                     (LPCTSTR) "SpincubeWndProc(): LocalAlloc() failed",
                    337:                     (LPCTSTR) "Err! - SPINCUBE.DLL",
                    338:                     MB_OK | MB_ICONEXCLAMATION);
                    339:         return -1;
                    340:       }
                    341: 
                    342: 
                    343:       //
                    344:       // Alloc the compatible DC for this control.
                    345:       //
                    346: 
                    347:       hdc = GetDC (hwnd);
                    348: 
                    349:       if ((pSCI->hdcCompat = CreateCompatibleDC (hdc)) == NULL)
                    350:       {
                    351:         MessageBox (NULL,
                    352:                     (LPCTSTR) "SpincubeWndProc(): CreateCompatibleDC() failed",
                    353:                     (LPCTSTR) "Err! - SPINCUBE.DLL",
                    354:                     MB_OK | MB_ICONEXCLAMATION);
                    355:         return -1;
                    356:       }
                    357: 
                    358:       ReleaseDC (hwnd, hdc);
                    359: 
                    360: 
                    361:       //
                    362:       // Initialize this instance structure
                    363:       //
                    364: 
                    365:       pSCI->fCurrentXRotation =
                    366:       pSCI->fCurrentYRotation =
                    367:       pSCI->fCurrentZRotation = (float) 0.0;
                    368: 
                    369:       pSCI->fCurrentXRotationInc =
                    370:       pSCI->fCurrentYRotationInc =
                    371:       pSCI->fCurrentZRotationInc = (float) 0.2617; // a random # (15 degrees)
                    372: 
                    373:       pSCI->iCurrentXTranslation =
                    374:       pSCI->iCurrentYTranslation =
                    375:       pSCI->iCurrentZTranslation = 0;
                    376: 
                    377:       //
                    378:       // All these calculations so the cubes start out with random movements.
                    379:       //
                    380: 
                    381:       if ((pSCI->iCurrentXTranslationInc = (rand() % 10) + 2) > 7)
                    382: 
                    383:         pSCI->iCurrentXTranslationInc = -pSCI->iCurrentXTranslationInc;
                    384: 
                    385:       if ((pSCI->iCurrentYTranslationInc = (rand() % 10) + 2) <= 7)
                    386: 
                    387:         pSCI->iCurrentYTranslationInc = -pSCI->iCurrentYTranslationInc;
                    388: 
                    389:       if ((pSCI->iCurrentZTranslationInc = (rand() % 10) + 2) > 7)
                    390: 
                    391:         pSCI->iCurrentZTranslationInc = -pSCI->iCurrentZTranslationInc;
                    392: 
                    393:       pSCI->rcCubeBoundary.left   =
                    394:       pSCI->rcCubeBoundary.top    = 0;
                    395:       pSCI->rcCubeBoundary.right  = lpcs->cx;
                    396:       pSCI->rcCubeBoundary.bottom = lpcs->cy;
                    397: 
                    398:       pSCI->iOptions  = SPINCUBE_REPAINT_BKGND;
                    399: 
                    400:       SetWindowLong (hwnd, GWL_SPINCUBEDATA, (LONG) pSCI);
                    401: 
                    402:       SetTimer (hwnd, SPIN_EVENT, SPIN_INTERVAL, NULL);
                    403: 
                    404:       //
                    405:       // Increment the count vars
                    406:       //
                    407: 
                    408:       giNumSpincubesThisProcess++;
                    409:       giNumSpincubesAllProcesses++;
                    410: 
                    411:       break;
                    412:     }
                    413: 
                    414:     case WM_PAINT:
                    415: 
                    416:       Paint (hwnd);
                    417:       break;
                    418: 
                    419:     case WM_TIMER:
                    420: 
                    421:       switch (wParam)
                    422:       {
                    423:         case SPIN_EVENT:
                    424:         {
                    425:           PSPINCUBEINFO pSCI = (PSPINCUBEINFO) GetWindowLong (hwnd,
                    426:                                                               GWL_SPINCUBEDATA);
                    427: 
                    428:           InvalidateRect (hwnd, &pSCI->rcCubeBoundary, FALSE);
                    429: 
                    430:           break;
                    431:         }
                    432:       }
                    433: 
                    434:       break;
                    435: 
                    436:     case WM_LBUTTONDBLCLK:
                    437:     {
                    438:       //
                    439:       // Toggle the erase state of the control
                    440:       //
                    441: 
                    442:       if (DO_ERASE(hwnd))
                    443: 
                    444:         SetWindowLong (hwnd, GWL_STYLE,
                    445:                        GetWindowLong (hwnd, GWL_STYLE) & ~SS_ERASE);
                    446: 
                    447: 
                    448:       else
                    449:       {
                    450:         //
                    451:         // Repaint the entire control to get rid of the (cube trails) mess
                    452:         //
                    453: 
                    454:         PSPINCUBEINFO pSCI = (PSPINCUBEINFO) GetWindowLong (hwnd,
                    455:                                                             GWL_SPINCUBEDATA);
                    456: 
                    457:         SetWindowLong (hwnd, GWL_STYLE,
                    458:                        GetWindowLong (hwnd, GWL_STYLE) | SS_ERASE);
                    459:         pSCI->iOptions |= SPINCUBE_REPAINT_BKGND;
                    460:         InvalidateRect (hwnd, NULL, FALSE);
                    461:         SendMessage (hwnd, WM_PAINT, 0, 0);
                    462:       }
                    463:       break;
                    464:     }
                    465: 
                    466:     case WM_RBUTTONDBLCLK:
                    467:     {
                    468:       //
                    469:       // Toggle the motion state of the control
                    470:       //
                    471: 
                    472:       if (IN_MOTION(hwnd))
                    473:       {
                    474:         KillTimer (hwnd, SPIN_EVENT);
                    475:         SetWindowLong (hwnd, GWL_STYLE,
                    476:                        GetWindowLong (hwnd, GWL_STYLE) & ~SS_INMOTION);
                    477:       }
                    478:       else
                    479:       {
                    480:         SetTimer (hwnd, SPIN_EVENT, SPIN_INTERVAL, NULL);
                    481:         SetWindowLong (hwnd, GWL_STYLE,
                    482:                        GetWindowLong (hwnd, GWL_STYLE) | SS_INMOTION);
                    483:       }
                    484: 
                    485:       break;
                    486:     }
                    487: 
                    488:     case WM_SIZE:
                    489: 
                    490:       if (wParam == SIZE_MAXIMIZED || wParam == SIZE_RESTORED)
                    491:       {
                    492:         PSPINCUBEINFO pSCI = (PSPINCUBEINFO) GetWindowLong (hwnd,
                    493:                                                             GWL_SPINCUBEDATA);
                    494:         //
                    495:         // Get a new bitmap which is the new size of our window
                    496:         //
                    497: 
                    498:         HDC hdc = GetDC (hwnd);
                    499:         HBITMAP hbmTemp = CreateCompatibleBitmap (hdc,
                    500:                                                   (int) LOWORD (lParam),
                    501:                                                   (int) HIWORD (lParam));
                    502:         if (!hbmTemp)
                    503:         {
                    504:           //
                    505:           // Scream, yell, & committ an untimely demise...
                    506:           //
                    507: 
                    508:           MessageBox (NULL,
                    509:                       (LPCTSTR) "SpincubeWndProc(): CreateCompatibleBitmap() failed",
                    510:                       (LPCTSTR) "Err! - SPINCUBE.DLL",
                    511:                       MB_OK | MB_ICONEXCLAMATION);
                    512:           DestroyWindow (hwnd);
                    513:         }
                    514: 
                    515:         SelectObject (pSCI->hdcCompat, hbmTemp);
                    516:         DeleteObject (pSCI->hbmCompat);
                    517:         ReleaseDC    (hwnd, hdc);
                    518:         pSCI->hbmCompat = hbmTemp;
                    519: 
                    520: 
                    521:         //
                    522:         // Reset the translation so the cube doesn't go spinning off into
                    523:         //   space somewhere- we'd never see it again!
                    524:         //
                    525: 
                    526:         pSCI->iCurrentXTranslation =
                    527:         pSCI->iCurrentYTranslation =
                    528:         pSCI->iCurrentZTranslation = 0;
                    529: 
                    530:         //
                    531:         // All these calculations so the cube starts out with random movements,
                    532:         //
                    533: 
                    534:         if ((pSCI->iCurrentXTranslationInc = (rand() % 10) + 2) > 7)
                    535: 
                    536:           pSCI->iCurrentXTranslationInc = -pSCI->iCurrentXTranslationInc;
                    537: 
                    538:         if ((pSCI->iCurrentYTranslationInc = (rand() % 10) + 2) <= 7)
                    539: 
                    540:           pSCI->iCurrentYTranslationInc = -pSCI->iCurrentYTranslationInc;
                    541: 
                    542:         if ((pSCI->iCurrentZTranslationInc = (rand() % 10) + 2) > 7)
                    543: 
                    544:           pSCI->iCurrentZTranslationInc = -pSCI->iCurrentZTranslationInc;
                    545: 
                    546:         pSCI->rcCubeBoundary.left   =
                    547:         pSCI->rcCubeBoundary.top    = 0;
                    548:         pSCI->rcCubeBoundary.right  = (int) LOWORD (lParam);
                    549:         pSCI->rcCubeBoundary.bottom = (int) HIWORD (lParam);
                    550: 
                    551:         pSCI->iOptions |= SPINCUBE_REPAINT_BKGND;
                    552: 
                    553:         InvalidateRect (hwnd, NULL, FALSE);
                    554:       }
                    555: 
                    556:       break;
                    557: 
                    558:     case WM_DESTROY:
                    559:     {
                    560:       PSPINCUBEINFO pSCI = (PSPINCUBEINFO) GetWindowLong (hwnd,
                    561:                                                           GWL_SPINCUBEDATA);
                    562:       //
                    563:       // Clean up all the resources used for this control
                    564:       //
                    565: 
                    566:       if (IN_MOTION(hwnd))
                    567: 
                    568:         KillTimer (hwnd, SPIN_EVENT);
                    569: 
                    570:       DeleteObject (pSCI->hbmCompat);
                    571:       DeleteDC     (pSCI->hdcCompat);
                    572: 
                    573:       LocalFree (LocalHandle ((LPVOID) pSCI));
                    574: 
                    575: 
                    576:       //
                    577:       // Decrement the global count vars
                    578:       //
                    579: 
                    580:       giNumSpincubesThisProcess--;
                    581:       giNumSpincubesAllProcesses--;
                    582: 
                    583:       break;
                    584:     }
                    585: 
                    586:     default:
                    587: 
                    588:       return (DefWindowProc(hwnd, msg, wParam, lParam));
                    589:   }
                    590: 
                    591:   return ((LONG) TRUE);
                    592: }
                    593: 
                    594: 
                    595: 
                    596: /******************************************************************************\
                    597: *
                    598: *  FUNCTION:    SpincubeDlgProc (standard dialog procedure INPUTS/RETURNS)
                    599: *
                    600: *  COMMENTS:    This dialog comes up in response to a user requesting to
                    601: *               modify the control style. This sample allows for changing
                    602: *               the control's text, and this is done by modifying the
                    603: *               CCSTYLE structure pointed at by "gpccs" (a pointer
                    604: *               that was passed to us by dlgedit).
                    605: *
                    606: \******************************************************************************/
                    607: 
                    608: LRESULT CALLBACK SpincubeDlgProc (HWND hDlg, UINT msg, WPARAM wParam,
                    609:                                   LPARAM lParam)
                    610: {
                    611:   switch (msg)
                    612:   {
                    613:     case WM_INITDIALOG :
                    614:     {
                    615:       if (gpccs->flStyle & SS_ERASE)
                    616: 
                    617:         CheckDlgButton (hDlg, DID_ERASE, 1);
                    618: 
                    619:       if (gpccs->flStyle & SS_INMOTION)
                    620: 
                    621:         CheckDlgButton (hDlg, DID_INMOTION, 1);
                    622: 
                    623:       break;
                    624:     }
                    625: 
                    626:     case WM_COMMAND:
                    627: 
                    628:       switch (LOWORD(wParam))
                    629:       {
                    630:         case DID_ERASE:
                    631: 
                    632:           if (IsDlgButtonChecked (hDlg, DID_ERASE))
                    633: 
                    634:             gpccs->flStyle |= SS_ERASE;
                    635: 
                    636:           else
                    637: 
                    638:             gpccs->flStyle &= ~SS_ERASE;
                    639: 
                    640:           break;
                    641: 
                    642:         case DID_INMOTION:
                    643: 
                    644:           if (IsDlgButtonChecked (hDlg, DID_INMOTION))
                    645: 
                    646:             gpccs->flStyle |= SS_INMOTION;
                    647: 
                    648:           else
                    649: 
                    650:             gpccs->flStyle &= ~SS_INMOTION;
                    651: 
                    652:           break;
                    653: 
                    654:         case DID_OK:
                    655: 
                    656:           EndDialog  (hDlg, 1);
                    657:           break;
                    658:       }
                    659:       break;
                    660:   }
                    661:   return FALSE;
                    662: }

unix.superglobalmegacorp.com

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