SPINTEST.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:8k
源码类别:

Windows编程

开发平台:

Visual C++

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