home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / winui / controls / spincube / spintest.c < prev    next >
C/C++ Source or Header  |  1997-10-05  |  8KB  |  266 lines

  1. /******************************************************************************\
  2. *
  3. *  PROGRAM:     SPINTEST.C
  4. *
  5. *  PURPOSE:     Demonstrates the use of the SPINCUBE custom control.
  6. *
  7. *  FUNCTIONS:   WinMain        - standard stuff; also loads the
  8. *                                  SPINCUBE.DLL and creates a couple
  9. *                                  of spincube controls.
  10. *               MainWndProc    - generic window procedure.
  11. *               SpintestDlgProc- generic dialog procedure.
  12. *               AboutDlgProc   - processes about dialog messages
  13. *
  14. *                           Microsoft Developer Support
  15. *                  Copyright (c) 1992-1997 Microsoft Corporation
  16. *
  17. \******************************************************************************/
  18.  
  19. #include <windows.h>
  20. #include <stdio.h>
  21. #include "spintest.h"
  22.  
  23. //
  24. // The exported variables from SPINCUBE.C.
  25. //
  26. //   Although pointers to these vars are actually exported,
  27. //    the compiler will take care of that for us.
  28. //
  29.  
  30. extern int __declspec(dllimport) giNumSpincubesThisProcess;
  31. extern int __declspec(dllimport) giNumSpincubesAllProcesses;
  32.  
  33.  
  34. //
  35. // function prototype for looking up string resources
  36. //
  37.  
  38. LPTSTR GetStringRes (int);
  39.  
  40.  
  41. /******************************************************************************\
  42. *
  43. *  FUNCTION:    WinMain (standard WinMain INPUTS/RETURNS)
  44. *
  45. \******************************************************************************/
  46.  
  47. int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,
  48.                    int     nCmdShow)
  49. {
  50.   WNDCLASS wc;
  51.   HWND   hwnd;
  52.   MSG    msg;
  53.   RECT   rect;
  54.   WORD   i;
  55.  
  56.   wc.style         = 0;
  57.   wc.lpfnWndProc   = (WNDPROC) MainWndProc;
  58.   wc.cbClsExtra    = 0;
  59.   wc.cbWndExtra    = 0;
  60.   wc.hInstance     = hInstance;
  61.   wc.hIcon         = LoadIcon (hInstance, "spintesticon");
  62.   wc.hCursor       = LoadCursor (NULL, IDC_ARROW);
  63.   wc.hbrBackground = GetStockObject (WHITE_BRUSH);
  64.   wc.lpszMenuName  = (LPSTR) "Menu";
  65.   wc.lpszClassName = (LPSTR) "Main";
  66.  
  67.   if (!RegisterClass (&wc))
  68.   {
  69.     MessageBox (NULL,
  70.                 GetStringRes (IDS_REGCLASSFAIL),
  71.                 "SPINTEST", MB_OK | MB_ICONEXCLAMATION);
  72.     return(FALSE);
  73.   }
  74.  
  75.   ghInst = hInstance;
  76.   if (!(hwnd = CreateWindow ("Main",
  77.                              GetStringRes (IDS_WINDOWTITLE),
  78.                              WS_OVERLAPPEDWINDOW,
  79.                              CW_USEDEFAULT, CW_USEDEFAULT,
  80.                              CW_USEDEFAULT, CW_USEDEFAULT,
  81.                              NULL, NULL, ghInst, NULL)))
  82.     return 0;
  83.  
  84.  
  85.   //
  86.   // Create a couple of SpinCube custom controls, we'll size them later in
  87.   //   the WM_SIZE message handler
  88.   //
  89.  
  90.   for (i = 0; i < 4; i++)
  91.  
  92.     gahwndSpin[i] = CreateWindow ("Spincube", "",
  93.                                   WS_VISIBLE | WS_CHILD |
  94.                                   SS_INMOTION | SS_ERASE,
  95.                                   0, 0, 0, 0, hwnd, NULL, NULL, NULL);
  96.  
  97.  
  98.   //
  99.   // Delete the SS_ERASE to the 1st & 4th controls so we get the
  100.   //   trailing cubes effect.
  101.   //
  102.  
  103.   SetWindowLong (gahwndSpin[0], GWL_STYLE,
  104.                  GetWindowLong (gahwndSpin[0], GWL_STYLE) & ~ SS_ERASE);
  105.   SetWindowLong (gahwndSpin[3], GWL_STYLE,
  106.                  GetWindowLong (gahwndSpin[3], GWL_STYLE) & ~ SS_ERASE);
  107.  
  108.  
  109.   //
  110.   // Send ourself a WM_SIZE so the controls will get sized appropriately
  111.   //
  112.  
  113.   GetClientRect (hwnd, &rect);
  114.   SendMessage (hwnd, WM_SIZE, 0,
  115.                MAKELONG((WORD)rect.right,(WORD)rect.bottom));
  116.  
  117.   ShowWindow (hwnd, nCmdShow);
  118.  
  119.   while (GetMessage (&msg, NULL, 0, 0))
  120.   {
  121.     TranslateMessage (&msg);
  122.     DispatchMessage  (&msg);
  123.   }
  124.  
  125.   return (msg.wParam);
  126. }
  127.  
  128.  
  129.  
  130. /******************************************************************************\
  131. *
  132. *  FUNCTION:    MainWndProc (standard window procedure INPUTS/RETURNS)
  133. *
  134. \******************************************************************************/
  135.  
  136. LRESULT CALLBACK MainWndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  137. {
  138.   switch (msg)
  139.   {
  140.     case WM_COMMAND:
  141.  
  142.       switch (LOWORD(wParam))
  143.       {
  144.         case IDM_DLGEDITDIALOG:
  145.  
  146.           DialogBox (ghInst, (LPCTSTR) "SpintestDlg", hwnd, (DLGPROC) DlgProc);
  147.           break;
  148.  
  149.         case IDM_SPINTESTSTATS:
  150.  
  151.           DialogBox (ghInst, (LPCTSTR) "Stats", hwnd, (DLGPROC) DlgProc);
  152.           break;
  153.  
  154.         case IDM_ABOUT:
  155.  
  156.           DialogBox (ghInst, (LPCTSTR)"About", hwnd, (DLGPROC) DlgProc);
  157.           break;
  158.  
  159.       }
  160.       break;
  161.  
  162.     case WM_SIZE:
  163.     {
  164.       //
  165.       // Resize the controls such that each cover half the client area
  166.       //   (plus a little border).
  167.       //
  168.  
  169.       int width  = (int) LOWORD(lParam);
  170.       int height = (int) HIWORD(lParam);
  171.  
  172.       SetWindowPos (gahwndSpin[0], NULL,
  173.                     BORDER, BORDER,
  174.                     width/2 - BORDER, height/2 - BORDER,
  175.                     SWP_SHOWWINDOW);
  176.       SetWindowPos (gahwndSpin[1], NULL,
  177.                     width/2 + BORDER, BORDER,
  178.                     width/2 - 2*BORDER, height/2 - BORDER,
  179.                     SWP_SHOWWINDOW);
  180.       SetWindowPos (gahwndSpin[2], NULL,
  181.                     BORDER, height/2 + BORDER,
  182.                     width/2 - BORDER, height/2 - 2*BORDER,
  183.                     SWP_SHOWWINDOW);
  184.       SetWindowPos (gahwndSpin[3], NULL,
  185.                     width/2 + BORDER, height/2 + BORDER,
  186.                     width/2 - 2*BORDER, height/2 - 2*BORDER,
  187.                     SWP_SHOWWINDOW);
  188.       break;
  189.     }
  190.  
  191.     case WM_DESTROY:
  192.  
  193.       PostQuitMessage (0);
  194.       break;
  195.  
  196.     default:
  197.  
  198.       return (DefWindowProc (hwnd, msg, wParam, lParam));
  199.   }
  200.   return 0;
  201. }
  202.  
  203.  
  204.  
  205. /******************************************************************************\
  206. *
  207. *  FUNCTION:    DlgProc (standard dialog procedure INPUTS/RETURNS)
  208. *
  209. *  COMMENTS:    Our common dlg proc (why have 3 that do the same thing???)
  210. *
  211. \******************************************************************************/
  212.  
  213. LRESULT CALLBACK DlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  214. {
  215.   switch (message)
  216.   {
  217.     case WM_INITDIALOG:
  218.  
  219.       //
  220.       // If this dlg the "Stats" dlg fill in the appropriate fields.
  221.       //   If not these calls will just fail.
  222.       //
  223.       // If the references to the giNum* vars are commented out &
  224.       //   the program gets rebuilt don't be surprised if no spincubes
  225.       //   appear- since no references to spincube.lib the linker will
  226.       //   infer that it is not needed, & will not cause it to get
  227.       //   loaded. You'll need to make a call to LoadLibrary ("SPINCUBE.DLL")
  228.       //   prior to calling CreateWindow ("SPINCUBE"...).
  229.       //
  230.  
  231.       SetDlgItemInt (hwnd, 500, giNumSpincubesThisProcess, TRUE);
  232.       SetDlgItemInt (hwnd, 501, giNumSpincubesAllProcesses, TRUE);
  233.       return (TRUE);
  234.  
  235.     case WM_COMMAND:
  236.  
  237.       if (LOWORD(wParam) == IDOK)
  238.  
  239.         EndDialog (hwnd, TRUE);
  240.  
  241.       return (TRUE);
  242.   }
  243.   return (FALSE);
  244. }
  245.  
  246.  
  247.  
  248. /******************************************************************************\
  249. *
  250. *  FUNCTION:    GetStringRes (int id INPUT ONLY)
  251. *
  252. *  COMMENTS:    Load the resource string with the ID given, and return a
  253. *               pointer to it.  Notice that the buffer is common memory so
  254. *               the string must be used before this call is made a second time.
  255. *
  256. \******************************************************************************/
  257.  
  258. LPTSTR   GetStringRes (int id)
  259. {
  260.   static TCHAR buffer[MAX_PATH];
  261.  
  262.   buffer[0]=0;
  263.   LoadString (GetModuleHandle (NULL), id, buffer, MAX_PATH);
  264.   return buffer;
  265. }
  266.