DRAGDROP.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:4k
源码类别:

Windows编程

开发平台:

Visual C++

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