// LCDManView.cpp : implementation of the CLCDManView class // #include "stdafx.h" #include "LCDMan.h" #include "LCDManDoc.h" #include "LCDManView.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CLCDManView IMPLEMENT_DYNCREATE(CLCDManView, CView) BEGIN_MESSAGE_MAP(CLCDManView, CView) //{{AFX_MSG_MAP(CLCDManView) ON_COMMAND(ID_VIEW_NEXT, OnViewNext) ON_COMMAND(ID_VIEW_PREVIOUS, OnViewPrevious) ON_WM_TIMER() //}}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() ///////////////////////////////////////////////////////////////////////////// // CLCDManView construction/destruction CLCDManView::CLCDManView() : /*m_Rect(0, 0, 700, 70),*/ m_RectImg(100, 50, 100 + LCD_X_DIMENSION, 50 + LCD_Y_DIMENSION), m_iTimerInterval (0), m_iTextPos(0), m_pos(NULL) { m_bmText.bmBits = m_bmVal; } CLCDManView::~CLCDManView() { } BOOL CLCDManView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CLCDManView drawing void CLCDManView::OnDraw(CDC* pDC) { CLCDManDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc->GetLIst()->IsEmpty()) { // Convert the text into bitmap // HDC hDCMem = ::CreateCompatibleDC(pDC->m_hDC); CDC dcMem; if (!dcMem.CreateCompatibleDC(pDC)) return; CFont cfFit; LOGFONT logfnt; // determine default font for document memset(&logfnt, 0, sizeof logfnt); lstrcpy(logfnt.lfFaceName, _T("Arial")); logfnt.lfOutPrecision = OUT_TT_PRECIS; logfnt.lfClipPrecision = CLIP_DEFAULT_PRECIS; logfnt.lfQuality = PROOF_QUALITY; logfnt.lfPitchAndFamily = FF_SWISS | VARIABLE_PITCH; logfnt.lfHeight = (LCD_Y_DIMENSION); cfFit.CreateFontIndirect(&logfnt); CFont *pcfDefault = dcMem.SelectObject( &cfFit ); SIZE size; size.cx = LCD_X_DIMENSION; size.cy = LCD_Y_DIMENSION; CBitmap CBitMapText; // HBITMAP hBitMap = ::CreateCompatibleBitmap(hDCMem, size.cx, size.cy); if (!CBitMapText.CreateCompatibleBitmap(pDC, size.cx, size.cy)) return; dcMem.SelectObject(&CBitMapText); SIZE szState = dcMem.GetTextExtent(pDoc->GetState()); CRect crectState(0, 0, szState.cx, size.cy); CRect crectMsg(szState.cx, 0, size.cx, size.cy); // Build the full message string from m_List CStringList *pList = pDoc->GetLIst(); CString CStrFull = (TEXT("")); CString cstr(TEXT("")); POSITION pos ; if (pList->IsEmpty()) return; SIZE szMsg; LONG lFullLength = 0; for ( pos = pList->GetHeadPosition(); ; ) { cstr = pList->GetNext(pos); szMsg = dcMem.GetTextExtent(cstr); CStrFull += cstr; lFullLength += szMsg.cx; if (lFullLength > size.cx + 10 && m_iTimerInterval == 0) { // Start rolling m_iTimerInterval = 200; KillTimer(1); SetTimer(1, m_iTimerInterval, NULL); m_iTextPos = 0; } if (lFullLength - m_iTextPos > size.cx + 10) break; else if (pos == NULL && lFullLength > size.cx + 10) pos = pList->GetHeadPosition(); else if (pos == NULL) break; } if (lFullLength <= size.cx + 10 && m_iTimerInterval != 0) { // Stop rolling m_iTimerInterval = 0; KillTimer(1); m_iTextPos = 0; } dcMem.ExtTextOut(0, 0, ETO_CLIPPED | ETO_OPAQUE, &crectState, pDoc->GetState(), NULL); dcMem.ExtTextOut(crectState.right - m_iTextPos,0, ETO_CLIPPED | ETO_OPAQUE, &crectMsg, CStrFull, NULL); // Recreate the bitmap from BITMAP srtuct CBitMapText.GetBitmap(&m_bmText); m_bmText.bmBits = m_bmVal; CBitMapText.GetBitmapBits(sizeof(m_bmVal), m_bmText.bmBits); dcMem.SelectObject(pcfDefault ); dcMem.DeleteDC(); CBitMapText.DeleteObject(); CBitmap CBOut; if (!CBOut.CreateBitmapIndirect(&m_bmText)) return; // Display new bitmap CDC dcMem1; if (!dcMem1.CreateCompatibleDC(pDC)) return; dcMem1.SelectObject(&CBOut); // Display the bitmap GetClientRect(m_RectImg); m_RectImg.top = (m_RectImg.bottom - LCD_Y_DIMENSION) / 2; m_RectImg.bottom = (m_RectImg.bottom + LCD_Y_DIMENSION) / 2; m_RectImg.left = (m_RectImg.right - LCD_X_DIMENSION) / 2; m_RectImg.right = (m_RectImg.right + LCD_X_DIMENSION) / 2; CRect crFrame(m_RectImg); crFrame.InflateRect(1,1,1,1); pDC->Rectangle(&crFrame); pDC->BitBlt(m_RectImg.left, m_RectImg.top, size.cx, size.cy, &dcMem1, 0, 0, SRCCOPY ); // Clean up CBOut.DeleteObject(); } } ///////////////////////////////////////////////////////////////////////////// // CLCDManView printing BOOL CLCDManView::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo); } void CLCDManView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing } void CLCDManView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing } ///////////////////////////////////////////////////////////////////////////// // CLCDManView diagnostics #ifdef _DEBUG void CLCDManView::AssertValid() const { CView::AssertValid(); } void CLCDManView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CLCDManDoc* CLCDManView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CLCDManDoc))); return (CLCDManDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CLCDManView message handlers void CLCDManView::OnViewNext() { CLCDManDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CStringList *pList = pDoc->GetLIst(); if (m_pos) { pList->GetNext(m_pos); } InvalidateRect(NULL, TRUE); } void CLCDManView::OnViewPrevious() { CLCDManDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CStringList *pList = pDoc->GetLIst(); if (m_pos) { pList->GetPrev(m_pos); } InvalidateRect(NULL, TRUE); } void CLCDManView::OnTimer(UINT nIDEvent) { if (nIDEvent == 1) { // Roll the message m_iTextPos += 5; InvalidateRect(&m_RectImg, FALSE); } else if (nIDEvent == 2) { // Recreate document CLCDManDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDoc->InitDocument(NULL); InvalidateRect(&m_RectImg, FALSE); } CView::OnTimer(nIDEvent); }