|
// cntritem.h : interface of the CDrawItem class
//
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#include "drawcli.h"
#include "drawdoc.h"
#include "drawobj.h"
#include "drawvw.h"
#include "cntritem.h"
#include <AfxPriv.h>
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDrawItem implementation
IMPLEMENT_SERIAL(CDrawItem, COleClientItem, 0)
CDrawItem::CDrawItem(CDrawDoc* pContainer, CDrawOleObj* pDrawObj)
: COleClientItem(pContainer)
{
m_pDrawObj = pDrawObj;
}
CDrawItem::~CDrawItem()
{
if (m_pDrawObj != NULL)
m_pDrawObj->m_pClientItem = NULL;
}
void CDrawItem::OnChange(OLE_NOTIFICATION nCode, DWORD dwParam)
{
ASSERT_VALID(this);
COleClientItem::OnChange(nCode, dwParam);
switch(nCode)
{
case OLE_CHANGED_STATE:
case OLE_CHANGED_ASPECT:
m_pDrawObj->Invalidate();
break;
case OLE_CHANGED:
UpdateExtent(); // extent may have changed
m_pDrawObj->Invalidate();
break;
}
}
BOOL CDrawItem::OnChangeItemPosition(const CRect& rectPos)
{
ASSERT_VALID(this);
CDrawView* pView = GetActiveView();
ASSERT_VALID(pView);
CRect rect = rectPos;
pView->ClientToDoc(rect);
if (rect != m_pDrawObj->m_position)
{
// invalidate old rectangle
m_pDrawObj->Invalidate();
// update to new rectangle
m_pDrawObj->m_position = rect;
GetExtent(&m_pDrawObj->m_extent);
// and invalidate new rectangle
m_pDrawObj->Invalidate();
// mark document as dirty
GetDocument()->SetModifiedFlag();
}
return COleClientItem::OnChangeItemPosition(rectPos);
}
void CDrawItem::OnGetItemPosition(CRect& rPosition)
{
ASSERT_VALID(this);
// update to extent of item if m_position is not initialized
if (m_pDrawObj->m_position.IsRectEmpty())
UpdateExtent();
// copy m_position, which is in document coordinates
CDrawView* pView = GetActiveView();
ASSERT_VALID(pView);
rPosition = m_pDrawObj->m_position;
pView->DocToClient(rPosition);
}
void CDrawItem::Serialize(CArchive& ar)
{
ASSERT_VALID(this);
// Call base class first to read in COleClientItem data.
// Note: this sets up the m_pDocument pointer returned from
// CDrawItem::GetDocument, therefore it is a good idea
// to call the base class Serialize first.
COleClientItem::Serialize(ar);
// now store/retrieve data specific to CDrawItem
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
BOOL CDrawItem::UpdateExtent()
{
CSize size;
if (!GetExtent(&size) || size == m_pDrawObj->m_extent)
return FALSE; // blank
// if new object (i.e. m_extent is empty) setup position
if (m_pDrawObj->m_extent == CSize(0, 0))
{
m_pDrawObj->m_position.right =
m_pDrawObj->m_position.left + MulDiv(size.cx, 10, 254);
m_pDrawObj->m_position.bottom =
m_pDrawObj->m_position.top - MulDiv(size.cy, 10, 254);
}
// else data changed so scale up rect as well
else if (!IsInPlaceActive() && size != m_pDrawObj->m_extent)
{
m_pDrawObj->m_position.right = m_pDrawObj->m_position.left +
MulDiv(m_pDrawObj->m_position.Width(), size.cx, m_pDrawObj->m_extent.cx);
m_pDrawObj->m_position.bottom = m_pDrawObj->m_position.top +
MulDiv(m_pDrawObj->m_position.Height(), size.cy, m_pDrawObj->m_extent.cy);
}
m_pDrawObj->m_extent = size;
m_pDrawObj->Invalidate(); // redraw to the new size/position
return TRUE;
}
void CDrawItem::OnActivate()
{
// allow only one inplace active item per frame
CView * pView = GetActiveView();
ASSERT_VALID( pView );
CDrawDoc * pDoc = GetDocument();
ASSERT_VALID( pDoc );
COleClientItem * pItem =
pDoc->GetInPlaceActiveItem( pView );
if( pItem != NULL && pItem != this )
pItem->Close();
COleClientItem::OnActivate();
CFrameWnd * pFrame = STATIC_DOWNCAST( CFrameWnd, ::AfxGetMainWnd() );
ASSERT_VALID( pFrame );
pFrame->SendMessage(
WM_SETMESSAGESTRING,
(WPARAM)AFX_IDS_IDLEMESSAGE
);
pFrame->DelayRecalcLayout();
}
void CDrawItem::OnDeactivateUI(BOOL bUndoable)
{
CView * pView = GetActiveView();
CFrameWnd * pFrame = STATIC_DOWNCAST( CFrameWnd, ::AfxGetMainWnd() );
ASSERT_VALID( pFrame );
pFrame->SendMessage(
WM_SETMESSAGESTRING,
(WPARAM)AFX_IDS_IDLEMESSAGE
);
COleClientItem::OnDeactivateUI( bUndoable );
// hide the object if it is not an outside-in object
DWORD dwMisc = 0;
m_lpObject->GetMiscStatus(
GetDrawAspect(),
&dwMisc
);
if( dwMisc & OLEMISC_INSIDEOUT )
DoVerb( OLEIVERB_HIDE, NULL );
if( pView != NULL )
pView->PostMessage(WM_COMMAND,ID_CANCEL_EDIT);
pFrame->DelayRecalcLayout();
}
/////////////////////////////////////////////////////////////////////////////
// CDrawItem diagnostics
#ifdef _DEBUG
void CDrawItem::AssertValid() const
{
COleClientItem::AssertValid();
}
void CDrawItem::Dump(CDumpContext& dc) const
{
COleClientItem::Dump(dc);
}
#endif
/////////////////////////////////////////////////////////////////////////////
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.
A list of licenses authors might use can be found here
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.