home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / msysjour / vol04 / 01b / macsl / mpmmenu.c < prev    next >
C/C++ Source or Header  |  1988-10-03  |  5KB  |  164 lines

  1. /*-----------------------------------------------------------------*/
  2. /* MpmMenu.c                                                       */
  3. /* Menu functions                                                  */
  4. /*-----------------------------------------------------------------*/
  5.  
  6. #include "MacPM.h"
  7.  
  8. /*-----------------------------------------------------------------*/
  9.  
  10. SHORT       _sAppleCount;
  11.  
  12. /*-----------------------------------------------------------------*/
  13. /* Window function for the menu window class.                      */
  14. /* Note that this handles the Mac's menu, the zoom box, and the    */
  15. /* close box, since these are all menus in PM.                     */
  16. /*-----------------------------------------------------------------*/
  17.  
  18. MRESULT EXPENTRY MpmFnwpMenu( hwnd, msg, mp1, mp2 )
  19.     HWND        hwnd;
  20.     USHORT      msg;
  21.     MPARAM      mp1;
  22.     MPARAM      mp2;
  23. {
  24.     Point       point;
  25.     HWND        hwndOwner;
  26.     LONG        lMenuID;
  27.     USHORT      usMenuID;
  28.     MenuHandle  hmenu;
  29.  
  30.     if( ! MpmValidateWindow(hwnd) )
  31.       return FALSE;
  32.  
  33.     hwndOwner = MYWNDOF(hwnd).hwndOwner;
  34.     ASSERT( hwndOwner,
  35.             "MpmFnwpMenu: no owner" );
  36.  
  37.     switch( msg )
  38.     {
  39.       /* Button down - see which it is and handle it */
  40.  
  41.       case WM_BUTTON1DOWN:
  42.         point.h = MOUSEMSG(&msg)->x;
  43.         point.v = _alSysVal[SV_CYSCREEN] - MOUSEMSG(&msg)->y;
  44.         switch( MYWNDOF(hwnd).id )
  45.         {
  46.           /* Menu bar: track mouse, then open a desk accessory or
  47.              send a WM_COMMAND msg */
  48.  
  49.           case FID_MENU:
  50.             WinSendMsg( hwndOwner, WM_INITMENU,
  51.                         MPFROMSHORT(usMenuID),
  52.                         MPFROMP(hwnd) );
  53.             lMenuID = MenuSelect( point );
  54.             hmenu = GetMHandle( HIUSHORT(lMenuID) );
  55.             if( hmenu == (**(MbarHandle)MenuList).mlist[0].hmenu  &&
  56.                 LOUSHORT(lMenuID) > _sAppleCount )
  57.             {
  58.               Str255  strDAName;
  59.               GetItem( hmenu, LOUSHORT(lMenuID), (char*)strDAName );
  60.               OpenDeskAcc( (char*)strDAName );
  61.               return 0L;
  62.             }
  63.             if( ! HIUSHORT(lMenuID) )
  64.               return 0L;
  65.             usMenuID = ( HIUSHORT(lMenuID) << 8 )  +
  66.                        ( LOUSHORT(lMenuID) & 0xFF );
  67.             WinSendMsg( hwndOwner, WM_COMMAND,
  68.                         MPFROMSHORT(usMenuID),
  69.                         MPFROM2SHORT( CMDSRC_MENU, FALSE /*?*/ ) );
  70.             HiliteMenu( 0 );
  71.             return 0L;
  72.  
  73.           /* Zoom box: track mouse, send SC_RESTORE or SC_MAXIMIZE */
  74.  
  75.           case FID_MINMAX:
  76.             if( TrackBox( MYWNDOF(hwnd).pwin, point,
  77.                           SHORT2FROMMP(mp2) ) )
  78.               WinSendMsg( hwndOwner, WM_SYSCOMMAND,
  79.                           MPFROMSHORT( SHORT2FROMMP(mp2) == inZoomIn
  80.                                          ? SC_RESTORE
  81.                                          : SC_MAXIMIZE ),
  82.                           MPFROM2SHORT( CMDSRC_MENU, FALSE /*?*/ ) );
  83.             return 0L;
  84.  
  85.           /* Close box: track mouse and send SC_CLOSE */
  86.  
  87.           case FID_SYSMENU:
  88.             if( TrackGoAway( MYWNDOF(hwnd).pwin, point ) )
  89.               WinSendMsg( hwndOwner, WM_SYSCOMMAND,
  90.                           MPFROMSHORT( SC_CLOSE ),
  91.                           MPFROM2SHORT( CMDSRC_MENU, FALSE /*?*/ ) );
  92.             return 0L;
  93.         }
  94.         return 0L;
  95.  
  96.       /* WM_CREATE and WM_DESTROY manipulate the static _hwndMenu,
  97.          only for the menu bar itself */
  98.  
  99.       case WM_CREATE:
  100.         if( MYWNDOF(hwnd).id == FID_MENU )
  101.         {
  102.           ASSERT( ! _hwndMenu,
  103.                   "MpmFnwpMenu: more than one menu" );
  104.           _hwndMenu = hwnd;
  105.         }
  106.         return 0L;
  107.         
  108.       case WM_DESTROY:
  109.         if( MYWNDOF(hwnd).id == FID_MENU )
  110.           _hwndMenu = NULL;
  111.         return 0L;
  112.  
  113.       /* WM_INITMENU is just passed along to the owner */
  114.         
  115.       case WM_INITMENU:
  116.         return WinSendMsg( hwndOwner, msg, mp1, mp2 );
  117.     }
  118.     return 0L;
  119.     
  120.     return WinDefWindowProc( hwnd, msg, mp1, mp2 );
  121. }
  122.  
  123. /*-----------------------------------------------------------------*/
  124. /* Load the menu bar from the resource file, using idResources.    */
  125. /*-----------------------------------------------------------------*/
  126.  
  127. LOCAL BOOL MpmMenuLoad( hwndFrame, idResources )
  128.     HWND        hwndFrame;
  129.     USHORT      idResources;
  130. {
  131.     MbarHandle  hmbar;
  132.     MbarPtr     pmbar;
  133.     SHORT       sMenuCount;
  134.     MenuHandle  hmenu;
  135.  
  136.     hmbar = (MbarHandle)GetNewMBar( idResources );
  137.     if( ! hmbar )
  138.       return FALSE;
  139.  
  140.     sMenuCount = MENUCOUNTOFHMBAR( hmbar );
  141.     ASSERT( sMenuCount > 0,
  142.             "MpmMenuLoad: null menu bar?" );
  143.  
  144.     SetMenuBar( hmbar );
  145.     DisposHandle( (Handle)hmbar );
  146.  
  147.     hmbar = (MbarHandle)MenuList;
  148.  
  149.     hmenu = (**hmbar).mlist[0].hmenu;
  150.  
  151.     ASSERT( hmenu,
  152.             "MpmMenuLoad: no apple menu?" );
  153.  
  154.     _sAppleCount = CountMItems( hmenu );
  155.  
  156.     AddResMenu( hmenu, 'DRVR' );
  157.  
  158.     DrawMenuBar();
  159.  
  160.     return TRUE;
  161. }
  162.  
  163. /*-----------------------------------------------------------------*/
  164.