www.pudn.com > VCBOOKSOURCES.zip > CONTDEMOVIEW.CPP, change:1998-02-24,size:6848b


// ContDemoView.cpp : implementation of the CContDemoView class 
// 
 
#include "stdafx.h" 
#include "ContDemo.h" 
 
#include "ContDemoDoc.h" 
#include "CntrItem.h" 
#include "ContDemoView.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CContDemoView 
 
IMPLEMENT_DYNCREATE(CContDemoView, CView) 
 
BEGIN_MESSAGE_MAP(CContDemoView, CView) 
   //{{AFX_MSG_MAP(CContDemoView) 
      // NOTE - the ClassWizard will add and remove mapping macros here. 
      //    DO NOT EDIT what you see in these blocks of generated code! 
   ON_WM_DESTROY() 
   ON_WM_SETFOCUS() 
   ON_WM_SIZE() 
   ON_COMMAND(ID_OLE_INSERT_NEW, OnInsertObject) 
   ON_COMMAND(ID_CANCEL_EDIT_CNTR, OnCancelEditCntr) 
   //}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CContDemoView construction/destruction 
 
CContDemoView::CContDemoView() 
{ 
   m_pSelection = NULL; 
   // TODO: add construction code here 
 
} 
 
CContDemoView::~CContDemoView() 
{ 
} 
 
BOOL CContDemoView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
   // TODO: Modify the Window class or styles here by modifying 
   //  the CREATESTRUCT cs 
 
   return CView::PreCreateWindow(cs); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CContDemoView drawing 
 
void CContDemoView::OnDraw(CDC* pDC) 
{ 
   CContDemoDoc* pDoc = GetDocument(); 
   ASSERT_VALID(pDoc); 
 
   // TODO: add draw code for native data here 
   // TODO: also draw all OLE items in the document 
 
   // Draw the selection at an arbitrary position.  This code should be 
   //  removed once your real drawing code is implemented.  This position 
   //  corresponds exactly to the rectangle returned by CContDemoCntrItem, 
   //  to give the effect of in-place editing. 
 
   // TODO: remove this code when final draw code is complete. 
 
   if (m_pSelection == NULL) 
   { 
      POSITION pos = pDoc->GetStartPosition(); 
      m_pSelection = (CContDemoCntrItem*)pDoc->GetNextClientItem(pos); 
   } 
   if (m_pSelection != NULL) 
      m_pSelection->Draw(pDC, CRect(10, 10, 210, 210)); 
} 
 
void CContDemoView::OnInitialUpdate() 
{ 
   CView::OnInitialUpdate(); 
 
 
   // TODO: remove this code when final selection model code is written 
   m_pSelection = NULL;    // initialize selection 
 
} 
 
void CContDemoView::OnDestroy() 
{ 
   // Deactivate the item on destruction; this is important 
   // when a splitter view is being used. 
   CView::OnDestroy(); 
   COleClientItem* pActiveItem = GetDocument()->GetInPlaceActiveItem(this); 
   if (pActiveItem != NULL && pActiveItem->GetActiveView() == this) 
   { 
      pActiveItem->Deactivate(); 
      ASSERT(GetDocument()->GetInPlaceActiveItem(this) == NULL); 
   } 
} 
 
 
///////////////////////////////////////////////////////////////////////////// 
// OLE Client support and commands 
 
BOOL CContDemoView::IsSelected(const CObject* pDocItem) const 
{ 
   // The implementation below is adequate if your selection consists of 
   //  only CContDemoCntrItem objects.  To handle different selection 
   //  mechanisms, the implementation here should be replaced. 
 
   // TODO: implement this function that tests for a selected OLE client item 
 
   return pDocItem == m_pSelection; 
} 
 
void CContDemoView::OnInsertObject() 
{ 
   // Invoke the standard Insert Object dialog box to obtain information 
   //  for new CContDemoCntrItem object. 
   COleInsertDialog dlg; 
   if (dlg.DoModal() != IDOK) 
      return; 
 
   BeginWaitCursor(); 
 
   CContDemoCntrItem* pItem = NULL; 
   TRY 
   { 
      // Create new item connected to this document. 
      CContDemoDoc* pDoc = GetDocument(); 
      ASSERT_VALID(pDoc); 
      pItem = new CContDemoCntrItem(pDoc); 
      ASSERT_VALID(pItem); 
 
      // Initialize the item from the dialog data. 
      if (!dlg.CreateItem(pItem)) 
         AfxThrowMemoryException();  // any exception will do 
      ASSERT_VALID(pItem); 
 
      // If item created from class list (not from file) then launch 
      //  the server to edit the item. 
      if (dlg.GetSelectionType() == COleInsertDialog::createNewItem) 
         pItem->DoVerb(OLEIVERB_SHOW, this); 
 
      ASSERT_VALID(pItem); 
 
      // As an arbitrary user interface design, this sets the selection 
      //  to the last item inserted. 
 
      // TODO: reimplement selection as appropriate for your application 
 
      m_pSelection = pItem;   // set selection to last inserted item 
      pDoc->UpdateAllViews(NULL); 
   } 
   CATCH(CException, e) 
   { 
      if (pItem != NULL) 
      { 
         ASSERT_VALID(pItem); 
         pItem->Delete(); 
      } 
      AfxMessageBox(IDP_FAILED_TO_CREATE); 
   } 
   END_CATCH 
 
   EndWaitCursor(); 
} 
 
// The following command handler provides the standard keyboard 
//  user interface to cancel an in-place editing session.  Here, 
//  the container (not the server) causes the deactivation. 
void CContDemoView::OnCancelEditCntr() 
{ 
   // Close any in-place active item on this view. 
   COleClientItem* pActiveItem = GetDocument()->GetInPlaceActiveItem(this); 
   if (pActiveItem != NULL) 
   { 
      pActiveItem->Close(); 
   } 
   ASSERT(GetDocument()->GetInPlaceActiveItem(this) == NULL); 
} 
 
// Special handling of OnSetFocus and OnSize are required for a container 
//  when an object is being edited in-place. 
void CContDemoView::OnSetFocus(CWnd* pOldWnd) 
{ 
   COleClientItem* pActiveItem = GetDocument()->GetInPlaceActiveItem(this); 
   if (pActiveItem != NULL && 
      pActiveItem->GetItemState() == COleClientItem::activeUIState) 
   { 
      // need to set focus to this item if it is in the same view 
      CWnd* pWnd = pActiveItem->GetInPlaceWindow(); 
      if (pWnd != NULL) 
      { 
         pWnd->SetFocus();   // don't call the base class 
         return; 
      } 
   } 
 
   CView::OnSetFocus(pOldWnd); 
} 
 
void CContDemoView::OnSize(UINT nType, int cx, int cy) 
{ 
   CView::OnSize(nType, cx, cy); 
   COleClientItem* pActiveItem = GetDocument()->GetInPlaceActiveItem(this); 
   if (pActiveItem != NULL) 
      pActiveItem->SetItemRects(); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CContDemoView diagnostics 
 
#ifdef _DEBUG 
void CContDemoView::AssertValid() const 
{ 
   CView::AssertValid(); 
} 
 
void CContDemoView::Dump(CDumpContext& dc) const 
{ 
   CView::Dump(dc); 
} 
 
CContDemoDoc* CContDemoView::GetDocument() // non-debug version is inline 
{ 
   ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CContDemoDoc))); 
   return (CContDemoDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CContDemoView message handlers