home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: OtherApp / OtherApp.zip / osm2_102.zip / window.c < prev   
C/C++ Source or Header  |  1999-02-01  |  10KB  |  387 lines

  1. /*
  2.  * window.c - Create/Dispose Windows
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7.  
  8. #define INCL_PM
  9. #include <os2.h>
  10.  
  11. #include "shapewin.h"
  12.  
  13. #include "osmulti2.h"
  14. #include "osmulres.h"
  15.  
  16. /*
  17.  * Windows to Use
  18.  */
  19.  
  20. HWND    hwndFrame = NULLHANDLE ;    /* Invisible Frame Window   */
  21. HWND    hwndShape = NULLHANDLE ;    /* Shape Window for Bitmap  */
  22. HWND    hwndTalk  = NULLHANDLE ;    /* Shape Window for Message */
  23.  
  24. /*
  25.  * Mouse Pointers
  26.  */
  27.  
  28. static  HPOINTER    pointerNade = NULLHANDLE ;
  29. static  HPOINTER    pointerFuni = NULLHANDLE ;
  30.  
  31. static  BOOL        captureNade = FALSE ;
  32. static  BOOL        captureFuni = FALSE ;
  33.  
  34. /*
  35.  * doMouseDn/Up - process WM_BUTTON1DOWN/WM_BUTTON1UP
  36.  */
  37.  
  38. static  void    doMouseDn(HWND hwnd)
  39. {
  40.     POINTL  pt ;
  41.     
  42.     WinQueryPointerPos(HWND_DESKTOP, &pt) ;
  43.     WinMapWindowPoints(HWND_DESKTOP, hwnd, &pt, 1) ;
  44.  
  45.     if (captureNade || captureFuni) {
  46.         return ;
  47.     }
  48.     if (bitmapAtNade(&pt)) {
  49.     WinSetPointer(HWND_DESKTOP, pointerNade) ;
  50.         WinSetCapture(HWND_DESKTOP, hwnd) ;
  51.     captureNade = TRUE ;
  52.     return ;
  53.     }
  54.     if (bitmapAtFuni(&pt)) {
  55.     WinSetPointer(HWND_DESKTOP, pointerFuni) ;
  56.     animeFuni() ;
  57.         WinSetCapture(HWND_DESKTOP, hwnd) ;
  58.     captureFuni = TRUE ;
  59.     return ;
  60.     }
  61. }
  62.  
  63. static  void    doMouseUp(HWND hwnd)
  64. {
  65.     if (captureNade || captureFuni) {
  66.         WinSetCapture(HWND_DESKTOP, NULLHANDLE) ;
  67.     captureNade = captureFuni = FALSE ;
  68.     }
  69. }
  70.  
  71. /*
  72.  * doMouseMove - process WM_MOUSEMOVE message
  73.  */
  74.  
  75. static  BOOL    doMouseMove(HWND hwnd)
  76. {
  77.     POINTL  pt ;
  78.     
  79.     WinQueryPointerPos(HWND_DESKTOP, &pt) ;
  80.     WinMapWindowPoints(HWND_DESKTOP, hwnd, &pt, 1) ;
  81.  
  82.     if (captureNade) {
  83.         WinSetPointer(HWND_DESKTOP, pointerNade) ;
  84.     animeNade() ;
  85.     return TRUE ;
  86.     }
  87.     if (captureFuni) {
  88.         WinSetPointer(HWND_DESKTOP, pointerFuni) ;
  89.     return TRUE ;
  90.     }
  91.     if (bitmapAtNade(&pt) || bitmapAtFuni(&pt)) {
  92.         WinSetPointer(HWND_DESKTOP, pointerNade) ;
  93.     return TRUE ;
  94.     }
  95.     return FALSE ;
  96. }
  97.  
  98. /*
  99.  * contextMenu - menu with (right) mouse click
  100.  */
  101.  
  102. static  HWND    hwndPopup = NULLHANDLE ;
  103.  
  104. static  void    contextMenu(void)
  105. {
  106.     POINTL  pt   ;
  107.     SWP     swp  ;
  108.     ULONG   opts ;
  109.     ULONG   idMenu ;
  110.     
  111.     switch (ProgramLang) {
  112.         case NLS_JA : idMenu = IDM_POPUP  ; break ;
  113.     case NLS_EN : idMenu = IDM_POPUPE ; break ;
  114.     default     : idMenu = IDM_POPUPE ; break ;
  115.     }
  116.     
  117.     if (hwndPopup == NULLHANDLE) {
  118.         hwndPopup = WinLoadMenu(hwndFrame, NULLHANDLE, idMenu) ;
  119.     }
  120.     if (hwndPopup == NULLHANDLE) {
  121.         TRACE("failed to load popup menu\n") ;
  122.         return ;
  123.     }
  124.     WinQueryPointerPos(HWND_DESKTOP, &pt) ;
  125.     WinQueryWindowPos(hwndFrame, &swp) ;
  126.     
  127.     if (pt.x < swp.x || pt.x > (swp.x + swp.cx)) {
  128.         return ;
  129.     }
  130.     if (pt.y < swp.y || pt.y > (swp.y + swp.cy)) {
  131.         return ;
  132.     }
  133.  
  134.     opts = PU_POSITIONONITEM | PU_HCONSTRAIN | PU_VCONSTRAIN |
  135.                  PU_KEYBOARD | PU_MOUSEBUTTON1 | PU_MOUSEBUTTON2 ;
  136.  
  137.     WinPopupMenu(HWND_DESKTOP, hwndFrame, hwndPopup,
  138.                                 pt.x, pt.y, IDM_SETUP, opts) ;
  139. }
  140.  
  141. /*
  142.  * procFrame - subclassed frame window procedure
  143.  */
  144.  
  145. static  PFNWP   pfnFrame ;      /* original frame window procedure  */
  146.  
  147. static MRESULT EXPENTRY procFrame(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  148. {
  149.     PSWP    pswp ;
  150.  
  151.     switch (msg) {
  152.  
  153.     case WM_ADJUSTWINDOWPOS :
  154.         pswp = (PSWP) PVOIDFROMMP(mp1) ;
  155.         WinSetWindowPos(hwndShape, pswp->hwndInsertBehind,
  156.                     pswp->x, pswp->y, pswp->cx, pswp->cy, pswp->fl) ;
  157.         pswp->fl &= ~SWP_SHOW ;
  158.         pswp->fl |=  SWP_HIDE ;
  159.         return (*pfnFrame) (hwnd, msg, mp1, mp2) ;
  160.  
  161.     case WM_BUTTON1DOWN :
  162.         doMouseDn(hwnd) ;
  163.     return (MRESULT) 0 ;
  164.  
  165.     case WM_BUTTON1UP :
  166.         doMouseUp(hwnd) ;
  167.     return (MRESULT) 0 ;
  168.  
  169.     case WM_MOUSEMOVE :
  170.         if (doMouseMove(hwnd)) {
  171.         return (MRESULT) 0 ;
  172.     }
  173.         break ;     /* fall to default procedure */
  174.     
  175.     case WM_BUTTON2DOWN :
  176.         contextMenu() ;
  177.     return (MRESULT) 0 ;
  178.  
  179.     case WM_TIMER :
  180.         trackFocus(WinQueryAnchorBlock(hwnd)) ;
  181.     animeTimer() ;
  182.         return (MRESULT) 0 ;
  183.  
  184.     case WM_COMMAND :
  185.         switch (SHORT1FROMMP(mp1)) {
  186.  
  187.     case IDM_SETUP :
  188.         setupDialog() ;
  189.         return (MRESULT) 0 ;
  190.     case IDM_ABOUT :
  191.         aboutDialog() ;
  192.         return (MRESULT) 0 ;
  193.  
  194.     case IDM_EXIT :
  195.         WinShowWindow(hwndShape, FALSE) ;
  196.         WinShowWindow(hwndTalk,  FALSE) ;
  197.         WinPostMsg(hwnd, WM_CLOSE, NULL, NULL) ;
  198.         return (MRESULT) 0 ;
  199.         }
  200.         return (MRESULT) 0 ;
  201.     }
  202.  
  203.     return (*pfnFrame) (hwnd, msg, mp1, mp2) ;
  204. }
  205.  
  206. /*
  207.  * createFrame - create frame window
  208.  */
  209.  
  210. #ifndef WS_TOPMOST
  211. #define WS_TOPMOST  0x00200000
  212. #endif
  213.  
  214. static  void    createFrame(HAB hab)
  215. {
  216.     FRAMECDATA  fcd    ;
  217.  
  218.     memset(&fcd, 0, sizeof(fcd)) ;
  219.     fcd.cb = sizeof(fcd) ;
  220.     fcd.flCreateFlags = (FCF_TASKLIST | FCF_ICON) ;
  221.     fcd.hmodResources = NULLHANDLE ;
  222.     fcd.idResources   = ID_OSMULTI ;
  223.  
  224.     hwndFrame = WinCreateWindow(
  225.             HWND_DESKTOP,           /* Parent window handle     */
  226.             WC_FRAME,               /* Frame Window Class       */
  227.             ProgramName,            /* as Title                 */
  228.             WS_TOPMOST,             /* Window Style             */
  229.             0, 0, 0, 0,             /* Position & size          */
  230.             NULLHANDLE,             /* Owner Window             */
  231.             HWND_TOP,               /* Z-Order                  */
  232.             0,                      /* Window ID                */
  233.             &fcd,                   /* Control Data             */
  234.             NULL) ;                 /* Presentation Parameter   */
  235.  
  236.     if (hwndFrame == NULLHANDLE) {
  237.         return ;
  238.     }
  239.  
  240.     pfnFrame = WinSubclassWindow(hwndFrame, procFrame) ;
  241.  
  242.     WinSendMsg(hwndFrame, WM_SETICON,
  243.         MPFROMP(WinLoadPointer(HWND_DESKTOP, NULLHANDLE, ID_OSMULTI)), NULL) ;
  244. }
  245.  
  246. /*
  247.  * createShape - create shape window
  248.  */
  249.  
  250. static  void    createShape(HAB hab)
  251. {
  252.     BITMAPINFOHEADER2   bmi ;
  253.     SHAPEWIN    shpctrl ;
  254.  
  255.     if (hwndFrame == NULLHANDLE || 
  256.             hpsBitmap == NULLHANDLE || hpsBalloon == NULLHANDLE) {
  257.         return ;
  258.     }
  259.  
  260.     /*
  261.      * Register Window Class
  262.      */
  263.  
  264.     WinRegisterClass(hab, ShapeWinName, ShapeWinProc, 0L, sizeof(PVOID)) ;
  265.  
  266.     /*
  267.      * Create Shape Window for Bitmap
  268.      */
  269.  
  270.     bmi.cbFix = sizeof(bmi) ;
  271.     GpiQueryBitmapInfoHeader(hbmBitmap, &bmi) ;
  272.  
  273.     shpctrl.cx = bmi.cx ;
  274.     shpctrl.cy = bmi.cy ;
  275.     shpctrl.hpsDraw = hpsBitmap ;
  276.     shpctrl.hpsMask = hpsBitmap ;
  277.  
  278.     hwndShape = WinCreateWindow(
  279.             HWND_DESKTOP,           /* Parent Window    */
  280.             ShapeWinName,           /* Window Class     */
  281.             "",                     /* Window Text      */
  282.             WS_TOPMOST,             /* Window Style     */
  283.             0, 0, 0, 0,             /* Pos & Size       */
  284.             hwndFrame,              /* Owner Window     */
  285.             HWND_TOP,               /* Z-Order          */
  286.             0,                      /* Window ID        */
  287.             &shpctrl,               /* Control Data     */
  288.             NULL) ;                 /* Pres. Param.     */
  289.  
  290.     /*
  291.      * Create Shape Window for Message Balloon
  292.      */
  293.  
  294.     bmi.cbFix = sizeof(bmi) ;
  295.     GpiQueryBitmapInfoHeader(hbmBalloon, &bmi) ;
  296.  
  297.     shpctrl.cx = bmi.cx ;
  298.     shpctrl.cy = bmi.cy ;
  299.     shpctrl.hpsDraw = hpsBalloon ;
  300.     shpctrl.hpsMask = hpsBalloon ;
  301.  
  302.     hwndTalk  = WinCreateWindow(
  303.             HWND_DESKTOP,           /* Parent Window    */
  304.             ShapeWinName,           /* Window Class     */
  305.             "",                     /* Window Text      */
  306.             WS_TOPMOST,             /* Window Style     */
  307.             0, 0, 0, 0,             /* Pos & Size       */
  308.             hwndFrame,              /* Owner Window     */
  309.             HWND_TOP,               /* Z-Order          */
  310.             1,                      /* Window ID        */
  311.             &shpctrl,               /* Control Data     */
  312.             NULL) ;                 /* Pres. Param.     */
  313.  
  314. }
  315.  
  316. /*
  317.  * windowDispose - dispose window & related resources
  318.  */
  319.  
  320. void    windowDispose(HAB hab)
  321. {
  322.     WinStopTimer(hab, hwndFrame, TIMER_ID) ;
  323.     
  324.     bitmapDispose()  ;
  325.     balloonDispose() ;
  326.  
  327.     if (pointerNade != NULLHANDLE) {
  328.         WinDestroyPointer(pointerNade) ;
  329.     pointerNade = NULLHANDLE ;
  330.     }
  331.     if (pointerFuni != NULLHANDLE) {
  332.         WinDestroyPointer(pointerFuni) ;
  333.     pointerFuni = NULLHANDLE ;
  334.     }
  335.  
  336.     if (hwndShape != NULLHANDLE) {
  337.         WinDestroyWindow(hwndShape) ;
  338.     hwndShape = NULLHANDLE ;
  339.     }
  340.     if (hwndTalk != NULLHANDLE) {
  341.         WinDestroyWindow(hwndTalk) ;
  342.     hwndTalk = NULLHANDLE ;
  343.     }
  344.     if (hwndFrame != NULLHANDLE) {
  345.         WinDestroyWindow(hwndFrame) ;
  346.     hwndFrame = NULLHANDLE ;
  347.     }
  348. }
  349.  
  350. /*
  351.  * windowCreate - create windows
  352.  */
  353.  
  354. BOOL    windowCreate(HAB hab)
  355. {
  356.     pointerNade = WinLoadPointer(HWND_DESKTOP, NULLHANDLE, ID_PTRNADE) ;
  357.     pointerFuni = WinLoadPointer(HWND_DESKTOP, NULLHANDLE, ID_PTRFUNI) ;
  358.     
  359.     if (bitmapCreate(hab) != TRUE) {
  360.         return FALSE ;
  361.     }
  362.     if (balloonCreate(hab) != TRUE) {
  363.         return FALSE ;
  364.     }
  365.     
  366.     /*
  367.      * Create Windows
  368.      */
  369.  
  370.     createFrame(hab) ;
  371.     createShape(hab) ;
  372.     
  373.     if (hwndFrame == NULLHANDLE ||
  374.                 hwndShape == NULLHANDLE || hwndTalk == NULLHANDLE) {
  375.         windowDispose(hab) ;
  376.     return FALSE ;
  377.     }
  378.  
  379.     trackFocus(hab) ;
  380.     
  381.     if (WinStartTimer(hab, hwndFrame, TIMER_ID, TIMER_MS) == 0) {
  382.         windowDispose(hab) ;
  383.     return FALSE ;
  384.     }
  385.     return TRUE ;
  386. }
  387.