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

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * IVIEWOBJ.CPP
  3.  * Polyline Component Chapter 19
  4.  *
  5.  * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
  6.  *
  7.  * Kraig Brockschmidt, Microsoft
  8.  * Internet  :  kraigb@microsoft.com
  9.  * Compuserve:  >INTERNET:kraigb@microsoft.com
  10.  */
  11. #include "polyline.h"
  12. /*
  13.  * CImpIViewObject::CImpIViewObject
  14.  * CImpIViewObject::~CImpIViewObject
  15.  *
  16.  * Parameters (Constructor):
  17.  *  pObj            PCPolyline of the object we're in.
  18.  *  pUnkOuter       LPUNKNOWN to which we delegate.
  19.  */
  20. CImpIViewObject::CImpIViewObject(PCPolyline pObj
  21.     , LPUNKNOWN pUnkOuter)
  22.     {
  23.     m_cRef=0;
  24.     m_pObj=pObj;
  25.     m_pUnkOuter=pUnkOuter;
  26.     return;
  27.     }
  28. CImpIViewObject::~CImpIViewObject(void)
  29.     {
  30.     return;
  31.     }
  32. /*
  33.  * CImpIViewObject::QueryInterface
  34.  * CImpIViewObject::AddRef
  35.  * CImpIViewObject::Release
  36.  *
  37.  * Purpose:
  38.  *  IUnknown members for CImpIViewObject object.
  39.  */
  40. STDMETHODIMP CImpIViewObject::QueryInterface(REFIID riid, PPVOID ppv)
  41.     {
  42.     return m_pUnkOuter->QueryInterface(riid, ppv);
  43.     }
  44. STDMETHODIMP_(ULONG) CImpIViewObject::AddRef(void)
  45.     {
  46.     ++m_cRef;
  47.     return m_pUnkOuter->AddRef();
  48.     }
  49. STDMETHODIMP_(ULONG) CImpIViewObject::Release(void)
  50.     {
  51.     --m_cRef;
  52.     return m_pUnkOuter->Release();
  53.     }
  54. /*
  55.  * CImpIViewObject::Draw
  56.  *
  57.  * Purpose:
  58.  *  Draws the object on the given hDC specifically for the requested
  59.  *  aspect, device, and within the appropriate bounds.
  60.  *
  61.  * Parameters:
  62.  *  dwAspect        DWORD aspect to draw.
  63.  *  lindex          LONG index of the piece to draw.
  64.  *  pvAspect        LPVOID for extra information, always NULL.
  65.  *  ptd             DVTARGETDEVICE * containing device
  66.  *                  information.
  67.  *  hICDev          HDC containing the IC for the device.
  68.  *  hDC             HDC on which to draw.
  69.  *  pRectBounds     LPCRECTL describing the rectangle in which
  70.  *                  to draw.
  71.  *  pRectWBounds    LPCRECTL describing the placement rectangle
  72.  *                  if part of what you draw is another metafile.
  73.  *  pfnContinue     Function to call periodically during
  74.  *                  long repaints.
  75.  *  dwContinue      DWORD extra information to pass to the
  76.  *                  pfnContinue.
  77.  *
  78.  * Return Value:
  79.  *  HRESULT         NOERROR or a general error value.
  80.  */
  81. STDMETHODIMP CImpIViewObject::Draw(DWORD dwAspect, LONG lindex
  82.     , LPVOID pvAspect, DVTARGETDEVICE *ptd, HDC hICDev
  83.     , HDC hDC, LPCRECTL pRectBounds, LPCRECTL pRectWBounds
  84.     , BOOL (CALLBACK *pfnContinue) (DWORD), DWORD dwContinue)
  85.     {
  86.     RECT            rc;
  87.     POLYLINEDATA    pl;
  88.     PPOLYLINEDATA   ppl=&m_pObj->m_pl;
  89.     RECTFROMRECTL(rc, *pRectBounds);
  90.     //Delegate iconic and printed representations.
  91.     if (!((DVASPECT_CONTENT | DVASPECT_THUMBNAIL) & dwAspect))
  92.         {
  93.         return m_pObj->m_pDefIViewObject->Draw(dwAspect, lindex
  94.             , pvAspect, ptd, hICDev, hDC, pRectBounds, pRectWBounds
  95.             , pfnContinue, dwContinue);
  96.         }
  97.     /*
  98.      * If we're asked to draw a frozen aspect, use the data from
  99.      * a copy we made in IViewObject::Freeze.  Otherwise use the
  100.      * current data.
  101.      */
  102.     if (dwAspect & m_pObj->m_dwFrozenAspects)
  103.         {
  104.         //Point to the data to actually use.
  105.         if (DVASPECT_CONTENT==dwAspect)
  106.             ppl=&m_pObj->m_plContent;
  107.         else
  108.             ppl=&m_pObj->m_plThumbnail;
  109.         }
  110.     //Make a copy so we can modify it (and not worry about threads)
  111.     memcpy(&pl, ppl, CBPOLYLINEDATA);
  112.     /*
  113.      * If we're going to a printer, check if it's color capable.
  114.      * if not, then use black on white for this figure.
  115.      */
  116.     if (NULL!=hICDev)
  117.         {
  118.         if (GetDeviceCaps(hICDev, NUMCOLORS) <= 2)
  119.             {
  120.             pl.rgbBackground=RGB(255, 255, 255);
  121.             pl.rgbLine=RGB(0, 0, 0);
  122.             }
  123.         }
  124.     m_pObj->Draw(hDC, FALSE, TRUE, &rc, &pl);
  125.     return NOERROR;
  126.     }
  127. /*
  128.  * CImpIViewObject::GetColorSet
  129.  *
  130.  * Purpose:
  131.  *  Retrieves the color palette used by the object.
  132.  *
  133.  * Parameters:
  134.  *  dwAspect        DWORD aspect of interest.
  135.  *  lindex          LONG piece of interest.
  136.  *  pvAspect        LPVOID with extra information, always NULL.
  137.  *  ptd             DVTARGETDEVICE * containing device info.
  138.  *  hICDev          HDC containing the IC for the device.
  139.  *  ppColorSet      LPLOGPALETTE * into which to return the
  140.  *                  pointer to the palette in this color set.
  141.  *
  142.  * Return Value:
  143.  *  HRESULT         NOERROR or a general error value.
  144.  */
  145. STDMETHODIMP CImpIViewObject::GetColorSet(DWORD dwDrawAspect
  146.     , LONG lindex, LPVOID pvAspect, DVTARGETDEVICE *ptd
  147.     , HDC hICDev, LPLOGPALETTE *ppColorSet)
  148.     {
  149.     return ResultFromScode(E_NOTIMPL);
  150.     }
  151. /*
  152.  * CImpIViewObject::Freeze
  153.  *
  154.  * Purpose:
  155.  *  Freezes the view of a particular aspect such that data
  156.  *  changes do not affect the view.
  157.  *
  158.  * Parameters:
  159.  *  dwAspect        DWORD aspect to freeze.
  160.  *  lindex          LONG piece index under consideration.
  161.  *  pvAspect        LPVOID for further information, always NULL.
  162.  *  pdwFreeze       LPDWORD in which to return the key.
  163.  *
  164.  * Return Value:
  165.  *  HRESULT         NOERROR or a general error value.
  166.  */
  167. STDMETHODIMP CImpIViewObject::Freeze(DWORD dwAspect, LONG lindex
  168.     , LPVOID pvAspect, LPDWORD pdwFreeze)
  169.     {
  170.     //Delegate anything for ICON or DOCPRINT aspects
  171.     if (!((DVASPECT_CONTENT | DVASPECT_THUMBNAIL) & dwAspect))
  172.         {
  173.         return m_pObj->m_pDefIViewObject->Freeze(dwAspect, lindex
  174.             , pvAspect, pdwFreeze);
  175.         }
  176.     if (dwAspect & m_pObj->m_dwFrozenAspects)
  177.         {
  178.         *pdwFreeze=dwAspect + FREEZE_KEY_OFFSET;
  179.         return ResultFromScode(VIEW_S_ALREADY_FROZEN);
  180.         }
  181.     m_pObj->m_dwFrozenAspects |= dwAspect;
  182.     /*
  183.      * For whatever aspects become frozen, make a copy of the data.
  184.      * Later when drawing, if such a frozen aspect is requested,
  185.      * we'll draw from this data rather than from our current data.
  186.      */
  187.     if (DVASPECT_CONTENT & dwAspect)
  188.         {
  189.         memcpy(&m_pObj->m_plContent, &m_pObj->m_pl
  190.             , CBPOLYLINEDATA);
  191.         }
  192.     if (DVASPECT_THUMBNAIL & dwAspect)
  193.         {
  194.         memcpy(&m_pObj->m_plThumbnail, &m_pObj->m_pl
  195.             , CBPOLYLINEDATA);
  196.         }
  197.     if (NULL!=pdwFreeze)
  198.         *pdwFreeze=dwAspect + FREEZE_KEY_OFFSET;
  199.     return NOERROR;
  200.     }
  201. /*
  202.  * CImpIViewObject::Unfreeze
  203.  *
  204.  * Purpose:
  205.  *  Thaws an aspect frozen in ::Freeze.  We expect that a container
  206.  *  will redraw us after freezing if necessary, so we don't send
  207.  *  any sort of notification here.
  208.  *
  209.  * Parameters:
  210.  *  dwFreeze        DWORD key returned from ::Freeze.
  211.  *
  212.  * Return Value:
  213.  *  HRESULT         NOERROR or a general error value.
  214.  */
  215. STDMETHODIMP CImpIViewObject::Unfreeze(DWORD dwFreeze)
  216.     {
  217.     DWORD       dwAspect=dwFreeze - FREEZE_KEY_OFFSET;
  218.     //Delegate anything for ICON or DOCPRINT aspects
  219.     if (!((DVASPECT_CONTENT | DVASPECT_THUMBNAIL) & dwAspect))
  220.         m_pObj->m_pDefIViewObject->Unfreeze(dwFreeze);
  221.     //The aspect to unfreeze is in the key.
  222.     m_pObj->m_dwFrozenAspects &= ~(dwAspect);
  223.     /*
  224.      * Since we always kept our current data up to date, we don't
  225.      * have to do anything thing here like requesting data again.
  226.      * Because we removed dwAspect from m_dwFrozenAspects, Draw
  227.      * will again use the current data.
  228.      */
  229.     return NOERROR;
  230.     }
  231. /*
  232.  * CImpIViewObject::SetAdvise
  233.  *
  234.  * Purpose:
  235.  *  Provides an advise sink to the view object enabling
  236.  *  notifications for a specific aspect.
  237.  *
  238.  * Parameters:
  239.  *  dwAspects       DWORD describing the aspects of interest.
  240.  *  dwAdvf          DWORD containing advise flags.
  241.  *  pIAdviseSink    LPADVISESINK to notify.
  242.  *
  243.  * Return Value:
  244.  *  HRESULT         NOERROR or a general error value.
  245.  */
  246. STDMETHODIMP CImpIViewObject::SetAdvise(DWORD dwAspects, DWORD dwAdvf
  247.     , LPADVISESINK pIAdviseSink)
  248.     {
  249.     //Pass anything with DVASPECT_ICON or _DOCPRINT to the handler.
  250.     if (!((DVASPECT_CONTENT | DVASPECT_THUMBNAIL) & dwAspects))
  251.         {
  252.         m_pObj->m_pDefIViewObject->SetAdvise(dwAspects, dwAdvf
  253.             , pIAdviseSink);
  254.         }
  255.     //We continue because dwAspects may have more than one in it.
  256.     if (NULL!=m_pObj->m_pIAdviseSink)
  257.         m_pObj->m_pIAdviseSink->Release();
  258.     m_pObj->m_pIAdviseSink=pIAdviseSink;
  259.     m_pObj->m_dwAdviseAspects=dwAspects;
  260.     m_pObj->m_dwAdviseFlags=dwAdvf;
  261.     if (NULL!=m_pObj->m_pIAdviseSink)
  262.         m_pObj->m_pIAdviseSink->AddRef();
  263.     return NOERROR;
  264.     }
  265. /*
  266.  * CImpIViewObject::GetAdvise
  267.  *
  268.  * Purpose:
  269.  *  Returns the last known IAdviseSink seen by ::SetAdvise.
  270.  *
  271.  * Parameters:
  272.  *  pdwAspects      LPDWORD in which to store the last
  273.  *                  requested aspects.
  274.  *  pdwAdvf         LPDWORD in which to store the last
  275.  *                  requested flags.
  276.  *  ppIAdvSink      LPADVISESINK * in which to store the
  277.  *                  IAdviseSink.
  278.  *
  279.  * Return Value:
  280.  *  HRESULT         NOERROR or a general error value.
  281.  */
  282. STDMETHODIMP CImpIViewObject::GetAdvise(LPDWORD pdwAspects
  283.     , LPDWORD pdwAdvf, LPADVISESINK *ppAdvSink)
  284.     {
  285.     if (NULL!=ppAdvSink)
  286.         {
  287.         *ppAdvSink=m_pObj->m_pIAdviseSink;
  288.         m_pObj->m_pIAdviseSink->AddRef();
  289.         }
  290.     if (NULL!=pdwAspects)
  291.         *pdwAspects=m_pObj->m_dwAdviseAspects;
  292.     if (NULL!=pdwAdvf)
  293.         *pdwAdvf=m_pObj->m_dwAdviseFlags;
  294.     return NOERROR;
  295.     }
  296. /*
  297.  * CImpIViewObject::GetExtent
  298.  *
  299.  * Purpose:
  300.  *  Retrieves the extents of the object's display.
  301.  *
  302.  * Parameters:
  303.  *  dwAspect        DWORD of the aspect of interest.
  304.  *  lindex          LONG index of the piece of interest.
  305.  *  ptd             DVTARGETDEVICE * with device information.
  306.  *  pszl            LPSIZEL to the structure in which to return
  307.  *                  the extents.
  308.  *
  309.  * Return Value:
  310.  *  HRESULT         NOERROR or a general error value.
  311.  */
  312. STDMETHODIMP CImpIViewObject::GetExtent(DWORD dwAspect, LONG lindex
  313.     , DVTARGETDEVICE *ptd, LPSIZEL pszl)
  314.     {
  315.     RECT            rc;
  316.     if (!(DVASPECT_CONTENT & dwAspect))
  317.         {
  318.         return m_pObj->m_pDefIViewObject->GetExtent(dwAspect
  319.             , lindex, ptd, pszl);
  320.         }
  321.     m_pObj->m_pImpIPolyline->RectGet(&rc);
  322.     m_pObj->RectConvertMappings(&rc, FALSE);
  323.     pszl->cx=rc.right-rc.left;
  324.     pszl->cy=rc.bottom-rc.top;
  325.     return NOERROR;
  326.     }