home *** CD-ROM | disk | FTP | other *** search
- // ATLDrawView.cpp : implementation of the CATLDrawView class
- //
- // This is a part of the Active Template Library.
- // Copyright (C) 1996-1998 Microsoft Corporation
- // All rights reserved.
- //
- // This source code is only intended as a supplement to the
- // Active Template Library Reference and related
- // electronic documentation provided with the library.
- // See these sources for detailed information regarding the
- // Active Template Library product.
- //
-
- #include "preatldr.h"
- #include "ATLDraw.h"
-
- #include "ATLDDoc.h"
- #include "ATLDView.h"
-
- #define IID_DEFINED
- #include "..\DrawServ\DrawServ_i.c"
-
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
-
- /////////////////////////////////////////////////////////////////////////////
- // CATLDrawView
-
- IMPLEMENT_DYNCREATE(CATLDrawView, CView)
-
- BEGIN_MESSAGE_MAP(CATLDrawView, CView)
- //{{AFX_MSG_MAP(CATLDrawView)
- ON_WM_LBUTTONDOWN()
- ON_WM_MOUSEMOVE()
- ON_WM_LBUTTONUP()
- ON_COMMAND(ID_SERVER_CONNECT, OnServerConnect)
- ON_COMMAND(ID_SERVER_DISCONNENT, OnServerDisconnent)
- ON_UPDATE_COMMAND_UI(ID_SERVER_CONNECT, OnUpdateServerConnect)
- ON_UPDATE_COMMAND_UI(ID_SERVER_DISCONNENT, OnUpdateServerDisconnent)
- ON_COMMAND(ID_VIEW_COLOR, OnViewColor)
- //}}AFX_MSG_MAP
- // Standard printing commands
- ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
- ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
- ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
- END_MESSAGE_MAP()
-
- BEGIN_INTERFACE_MAP(CATLDrawView, CCmdTarget)
- INTERFACE_PART(CATLDrawView, IID_IDrawServ, DrawServ)
- END_INTERFACE_MAP()
-
- /////////////////////////////////////////////////////////////////////////////
- // CATLDrawView construction/destruction
-
- CATLDrawView::CATLDrawView()
- {
- HRESULT hr;
-
- hr = CoInitialize(NULL);
- ASSERT(SUCCEEDED(hr));
-
- hr = CoInitializeSecurity(NULL, -1, NULL, NULL,
- RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);
- ASSERT(SUCCEEDED(hr));
-
- m_bDragging = FALSE;
- m_pDrawServ = NULL;
- m_col = RGB(255, 0, 0);
- }
-
- CATLDrawView::~CATLDrawView()
- {
- if (m_pDrawServ != NULL)
- {
- DisconnectSink(IID_IDrawServ,m_dwDrawServ);
- m_pDrawServ->Release();
- }
- CoUninitialize();
- }
-
- BOOL CATLDrawView::PreCreateWindow(CREATESTRUCT& cs)
- {
- // TODO: Modify the Window class or styles here by modifying
- // the CREATESTRUCT cs
-
- return CView::PreCreateWindow(cs);
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // CATLDrawView drawing
-
- void CATLDrawView::OnDraw(CDC* pDC)
- {
- pDC;
- CATLDrawDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
-
- // TODO: add draw code for native data here
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // CATLDrawView printing
-
- BOOL CATLDrawView::OnPreparePrinting(CPrintInfo* pInfo)
- {
- // default preparation
- return DoPreparePrinting(pInfo);
- }
-
- void CATLDrawView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
- {
- // TODO: add extra initialization before printing
- }
-
- void CATLDrawView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
- {
- // TODO: add cleanup after printing
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // CATLDrawView diagnostics
-
- #ifdef _DEBUG
- void CATLDrawView::AssertValid() const
- {
- CView::AssertValid();
- }
-
- void CATLDrawView::Dump(CDumpContext& dc) const
- {
- CView::Dump(dc);
- }
-
- CATLDrawDoc* CATLDrawView::GetDocument() // non-debug version is inline
- {
- ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CATLDrawDoc)));
- return (CATLDrawDoc*)m_pDocument;
- }
- #endif //_DEBUG
-
- /////////////////////////////////////////////////////////////////////////////
- // CATLDrawView message handlers
-
- void CATLDrawView::OnLButtonDown(UINT nFlags, CPoint point)
- {
- m_bDragging = TRUE;
- m_pos = point;
-
- CView::OnLButtonDown(nFlags, point);
- }
-
- void CATLDrawView::OnMouseMove(UINT nFlags, CPoint point)
- {
- if (m_bDragging)
- {
- if (m_pDrawServ != NULL)
- {
- HRESULT hr;
- hr = m_pDrawServ->Draw(
- m_pos.x, m_pos.y,
- point.x, point.y,
- m_col);
- if (FAILED(hr))
- {
- TCHAR buf[32];
- wsprintf(buf, _T("%xd"), hr);
- AfxMessageBox(buf);
- }
- }
- m_pos = point;
- }
-
- CView::OnMouseMove(nFlags, point);
- }
-
- void CATLDrawView::OnLButtonUp(UINT nFlags, CPoint point)
- {
- m_bDragging = FALSE;
-
- CView::OnLButtonUp(nFlags, point);
- }
-
- void CATLDrawView::Draw(long x1, long y1, long x2, long y2, unsigned long col)
- {
- CClientDC dc(this);
-
- CPen pen(PS_SOLID, 2, (COLORREF) col);
- CPen* oldPen = dc.SelectObject(&pen);
- dc.MoveTo(x1, y1);
- dc.LineTo(x2, y2);
- dc.SelectObject(oldPen);
- }
-
- void CATLDrawView::OnServerConnect()
- {
- HRESULT hr;
-
- hr = CoCreateInstance(CLSID_CDrawServ, NULL, CLSCTX_SERVER, IID_IDrawServ, (void**)&m_pDrawServ);
- if (FAILED(hr))
- {
- AfxMessageBox(_T("Failed to connect to server"));
- return;
- }
-
- IUnknown* pUnk;
- m_xDrawServ.QueryInterface(IID_IUnknown, (void**) &pUnk);
- if (ConnectSink(IID_IDrawServ, pUnk) == FALSE)
- {
- m_pDrawServ->Release();
- m_pDrawServ = NULL;
- }
- pUnk->Release();
- }
-
- void CATLDrawView::OnServerDisconnent()
- {
- if (m_pDrawServ != NULL)
- {
- DisconnectSink(IID_IDrawServ,m_dwDrawServ);
- m_pDrawServ->Release();
- m_pDrawServ = NULL;
- AfxMessageBox("Disconnected");
- }
- }
-
- BOOL CATLDrawView::ConnectSink(REFIID iid, LPUNKNOWN punkSink)
- {
- BOOL bRC = FALSE;
- ASSERT(m_pDrawServ != NULL);
-
- LPCONNECTIONPOINTCONTAINER pConnPtCont;
-
- if ((m_pDrawServ != NULL) &&
- SUCCEEDED(m_pDrawServ->QueryInterface(IID_IConnectionPointContainer,
- (LPVOID*)&pConnPtCont)))
- {
- ASSERT(pConnPtCont != NULL);
- LPCONNECTIONPOINT pConnPt = NULL;
-
- HRESULT hRes = pConnPtCont->FindConnectionPoint(iid, &pConnPt);
- ASSERT(hRes == S_OK);
- if (SUCCEEDED(hRes))
- {
- ASSERT(pConnPt != NULL);
- hRes = pConnPt->Advise(punkSink, &m_dwDrawServ);
- if (FAILED(hRes))
- {
- TCHAR buf[32];
- wsprintf(buf, _T("%x"), hRes);
- AfxMessageBox(buf);
- return FALSE;
- }
- AfxMessageBox(_T("Connected"));
- bRC = TRUE;
- pConnPt->Release();
- }
- pConnPtCont->Release();
- }
- return bRC;
- }
-
- void CATLDrawView::DisconnectSink(REFIID iid, DWORD dwCookie)
- {
- if (dwCookie == 0)
- return;
-
- ASSERT(m_pDrawServ != NULL);
-
- LPCONNECTIONPOINTCONTAINER pConnPtCont;
-
- if ((m_pDrawServ != NULL) &&
- SUCCEEDED(m_pDrawServ->QueryInterface(IID_IConnectionPointContainer,
- (LPVOID*)&pConnPtCont)))
- {
- ASSERT(pConnPtCont != NULL);
- LPCONNECTIONPOINT pConnPt = NULL;
-
- if (SUCCEEDED(pConnPtCont->FindConnectionPoint(iid, &pConnPt)))
- {
- ASSERT(pConnPt != NULL);
- pConnPt->Unadvise(dwCookie);
- pConnPt->Release();
- }
-
- pConnPtCont->Release();
- }
- }
-
- STDMETHODIMP_(ULONG) CATLDrawView::XDrawServ::AddRef()
- {
- METHOD_PROLOGUE_EX(CATLDrawView, DrawServ)
- TRACE("AddRef\n");
- return (ULONG)pThis->ExternalAddRef();
- }
-
- STDMETHODIMP_(ULONG) CATLDrawView::XDrawServ::Release()
- {
- METHOD_PROLOGUE_EX(CATLDrawView, DrawServ)
- TRACE("Release\n");
- return (ULONG)pThis->ExternalRelease();
- }
-
- STDMETHODIMP CATLDrawView::XDrawServ::QueryInterface(
- REFIID iid, LPVOID far * ppvObj)
- {
- METHOD_PROLOGUE_EX(CATLDrawView, DrawServ)
- TRACE("QueryInterface\n");
- return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
- }
-
- STDMETHODIMP CATLDrawView::XDrawServ::Draw(
- long x1, long y1, long x2, long y2, unsigned long col)
- {
- METHOD_PROLOGUE_EX(CATLDrawView, DrawServ)
-
- pThis->Draw(x1, y1, x2, y2, col);
-
- return S_OK;
- }
-
- void CATLDrawView::OnUpdateServerConnect(CCmdUI* pCmdUI)
- {
- pCmdUI->Enable(m_pDrawServ == NULL);
- }
-
- void CATLDrawView::OnUpdateServerDisconnent(CCmdUI* pCmdUI)
- {
- pCmdUI->Enable(m_pDrawServ != NULL);
- }
-
- void CATLDrawView::OnViewColor()
- {
- CColorDialog dlg;
-
- if (dlg.DoModal() == IDOK)
- {
- m_col = dlg.GetColor();
- }
- }
-