home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / com / inole2 / chap24 / patron / dragdrop.cpp < prev    next >
C/C++ Source or Header  |  1995-05-03  |  4KB  |  180 lines

  1. /*
  2.  * DRAGDROP.CPP
  3.  * Patron Chapter 24
  4.  *
  5.  * Member functions of the CPages class concerned with drag-drop
  6.  * and other object-placement functionality.  Moved here to clean
  7.  * up CPAGES.CPP somewhat.
  8.  *
  9.  * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
  10.  *
  11.  * Kraig Brockschmidt, Microsoft
  12.  * Internet  :  kraigb@microsoft.com
  13.  * Compuserve:  >INTERNET:kraigb@microsoft.com
  14.  */
  15.  
  16.  
  17. #include "patron.h"
  18.  
  19.  
  20. /*
  21.  * CPages::UTestDroppablePoint
  22.  *
  23.  * Purpose:
  24.  *  Returns if the point in pptl is on the paper in the current page
  25.  *  and alternately if it's within horizontal or vertical inset
  26.  *  regions.
  27.  *
  28.  * Parameters:
  29.  *  pptl            PPOINTL containing the point in screen
  30.  *                  coordinates.
  31.  *
  32.  * Return Value:
  33.  *  UINT            A UDROP_* value.
  34.  */
  35.  
  36. UINT CPages::UTestDroppablePoint(PPOINTL pptl)
  37.     {
  38.     POINT       pt;
  39.     RECT        rc, rcT, rcC;
  40.     UINT        uRet;
  41.  
  42.     POINTFROMPOINTL(pt, *pptl);
  43.     ScreenToClient(m_hWnd, &pt);
  44.  
  45.     CalcBoundingRect(&rc, FALSE);
  46.  
  47.     GetClientRect(m_hWnd, &rcC);
  48.     IntersectRect(&rcT, &rc, &rcC);
  49.  
  50.     //Check for at least a client area hit.
  51.     if (!PtInRect(&rcT, pt))
  52.         return UDROP_NONE;
  53.  
  54.     uRet=UDROP_CLIENT;
  55.  
  56.     //Scroll checks happen on client area, not document area
  57.     if (PtInRect(&rcC, pt))
  58.         {
  59.         //Check horizontal inset
  60.         if (pt.x <= rcC.left+(int)m_uScrollInset)
  61.             uRet |= UDROP_INSETLEFT;
  62.         else if (pt.x >= rcC.right-(int)m_uScrollInset)
  63.             uRet |= UDROP_INSETRIGHT;
  64.  
  65.         //Check vertical inset
  66.         if (pt.y <= rcC.top+(int)m_uScrollInset)
  67.             uRet |= UDROP_INSETTOP;
  68.         else if (pt.y >= rcC.bottom-(int)m_uScrollInset)
  69.             uRet |= UDROP_INSETBOTTOM;
  70.         }
  71.  
  72.     return uRet;
  73.     }
  74.  
  75.  
  76.  
  77.  
  78. /*
  79.  * CPages::DrawDropTargetRect
  80.  *
  81.  * Purpose:
  82.  *  Draws a dotted rectangle on the Pages window to show where
  83.  *  a drop might occur.  This is a toggle function.
  84.  *
  85.  * Parameters:
  86.  *  pptl            PPOINTL containing the upper-left point
  87.  *                  in screen coordinates.
  88.  *  pszl            LPSIZEL containing the rect extents in device
  89.  *                  units.
  90.  *
  91.  * Return Value:
  92.  *  None
  93.  */
  94.  
  95. void CPages::DrawDropTargetRect(PPOINTL pptl, LPSIZEL pszl)
  96.     {
  97.     POINT           pt;
  98.     RECT            rc, rcT;
  99.     HDC             hDC;
  100.  
  101.     if (NULL==pptl && NULL==pszl)
  102.         {
  103.         /*
  104.          * This case is used from WM_PAINT in pagewin.cpp so we can
  105.          * control the proper visibility of the drag rectangle when
  106.          * we're scrolling.  If drag-drop happens between two apps,
  107.          * then any ScrollWindow will cause a WM_PAINT after we
  108.          * leave DragOver, so that paint would normally overwrite
  109.          * the last drawn rectangle.  To alleviate that, WM_PAINT
  110.          * will remove the last rect by sending us NULLs, paint,
  111.          * then reinstate the rectangle.
  112.          */
  113.         pptl=&m_ptlRect;
  114.         pszl=&m_szlRect;
  115.         }
  116.     else
  117.         {
  118.         m_ptlRect.x=pptl->x;
  119.         m_ptlRect.y=pptl->y;
  120.         m_szlRect.cx=pszl->cx;
  121.         m_szlRect.cy=pszl->cy;
  122.  
  123.         //Flag is only affected from IDropTarget, not WM_PAINT calls
  124.         m_fDragRectShown=!m_fDragRectShown;
  125.         }
  126.  
  127.     POINTFROMPOINTL(pt, *pptl);
  128.     ScreenToClient(m_hWnd, &pt);
  129.     SetRect(&rc, pt.x, pt.y, pt.x+(int)pszl->cx
  130.         , pt.y+(int)pszl->cy);
  131.  
  132.     CalcBoundingRect(&rcT, FALSE);
  133.     IntersectRect(&rc, &rc, &rcT);
  134.  
  135.     if (!IsRectEmpty(&rc))
  136.         {
  137.         hDC=GetDC(m_hWnd);
  138.         DrawFocusRect(hDC, &rc);
  139.         ReleaseDC(m_hWnd, hDC);
  140.         }
  141.  
  142.     return;
  143.     }
  144.  
  145.  
  146.  
  147.  
  148. /*
  149.  * CPages::AdjustPosition
  150.  *
  151.  * Purpose:
  152.  *  Adjusts a point for the scrolling offset and then converts it
  153.  *  and a size from device into LOMETRIC units.
  154.  *
  155.  * Parameters:
  156.  *  pptl            PPOINTL to adjust and convert
  157.  *  pszl            LPSIZEL to convert
  158.  *
  159.  * Return Value:
  160.  *  None
  161.  */
  162.  
  163. void CPages::AdjustPosition(PPOINTL pptl, LPSIZEL pszl)
  164.     {
  165.     RECT        rc;
  166.  
  167.     SetRect(&rc, m_xPos+(int)pptl->x
  168.         , m_yPos+(int)pptl->y, (int)pszl->cx, (int)pszl->cy);
  169.  
  170.     RectConvertMappings(&rc, NULL, FALSE);
  171.  
  172.     pptl->x=rc.left;
  173.     pptl->y=rc.top;
  174.  
  175.     pszl->cx=rc.right;
  176.     pszl->cy=rc.bottom;
  177.  
  178.     return;
  179.     }
  180.