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

  1. /*-----------------------------------------------------------------*/
  2. /* MpmPaint.c                                                      */
  3. /* Window painting functions                                       */
  4. /*-----------------------------------------------------------------*/
  5.  
  6. #include "MacPM.h"
  7.  
  8. /*-----------------------------------------------------------------*/
  9.  
  10. LOCAL VOID      MpmInvalidateWindow( HWND hwnd );
  11. LOCAL VOID      MpmPaintWindow( HWND hwnd );
  12.  
  13. /*-----------------------------------------------------------------*/
  14. /* Set up a PS for painting.  Since the Mac's BeginUpdate function */
  15. /* has already tweaked the visRgn, we just have to get the HPS and */
  16. /* pass back the bounding rect.                                    */
  17. /*-----------------------------------------------------------------*/
  18.  
  19. HPS APIENTRY WinBeginPaint( hwnd, hpsIn, prclPaint )
  20.     HWND        hwnd;
  21.     HPS         hpsIn;
  22.     PRECTL      prclPaint;
  23. {
  24.     HPS         hps;
  25.  
  26.     if( ! MpmValidateWindow(hwnd) )
  27.       return FALSE;
  28.  
  29.     ASSERT( ! hpsIn,
  30.             "WinBeginPaint: hps must be NULL" );
  31.  
  32.     hps = WinGetPS( hwnd );
  33.  
  34.     MpmMapRclOfMac( hwnd, prclPaint,
  35.                     &(**PGRAFOFHPS(hps)->visRgn).rgnBBox );
  36.  
  37.     return hps;
  38. }
  39.  
  40. /*-----------------------------------------------------------------*/
  41. /* Clean up after painting.  Just does a WinReleasePS, since there */
  42. /* is going to be a call to the Mac's EndUpdate function to do the */
  43. /* real work.                                                      */
  44. /*-----------------------------------------------------------------*/
  45.  
  46. BOOL APIENTRY WinEndPaint( hps )
  47.     HPS         hps;
  48. {
  49.     return WinReleasePS( hps );
  50. }
  51.  
  52. /*-----------------------------------------------------------------*/
  53. /* Get a PS handle for hwnd.  This makes a copy of the GrafPort to */
  54. /* avoid potential problems.  There's only one (static) PS in our  */
  55. /* PS cache.                                                       */
  56. /*-----------------------------------------------------------------*/
  57.  
  58. HPS APIENTRY WinGetPS( hwnd )
  59.     HWND        hwnd;
  60. {
  61.     GrafPtr     pgraf;
  62.     RgnHandle   hrgn;
  63.     Rect        rect;
  64.  
  65.     ASSERT( ! ( _ps1.flags & PSF_INUSE ),
  66.             "WinGetPS: PS already in use" );
  67.  
  68.     if( ! hwnd  ||  hwnd == HWND_DESKTOP )
  69.       hwnd = _hwndDesktop;
  70.  
  71.     if( ! MpmValidateWindow(hwnd) )
  72.       return NULL;
  73.  
  74.     /* Clear the cache PS and mark it as in use */
  75.  
  76.     memzero( &_ps1 );
  77.     _ps1.hwnd = hwnd;
  78.     _ps1.flags |= PSF_INUSE;
  79.  
  80.     /* Copy the Mac window's GrafPort */
  81.  
  82.     if( hwnd == _hwndDesktop )
  83.       GetWMgrPort( &pgraf );
  84.     else
  85.       pgraf = &PWINOFHWND(hwnd)->port;
  86.  
  87.     _ps1.port = *pgraf;
  88.  
  89.     _ps1.port.visRgn = NewRgn();
  90.     CopyRgn( pgraf->visRgn, _ps1.port.visRgn );
  91.  
  92.     _ps1.port.clipRgn = NewRgn();
  93.     CopyRgn( pgraf->clipRgn, _ps1.port.clipRgn );
  94.  
  95.     /* Clip the visRgn down to this window's rectangle in case it's
  96.        a child window */
  97.  
  98.     if( ! ( MYWNDOF(hwnd).flStyle & WS_PARENTCLIP ) )
  99.     {
  100.       hrgn = NewRgn();
  101.       MpmQueryMacRect( hwnd, &rect );
  102.       RectRgn( hrgn, &rect );
  103.       SectRgn( _ps1.port.visRgn, hrgn, _ps1.port.visRgn );
  104.       DisposeRgn( hrgn );
  105.     }
  106.  
  107.     /* Handle WS_CLIPCHILDREN and WS_CLIPSIBLINGS here? */
  108.  
  109.     return _hps1;
  110. }
  111.  
  112. /*-----------------------------------------------------------------*/
  113. /* Invalidate a rectangle in hwnd so it will be painted.  The      */
  114. /* Mac's InvalRect function does the real work.                    */
  115. /*-----------------------------------------------------------------*/
  116.  
  117. BOOL APIENTRY WinInvalidateRect( hwnd, prcl, fKids )
  118.     HWND        hwnd;
  119.     PRECTL      prcl;
  120.     BOOL        fKids;
  121. {
  122.     Rect        rect;
  123.     RECTL       rcl;
  124.  
  125.     if( ! MpmValidateWindow(hwnd) )
  126.       return FALSE;
  127.  
  128.     if( prcl )
  129.       rcl = *prcl;
  130.     else
  131.       WinQueryWindowRect( hwnd, &rcl );
  132.  
  133.     MpmMapMacOfRcl( hwnd, &rect, &rcl );
  134.  
  135.     thePort = &PWINOFHWND(hwnd)->port;
  136.  
  137.     InvalRect( &rect );
  138.  
  139.     return TRUE;
  140. }
  141.  
  142. /*-----------------------------------------------------------------*/
  143. /* Release the cache PS by disposing of its regions and marking it */
  144. /* as free.                                                        */
  145. /*-----------------------------------------------------------------*/
  146.  
  147. BOOL APIENTRY WinReleasePS( hps )
  148.     HPS         hps;
  149. {
  150.     if( ! MpmValidatePS(hps) )
  151.       return FALSE;
  152.  
  153.     ASSERT( _ps1.flags & PSF_INUSE,
  154.             "WinReleasePS: PS not in use" );
  155.  
  156.     DisposeRgn( _ps1.port.visRgn );
  157.     DisposeRgn( _ps1.port.clipRgn );
  158.  
  159.     _ps1.flags &= ~PSF_INUSE;
  160.  
  161.     return TRUE;
  162. }
  163.  
  164. /*-----------------------------------------------------------------*/
  165. /* Force a window update on hwnd and its children.  Actually, we   */
  166. /* go up to the top level Mac window if hwnd is a child, and       */
  167. /* all children of that top level window.                          */
  168. /*-----------------------------------------------------------------*/
  169.  
  170. BOOL APIENTRY WinUpdateWindow( hwnd )
  171.     HWND        hwnd;
  172. {
  173.     WindowPeek  pwin;
  174.  
  175.     if( ! MpmValidateWindow(hwnd) )
  176.       return FALSE;
  177.  
  178.     pwin = PWINOFHWND(hwnd);
  179.     hwnd = HWNDOFPWIN(pwin);  /* get main Mac window */
  180.  
  181.     BeginUpdate( pwin );
  182.  
  183.     MpmDrawGrowIcon( hwnd );
  184.  
  185.     UpdtControl( pwin, pwin->port.visRgn );
  186.  
  187.     MpmPaintWindow( hwnd );
  188.  
  189.     EndUpdate( pwin );
  190.  
  191.     return TRUE;
  192. }
  193.  
  194. /*-----------------------------------------------------------------*/
  195. /* Draw the size box in hwnd if it has one.                        */
  196. /*-----------------------------------------------------------------*/
  197.  
  198. LOCAL VOID MpmDrawGrowIcon( hwnd )
  199.     HWND        hwnd;
  200. {
  201.     if( MpmIsFrameClass( MYCLASSOF(hwnd).szName ) )
  202.       if( MYWNDOF(hwnd).flFrameFlags & FCF_SIZEBORDER )
  203.         DrawGrowIcon( PWINOFHWND(hwnd) );
  204. }
  205.  
  206. /*-----------------------------------------------------------------*/
  207. /* Invalidate a window.  (Not implemented)                         */
  208. /*-----------------------------------------------------------------*/
  209.  
  210. #ifdef INVAL
  211.  
  212. LOCAL VOID MpmInvalidateWindow( hwnd )
  213.     HWND        hwnd;
  214. {
  215.     Rect        rect;
  216.  
  217.     switch( MYWNDOF(hwnd).ucKind )
  218.     {
  219.       case WK_CHILD:
  220.         MpmQueryMacRect( hwnd, &rect );
  221.         break;
  222.  
  223.       case WK_MAIN:
  224.       /*if( MpmIsFrameClass(MYCLASSOF(hwnd).szName) )*/
  225.         if( WinWindowFromID( hwnd, FID_SIZEBORDER ) )
  226.         {
  227.           rect = PWINOFHWND(hwnd)->port.portRect;
  228.           rect.top = rect.bottom - _alSysVal[SV_CYHSCROLL];
  229.           rect.left = rect.right - _alSysVal[SV_CXVSCROLL];
  230.         }
  231.         break;
  232.  
  233.       default:
  234.         return;
  235.     }
  236.  
  237.     thePort = &PWINOFHWND(hwnd)->port;
  238.  
  239.     InvalRect( &rect );
  240.     EraseRect( &rect );
  241. }
  242.  
  243. #endif
  244.  
  245. /*-----------------------------------------------------------------*/
  246. /* Send WM_PAINT messages to hwnd and all its children.            */
  247. /*-----------------------------------------------------------------*/
  248.  
  249. LOCAL VOID MpmPaintWindow( hwnd )
  250.     HWND        hwnd;
  251. {
  252.     HWND        hwndChild;
  253.  
  254.     if( ! ( MYWNDOF(hwnd).flStyle & WS_VISIBLE ) )
  255.       return;
  256.  
  257.     WinSendMsg( hwnd, WM_PAINT, 0, 0 );
  258.  
  259.     for( hwndChild = MYWNDOF(hwnd).hwndTopChild;
  260.          hwndChild;
  261.          hwndChild = MYWNDOF(hwndChild).hwndNextSibling )
  262.       MpmPaintWindow( hwndChild );
  263. }
  264.  
  265. /*-----------------------------------------------------------------*/
  266.