home *** CD-ROM | disk | FTP | other *** search
/ High Voltage Shareware / high1.zip / high1 / DIR4 / V12N15.ZIP / MULTI.ZIP / MULTI2.C < prev    next >
C/C++ Source or Header  |  1993-06-03  |  10KB  |  350 lines

  1. /*---------------------------------------
  2.    MULTI2.C -- Multitasking Demo
  3.                (c) Charles Petzold, 1993
  4.   ---------------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <math.h>
  10. #include <process.h>
  11.  
  12. typedef struct
  13.      {
  14.      HWND  hwnd ;
  15.      short cxClient ;
  16.      short cyClient ;
  17.      BOOL  bKill ;
  18.      }
  19.      PARAMS, * PPARAMS ;
  20.  
  21. LONG APIENTRY WndProcMain (HWND, UINT, DWORD, LONG) ;
  22.  
  23. short cyChar ;
  24.  
  25. int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,
  26.                     LPSTR lpszCmdParam, int nCmdShow)
  27.      {
  28.      static char szAppName[] = "Multi2" ;
  29.      HWND        hwnd ;
  30.      MSG         msg ;
  31.      WNDCLASS    wndclass ;
  32.  
  33.      wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  34.      wndclass.lpfnWndProc   = WndProcMain ;
  35.      wndclass.cbClsExtra    = 0 ;
  36.      wndclass.cbWndExtra    = 0 ;
  37.      wndclass.hInstance     = hInstance ;
  38.      wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
  39.      wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  40.      wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
  41.      wndclass.lpszMenuName  = NULL ;
  42.      wndclass.lpszClassName = szAppName ;
  43.  
  44.      RegisterClass (&wndclass) ;
  45.  
  46.      hwnd = CreateWindow (szAppName, "Multitasking Demo",
  47.                           WS_OVERLAPPEDWINDOW,
  48.                           CW_USEDEFAULT, CW_USEDEFAULT,
  49.                           CW_USEDEFAULT, CW_USEDEFAULT,
  50.                           NULL, NULL, hInstance, NULL) ;
  51.  
  52.      ShowWindow (hwnd, nCmdShow) ;
  53.      UpdateWindow (hwnd) ;
  54.  
  55.      while (GetMessage (&msg, NULL, 0, 0))
  56.           {
  57.           TranslateMessage (&msg) ;
  58.           DispatchMessage (&msg) ;
  59.           }
  60.      return msg.wParam ;
  61.      }
  62.  
  63. int CheckBottom (HWND hwnd, int cyClient, int iLine)
  64.      {
  65.      if (iLine * cyChar + cyChar > cyClient)
  66.           {
  67.           InvalidateRect (hwnd, NULL, TRUE) ;
  68.           UpdateWindow (hwnd) ;
  69.           iLine = 0 ;
  70.           }
  71.      return iLine ;
  72.      }
  73.  
  74. // Window 1: Display increasing sequence of numbers
  75. // ------------------------------------------------
  76.  
  77. void Thread1 (PPARAMS pparams)
  78.      {
  79.      int  iNum = 0, iLine = 0 ;
  80.      char szBuffer [16] ;
  81.      HDC  hdc ;
  82.  
  83.      while (!pparams->bKill)
  84.           {
  85.           if (iNum < 0)
  86.                iNum = 0 ;
  87.  
  88.           iLine = CheckBottom (pparams->hwnd, pparams->cyClient, iLine) ;
  89.  
  90.           wsprintf (szBuffer, "%d", iNum++) ;
  91.  
  92.           hdc = GetDC (pparams->hwnd) ;
  93.           TextOut (hdc, 0, iLine * cyChar, szBuffer, strlen (szBuffer)) ;
  94.           ReleaseDC (pparams->hwnd, hdc) ;
  95.  
  96.           iLine++ ;
  97.           }
  98.      }
  99.  
  100. LONG APIENTRY WndProc1 (HWND hwnd, UINT message, DWORD wParam, LONG lParam)
  101.      {
  102.      static PARAMS params ;
  103.  
  104.      switch (message)
  105.           {
  106.           case WM_CREATE:
  107.                params.hwnd = hwnd ;
  108.                _beginthread (Thread1, 0, ¶ms) ;
  109.                return 0 ;
  110.  
  111.           case WM_SIZE:
  112.                params.cyClient = HIWORD (lParam) ;
  113.                return 0 ;
  114.  
  115.           case WM_DESTROY:
  116.                params.bKill = TRUE ;
  117.                return 0 ;
  118.           }
  119.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  120.      }
  121.  
  122. // Window 2: Display increasing sequence of prime numbers
  123. // ------------------------------------------------------
  124.  
  125. void Thread2 (PPARAMS pparams)
  126.      {
  127.      char szBuffer [16] ;
  128.      int  iNum = 1, iLine = 0, i, iSqrt ;
  129.      HDC  hdc ;
  130.  
  131.      while (!pparams->bKill)
  132.           {
  133.           do
  134.                {
  135.                if (++iNum < 0)
  136.                     iNum = 0 ;
  137.  
  138.                iSqrt = (int) sqrt (iNum) ;
  139.  
  140.                for (i = 2 ; i <= iSqrt ; i++)
  141.                     if (iNum % i == 0)
  142.                          break ;
  143.                }
  144.           while (i <= iSqrt) ;
  145.  
  146.           iLine = CheckBottom (pparams->hwnd, pparams->cyClient, iLine) ;
  147.  
  148.           wsprintf (szBuffer, "%d", iNum) ;
  149.  
  150.           hdc = GetDC (pparams->hwnd) ;
  151.           TextOut (hdc, 0, iLine * cyChar, szBuffer, strlen (szBuffer)) ;
  152.           ReleaseDC (pparams->hwnd, hdc) ;
  153.  
  154.           iLine++ ;
  155.           }
  156.      }
  157.  
  158. LONG APIENTRY WndProc2 (HWND hwnd, UINT message, DWORD wParam, LONG lParam)
  159.      {
  160.      static PARAMS params ;
  161.  
  162.      switch (message)
  163.           {
  164.           case WM_CREATE:
  165.                params.hwnd = hwnd ;
  166.                _beginthread (Thread2, 0, ¶ms) ;
  167.                return 0 ;
  168.  
  169.           case WM_SIZE:
  170.                params.cyClient = HIWORD (lParam) ;
  171.                return 0 ;
  172.  
  173.           case WM_DESTROY:
  174.                params.bKill = TRUE ;
  175.                return 0 ;
  176.           }
  177.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  178.      }
  179.  
  180. // Window 3: Display increasing sequence of Fibonacci numbers
  181. // ----------------------------------------------------------
  182.  
  183. void Thread3 (PPARAMS pparams)
  184.      {
  185.      char szBuffer [16] ;
  186.      int  iNum = 0, iNext = 1, iLine = 0, iTemp ;
  187.      HDC  hdc ;
  188.  
  189.      while (!pparams->bKill)
  190.           {
  191.           if (iNum < 0)
  192.                {
  193.                iNum  = 0 ;
  194.                iNext = 1 ;
  195.                }
  196.  
  197.           iLine = CheckBottom (pparams->hwnd, pparams->cyClient, iLine) ;
  198.  
  199.           wsprintf (szBuffer, "%d", iNum) ;
  200.  
  201.           hdc = GetDC (pparams->hwnd) ;
  202.           TextOut (hdc, 0, iLine * cyChar, szBuffer, strlen (szBuffer)) ;
  203.           ReleaseDC (pparams->hwnd, hdc) ;
  204.  
  205.           iTemp  = iNum ;
  206.           iNum   = iNext ;
  207.           iNext += iTemp ;
  208.  
  209.           iLine++ ;
  210.           }
  211.      }
  212.  
  213. LONG APIENTRY WndProc3 (HWND hwnd, UINT message, DWORD wParam, LONG lParam)
  214.      {
  215.      static PARAMS params ;
  216.  
  217.      switch (message)
  218.           {
  219.           case WM_CREATE:
  220.                params.hwnd = hwnd ;
  221.                _beginthread (Thread3, 0, ¶ms) ;
  222.                return 0 ;
  223.  
  224.           case WM_SIZE:
  225.                params.cyClient = HIWORD (lParam) ;
  226.                return 0 ;
  227.  
  228.           case WM_DESTROY:
  229.                params.bKill = TRUE ;
  230.                return 0 ;
  231.           }
  232.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  233.      }
  234.  
  235. // Window 4: Display circles of random radii
  236. // -----------------------------------------
  237.  
  238. void Thread4 (PPARAMS pparams)
  239.      {
  240.      HDC hdc ;
  241.      int iDiameter ;
  242.  
  243.      while (!pparams->bKill)
  244.           {
  245.           InvalidateRect (pparams->hwnd, NULL, TRUE) ;
  246.           UpdateWindow (pparams->hwnd) ;
  247.  
  248.           iDiameter = rand() % min (pparams->cxClient, pparams->cyClient) ;
  249.  
  250.           hdc = GetDC (pparams->hwnd) ;
  251.  
  252.           Ellipse (hdc, (pparams->cxClient - iDiameter) / 2,
  253.                         (pparams->cyClient - iDiameter) / 2,
  254.                         (pparams->cxClient + iDiameter) / 2,
  255.                         (pparams->cyClient + iDiameter) / 2) ;
  256.  
  257.           ReleaseDC (pparams->hwnd, hdc) ;
  258.           }
  259.      }
  260.  
  261. LONG APIENTRY WndProc4 (HWND hwnd, UINT message, DWORD wParam, LONG lParam)
  262.      {
  263.      static PARAMS params ;
  264.  
  265.      switch (message)
  266.           {
  267.           case WM_CREATE:
  268.                params.hwnd = hwnd ;
  269.                _beginthread (Thread4, 0, ¶ms) ;
  270.                return 0 ;
  271.  
  272.           case WM_SIZE:
  273.                params.cxClient = LOWORD (lParam) ;
  274.                params.cyClient = HIWORD (lParam) ;
  275.                return 0 ;
  276.  
  277.           case WM_DESTROY:
  278.                params.bKill = TRUE ;
  279.                return 0 ;
  280.           }
  281.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  282.      }
  283.  
  284. // Main window to create child windows
  285. // -----------------------------------
  286.  
  287. LONG APIENTRY WndProcMain (HWND hwnd, UINT message, DWORD wParam, LONG lParam)
  288.      {
  289.      static char  * szChildClass  [] = { "Child1", "Child2",
  290.                                          "Child3", "Child4" } ;
  291.      static HWND    hwndChild [4] ;
  292.      static WNDPROC lpfnChildProc [] = { WndProc1, WndProc2,
  293.                                          WndProc3, WndProc4 } ;
  294.      HINSTANCE      hInstance ;
  295.      int            i ;
  296.      short          cxClient, cyClient ;
  297.      WNDCLASS       wndclass ;
  298.  
  299.      switch (message)
  300.           {
  301.           case WM_CREATE:
  302.                hInstance = (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE) ;
  303.  
  304.                wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  305.                wndclass.cbClsExtra    = 0 ;
  306.                wndclass.cbWndExtra    = 0 ;
  307.                wndclass.hInstance     = hInstance ;
  308.                wndclass.hIcon         = NULL ;
  309.                wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  310.                wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
  311.                wndclass.lpszMenuName  = NULL ;
  312.  
  313.                for (i = 0 ; i < 4 ; i++)
  314.                     {
  315.                     wndclass.lpfnWndProc   = lpfnChildProc [i] ;
  316.                     wndclass.lpszClassName = szChildClass [i] ;
  317.  
  318.                     RegisterClass (&wndclass) ;
  319.  
  320.                     hwndChild [i] = CreateWindow (szChildClass [i], NULL,
  321.                           WS_CHILDWINDOW | WS_BORDER | WS_VISIBLE,
  322.                           0, 0, 0, 0, hwnd, (HMENU) i, hInstance, NULL) ;
  323.                     }
  324.  
  325.                cyChar = HIWORD (GetDialogBaseUnits ()) ;
  326.                return 0 ;
  327.  
  328.           case WM_SIZE:
  329.                cxClient = LOWORD (lParam) ;
  330.                cyClient = HIWORD (lParam) ;
  331.  
  332.                for (i = 0 ; i < 4 ; i++)
  333.                     MoveWindow (hwndChild [i], (i % 2) * cxClient / 2,
  334.                                                (i > 1) * cyClient / 2,
  335.                                 cxClient / 2, cyClient / 2, TRUE) ;
  336.                return 0 ;
  337.  
  338.           case WM_CHAR:
  339.                if (wParam == '\x1B')
  340.                     DestroyWindow (hwnd) ;
  341.  
  342.                return 0 ;
  343.  
  344.           case WM_DESTROY:
  345.                PostQuitMessage (0) ;
  346.                return 0 ;
  347.           }
  348.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  349.      }
  350.