home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / BUG.ZIP / MAIN.C < prev    next >
Text File  |  1991-12-20  |  8KB  |  325 lines

  1. // This is a little program I wrote to investigate Z ordering.  If you
  2. // uncomment the WinCreateWindow and comment out the WinCreateStdWIndow,
  3. // the z ordering doesnt work as well.  There is obviously some msg
  4. // that I am not handling that I should.    Feel free to use what you want
  5. // out of this code.  Paul Montgomery CIS: 71500,3525
  6.  
  7.  
  8. #define INCL_WIN
  9. #define INCL_GPI
  10. #define INCL_DOSDATETIME
  11. #define INCL_DOSPROCESS
  12. #include <os2.h>
  13.  
  14. #define BUG_MOVE_START     (WM_USER + 1)
  15. #define BUG_MOVE           (WM_USER + 2)
  16. #define BUG_JUMP           (WM_USER + 3)
  17. #define BUG_POINTS         (27)
  18.  
  19. LONG iconx,icony;
  20. HAB         hab;
  21. LONG i = 0;
  22. HWND        hframe, hclient;
  23. HBITMAP     hbm;
  24. HWND        old;
  25. BOOL        hidden;
  26. HWND        hwndnext;
  27.  
  28. POINTL      bug[BUG_POINTS] = { 0,0,
  29.                         8,8,
  30.                         8,9,
  31.                         8,8,
  32.                         6,4,
  33.                         7,4,
  34.                         8,5,
  35.                         9,5,
  36.                         8,5,
  37.                         7,4,
  38.                         2,4,
  39.                         1,5,
  40.                         0,5,
  41.                         1,5,
  42.                         2,4,
  43.                         5,1,
  44.                         4,1,
  45.                         3,2,
  46.                         7,2,
  47.                         9,0,
  48.                         1,8,
  49.                         1,9,
  50.                         1,8,
  51.                         3,6,
  52.                         3,5,
  53.                         3,3,
  54.                         6,3 };
  55.  
  56. #pragma linkage ( WinProc,system )
  57. MRESULT WinProc ( HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2 );
  58.  
  59. #pragma linkage ( thread,system )
  60. VOID thread (ULONG arg)
  61. {
  62.    DATETIME  dt;
  63.  
  64.    while (TRUE)
  65.       {
  66.       DosGetDateTime ( &dt );
  67.       DosSleep ( ((LONG)dt.hundredths) * 250L);
  68.       WinPostMsg ( hframe, BUG_JUMP, 0, 0 );
  69.       }
  70. }
  71.  
  72. int main ( int argc, char *argv[] )
  73. {
  74.    QMSG        qmsg;
  75.    HMQ         hmq;
  76.    ULONG       fs;
  77.    TID         tid;
  78.  
  79.    fs =
  80.          FCF_ICON   |
  81.          FCF_TASKLIST   |
  82.          FCF_NOBYTEALIGN
  83.          ;
  84.  
  85.    if((hab = WinInitialize(0)) == 0)
  86.       {
  87.       return(FALSE);
  88.       }
  89.  
  90.    if((hmq = WinCreateMsgQueue(hab, 0)) == 0)
  91.       {
  92.       WinTerminate(hab);
  93.       return(FALSE);
  94.       }
  95.  
  96.    DosCreateThread ( &tid, (PFNTHREAD)thread, 1, 0, 8000 );
  97.  
  98.    WinRegisterClass(hab,
  99.                     "BUG",
  100.                     WinProc,
  101.                     CS_SIZEREDRAW | CS_SYNCPAINT,
  102.                     0);
  103.  
  104.    hframe = WinCreateStdWindow(HWND_DESKTOP,
  105.            0,
  106.            &fs,
  107.            "BUG",
  108.            "",
  109.            0L,
  110.            0L,
  111.            1,
  112.            &hclient);
  113.  
  114. //   hframe = WinCreateWindow ( HWND_DESKTOP,
  115. //            "BUG",
  116. //            NULL,
  117. //            WS_VISIBLE,
  118. //            0,0,
  119. //            0,0,
  120. //            HWND_DESKTOP,
  121. //            HWND_BOTTOM,
  122. //            1,
  123. //            NULL,
  124. //            NULL );
  125.  
  126.    WinSetWindowPos ( hframe, HWND_TOP, 300, 300,
  127.          10, 10,
  128.          SWP_SHOW | SWP_MOVE | SWP_ZORDER | SWP_SIZE );
  129.  
  130.    WinPostMsg ( hframe, BUG_JUMP, 0, 0 );
  131.  
  132.    while(WinGetMsg(hab, &qmsg, 0, 0, 0))
  133.       {
  134.       WinDispatchMsg(hab, &qmsg);
  135.       }
  136.  
  137.    WinDestroyWindow(hframe);
  138.    WinDestroyMsgQueue(hmq);
  139.    WinTerminate(hab);
  140.    return (0);
  141.  
  142. }
  143.  
  144.  
  145. /* **************************************************************
  146.  * Function Name:  WinProc
  147.  *
  148.  * Description: This function is the window procedure for the panel
  149.  *              editor.
  150.  *
  151.  * Parameter      Description
  152.  * --------------------------------------------------------------
  153.  * The normal window parameters
  154.  *
  155.  * Returns:
  156.  *
  157.  * Comments:
  158.  *
  159.  ***************************************************************/
  160.  
  161. MRESULT WinProc ( HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2 )
  162. {
  163.    HPS   hps;
  164.    RECTL rc;
  165.    HENUM henum;
  166.    SWP   swp1, swp2, swp3;
  167.    BOOL  out;
  168.  
  169.    switch (msg)
  170.       {
  171.       case WM_CREATE:
  172.          return (MPARAM)FALSE;
  173.          break;
  174.  
  175.       case WM_BUTTON2DOWN:
  176.          WinPostMsg ( hwnd, BUG_MOVE_START, 0, 0 );
  177.          return (MPARAM)TRUE;
  178.          break;
  179.  
  180.       case WM_BUTTON1DBLCLK:
  181.          WinPostMsg ( hwnd, WM_QUIT, 0L, 0L );
  182.          return (MRESULT) TRUE;
  183.          break;
  184.  
  185.       case WM_ADJUSTWINDOWPOS:
  186.          ((PSWP)mp1)->hwndInsertBehind = HWND_BOTTOM;
  187.          return (MPARAM) NULL;
  188.          break;
  189.  
  190.       case WM_DESTROY:
  191.          WinPostMsg ( hwnd, WM_QUIT, 0L, 0L );
  192.          return (MRESULT) TRUE;
  193.          break;
  194.  
  195.       case WM_TIMER:
  196.          if ((USHORT)mp1 == 1)
  197.             {
  198.             WinPostMsg ( hwnd, BUG_MOVE, (MPARAM)hwndnext, 0 );
  199.             }
  200.          return (MPARAM)NULL;
  201.          break;
  202.  
  203.       case BUG_JUMP:
  204.          WinQueryWindowPos ( hframe, &swp3 );
  205.          if (swp3.x > 30)
  206.             {
  207.             swp3.x -=25;
  208.             }
  209.          else
  210.             {
  211.             swp3.x += 40;
  212.             }
  213.  
  214.          if (swp3.y > 20)
  215.             {
  216.             swp3.y -=18;
  217.             }
  218.          else
  219.             {
  220.             swp3.y +=30;
  221.             }
  222.  
  223.          swp3.fl = SWP_MOVE | SWP_SHOW;
  224.          WinSetMultWindowPos ( hab, &swp3, 1 );
  225.          WinPostMsg ( hwnd, BUG_MOVE_START, 0, 0 );
  226.          return (MPARAM)TRUE;
  227.          break;
  228.  
  229.       case BUG_MOVE_START:
  230.          // we need to determine where to move to and then we need to move
  231.          // there.
  232.  
  233.          henum = WinBeginEnumWindows ( HWND_DESKTOP );
  234.          out = FALSE;
  235.          WinQueryWindowPos ( hframe, &swp1 );
  236.          while (!out)
  237.             {
  238.             hwndnext = WinGetNextWindow  ( henum );
  239.             if (hwndnext != hframe)
  240.                {
  241.                if (hwndnext == NULL)
  242.                   {
  243.                   out = TRUE;
  244.                   }
  245.                else
  246.                   {
  247.                   WinQueryWindowPos ( hwndnext, &swp2 );
  248.                   if ((swp1.cx <= swp2.cx) && (swp1.cy <= swp2.cy))
  249.                      {
  250.                      WinStartTimer ( hab, hwnd, 1, 110 );
  251.                      out = TRUE;
  252.                      }
  253.                   }
  254.                }
  255.             }
  256.          WinEndEnumWindows ( henum );
  257.          return (MPARAM)TRUE;
  258.          break;
  259.  
  260.       case BUG_MOVE:
  261.          // mp1 = hwnd to move under
  262.          if ( WinIsWindowShowing(hwnd) )
  263.             {
  264.             hidden = FALSE;
  265.             // move under the window
  266.             WinQueryWindowPos ( hframe, &swp1 );
  267.             WinQueryWindowPos ( hwndnext, &swp2 );
  268.  
  269.             if ( swp1.x < swp2.x )
  270.                {
  271.                swp1.x += 11;
  272.                }
  273.             else if (swp1.x > swp2.x)
  274.                {
  275.                swp1.x -= 10;
  276.                }
  277.  
  278.             if (swp1.y < swp2.y)
  279.                {
  280.                swp1.y += 7;
  281.                }
  282.             else if (swp1.y > swp2.y)
  283.                {
  284.                swp1.y -= 6;
  285.                }
  286.  
  287.             swp1.hwndInsertBehind = swp2.hwnd;
  288.             swp1.fl = SWP_MOVE | SWP_SHOW | SWP_ZORDER ;
  289.  
  290.             WinSetMultWindowPos ( hab, &swp1, 1 );
  291.             }
  292.          else
  293.             {
  294.             hidden = TRUE;
  295.             WinStopTimer ( hab, hwnd, 1 );
  296.             }
  297.          return (MPARAM) TRUE;
  298.          break;
  299.  
  300.       case WM_PAINT:
  301.          if (hidden)
  302.             {
  303.             WinPostMsg ( hwnd, BUG_MOVE_START, 0, 0 );
  304.             }
  305.  
  306.          hps = WinBeginPaint(hwnd, 0, 0);
  307.  
  308. //         GpiErase ( hps );
  309.          WinQueryWindowRect(hwnd, &rc);
  310.  
  311.          WinFillRect(hps, &rc, CLR_BACKGROUND);
  312.  
  313.          GpiMove ( hps, (PPOINTL) &bug[0] );
  314.          GpiPolyLine ( hps, BUG_POINTS, &bug[0] );
  315.  
  316.          WinEndPaint(hps);
  317.  
  318.          return (MPARAM)TRUE;
  319.          break;
  320.  
  321.       }
  322.  
  323. return(WinDefWindowProc(hwnd, msg, mp1, mp2));
  324. }
  325.