// MFC_DEMOView.cpp : implementation of the CMFC_DEMOView class // #include "stdafx.h" #include "MFC_DEMO.h" #include "DEMODoc.h" #include "DEMOView.h" #include #define PACKETDATA PK_X | PK_Y | PK_BUTTONS #define PACKETMODE 0 #include #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMFC_DEMOView IMPLEMENT_DYNCREATE(CMFC_DEMOView, CView) BEGIN_MESSAGE_MAP(CMFC_DEMOView, CView) ON_MESSAGE(WT_PACKET, OnWTPacket) //{{AFX_MSG_MAP(CMFC_DEMOView) ON_WM_CREATE() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMFC_DEMOView construction/destruction CMFC_DEMOView::CMFC_DEMOView() { csr.x = -1; prev_pkButtons = 0; pWTMutex = new CMutex( TRUE, NULL, NULL ); hCtx = 0; } CMFC_DEMOView::~CMFC_DEMOView() { delete pWTMutex; if( hCtx ) WTClose( hCtx ); } BOOL CMFC_DEMOView::PreCreateWindow(CREATESTRUCT& cs) { return CView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CMFC_DEMOView drawing void CMFC_DEMOView::OnDraw(CDC* pDC) { CMFC_DEMODoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); csr.x = -1; list * lst = pDoc->GetLst(); list::iterator i = lst->begin(); while( i != lst->end() ) { if( i->x >= 0 ) pDC->LineTo(i->x,i->y); else pDC->MoveTo(abs(i->x),abs(i->y)); i++; } } ///////////////////////////////////////////////////////////////////////////// // CMFC_DEMOView diagnostics #ifdef _DEBUG void CMFC_DEMOView::AssertValid() const { CView::AssertValid(); } void CMFC_DEMOView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CMFC_DEMODoc* CMFC_DEMOView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFC_DEMODoc))); return (CMFC_DEMODoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMFC_DEMOView message handlers LRESULT CMFC_DEMOView::OnWTPacket(WPARAM wSerial, LPARAM hCtx) { // Read the packet PACKET pkt; WTPacket( (HCTX)hCtx, wSerial, &pkt ); // Process packets in order, one at a time CSingleLock lock( pWTMutex, TRUE ); CDC *pDC = GetDC(); // Get window size RECT window_rect; GetWindowRect( &window_rect ); POINT size; size.x = window_rect.right - window_rect.left; size.y = window_rect.bottom - window_rect.top; // Erase the old cursor if( csr.x >= 0 ) { CRgn r; r.CreateRectRgn( csr.x - 2, csr.y - 2, csr.x + 2, csr.y + 2 ); pDC->InvertRgn( &r ); } csr.x = (size.x * pkt.pkX) / lc.lcInExtX; csr.y = size.y - (size.y * pkt.pkY) / lc.lcInExtY; if( pkt.pkButtons ) { CMFC_DEMODoc *pDoc = GetDocument(); list * lst = pDoc->GetLst(); if( prev_pkButtons ) { list::iterator i = lst->end(); i--; pDC->MoveTo(abs(i->x),abs(i->y)); lst->push_back(csr); pDC->LineTo(csr); } else { POINT pt; pt.x = -csr.x; pt.y = -csr.y; lst->push_back(pt); } } prev_pkButtons = pkt.pkButtons; // Draw a new cursor CRgn r; r.CreateRectRgn( csr.x - 2, csr.y - 2, csr.x + 2, csr.y + 2 ); pDC->InvertRgn( &r ); ReleaseDC( pDC ); return TRUE; } int CMFC_DEMOView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // Open a Wintab context // Get default context information WTInfo( WTI_DEFCONTEXT, 0, &lc ); // Open the context lc.lcPktData = PACKETDATA; lc.lcPktMode = PACKETMODE; lc.lcOptions = CXO_MESSAGES; //hCtx = WTOpen( m_hWnd, &lc, TRUE ); hCtx = WTOpen( m_hWnd, &lc, TRUE ); return 0; }