// ATLDrawView.cpp : implementation of the CATLDrawView class // // This is a part of the ActiveX Template Library. // Copyright (C) 1996 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // ActiveX Template Library Reference and related // electronic documentation provided with the library. // See these sources for detailed information regarding the // ActiveX Template Library product. // #include "preatldr.h" #include "ATLDraw.h" #include "ATLDDoc.h" #include "ATLDView.h" #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) ON_COMMAND(ID_CLEAR, OnClear) //}}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, __uuidof(IDrawServ), DrawServ) END_INTERFACE_MAP() ///////////////////////////////////////////////////////////////////////////// // CATLDrawView construction/destruction CATLDrawView::CATLDrawView() { HRESULT hr; hr = CoInitialize(NULL); _ASSERTE(SUCCEEDED(hr)); hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL); _ASSERTE(SUCCEEDED(hr)); m_bDragging = FALSE; m_col = RGB(255, 0, 0); } CATLDrawView::~CATLDrawView() { if ((bool) m_pDrawServ) { DisconnectSink(__uuidof(IDrawServ), m_dwDrawServ); m_pDrawServ = 0; } 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->raw_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() { if (SUCCEEDED(m_pDrawServ.CreateInstance(__uuidof(CDrawServ), NULL, CLSCTX_SERVER))) { IUnknown* pUnk; m_xDrawServ.QueryInterface(__uuidof(IUnknown), (void**) &pUnk); if (ConnectSink(__uuidof(IDrawServ), pUnk) == FALSE) m_pDrawServ = 0; pUnk->Release(); } else AfxMessageBox(_T("Connect failed!")); } void CATLDrawView::OnServerDisconnent() { if ((bool) m_pDrawServ) { DisconnectSink(__uuidof(IDrawServ), m_dwDrawServ); m_pDrawServ = 0; } } BOOL CATLDrawView::ConnectSink(REFIID iid, LPUNKNOWN punkSink) { ASSERT((bool) m_pDrawServ); IConnectionPointContainerPtr pCPC; IConnectionPointPtr pCP; try { pCPC = m_pDrawServ; ASSERT((bool) pCPC); pCPC->FindConnectionPoint(iid, &pCP); ASSERT((bool) pCP); pCP->Advise(punkSink, &m_dwDrawServ); ASSERT(punkSink != NULL); } catch(_com_error& e) { dump_com_error(e); AfxMessageBox(_T("Connect failed!")); return FALSE; } AfxMessageBox(_T("Connected")); pCP = 0; pCPC = 0; return TRUE; } void CATLDrawView::DisconnectSink(REFIID iid, DWORD dwCookie) { if (dwCookie == 0) return; ASSERT((bool) m_pDrawServ); IConnectionPointContainerPtr pCPC; IConnectionPointPtr pCP; try { pCPC = m_pDrawServ; ASSERT((bool) pCPC); pCPC->FindConnectionPoint(iid, &pCP); ASSERT((bool) pCP); pCP->Unadvise(dwCookie); } catch(_com_error& e) { dump_com_error(e); AfxMessageBox(_T("Disconnect failed!")); } AfxMessageBox(_T("Disconnected")); pCP = 0; pCPC = 0; } 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::raw_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(!(bool)m_pDrawServ); } void CATLDrawView::OnUpdateServerDisconnent(CCmdUI* pCmdUI) { pCmdUI->Enable((bool) m_pDrawServ); } void CATLDrawView::OnViewColor() { CColorDialog dlg; if (dlg.DoModal() == IDOK) { m_col = dlg.GetColor(); } } void CATLDrawView::OnClear() { Invalidate(); }