// TotalView.cpp : 实现文件 // #include #include "pch.h" #include "MCA.h" #include "MCADoc.h" #include "TotalView.h" #include "ControlView.h" // CTotalView IMPLEMENT_DYNCREATE(CTotalView, CView) CTotalView::CTotalView() { } CTotalView::~CTotalView() { } BEGIN_MESSAGE_MAP(CTotalView, CView) ON_WM_PAINT() ON_WM_ERASEBKGND() ON_WM_LBUTTONDOWN() ON_WM_RBUTTONDOWN() END_MESSAGE_MAP() // CTotalView 绘图 void CTotalView::OnDraw(CDC* pDc) { if (pDoc == NULL) pDoc = (CMCADoc*)GetDocument(); if (pView == NULL) pView = (CControlView*)pDoc->GetView(RUNTIME_CLASS(CControlView)); // 背景颜色、笔颜色等设置 CDC MemDC; MemDC.CreateCompatibleDC(pDc); CRect rect; CBitmap Bitmap, * OldBitmap; CPen linePen(PS_SOLID, 3, RGB(0, 0, 0)); CPen cursor1Pen(PS_SOLID, 5, RGB(255, 0, 0)); CPen cursor2Pen(PS_SOLID, 5, RGB(0, 255, 0)); MemDC.SelectObject(&linePen); GetClientRect(&rect); Bitmap.CreateCompatibleBitmap(pDc, rect.Width(), rect.Height()); OldBitmap = MemDC.SelectObject(&Bitmap); MemDC.FillSolidRect(0, 0, rect.Width(), rect.Height(), RGB(36, 217, 163)); // 绘图 if (pView->m_sAxisMode == "Linear") { MemDC.MoveTo(1, rect.Height() - pDoc->m_nChannelSmooth[0] * rect.Height() / pView->m_nLC); for (int i = 0; i < 1024; i++) MemDC.LineTo(2 * i + 1, rect.Height() - pDoc->m_nChannelSmooth[i] * rect.Height() / pView->m_nLC); } else { MemDC.MoveTo(1, rect.Height() - log10(max(pDoc->m_nChannelSmooth[0], 1)) * rect.Height() / log10(pView->m_nLC)); for (int i = 0; i < 1024; i++) MemDC.LineTo(2 * i + 1, rect.Height() - log10(max(pDoc->m_nChannelSmooth[i], 1)) * rect.Height() / log10(pView->m_nLC)); } // 绘制光标竖线 linePen.DeleteObject(); MemDC.SelectObject(&cursor1Pen); MemDC.MoveTo(2 * pView->m_nCursor1 + 1, 0); MemDC.LineTo(2 * pView->m_nCursor1 + 1, rect.Height()); cursor1Pen.DeleteObject(); CPen* oldpen = MemDC.SelectObject(&cursor2Pen); MemDC.MoveTo(2 * pView->m_nCursor2 + 1, 0); MemDC.LineTo(2 * pView->m_nCursor2 + 1, rect.Height()); //释放资源 MemDC.SelectObject(oldpen); cursor2Pen.DeleteObject(); pDc->BitBlt(0, 0, rect.Width(), rect.Height(), &MemDC, 0, 0, SRCCOPY); MemDC.SelectObject(OldBitmap); Bitmap.DeleteObject(); MemDC.DeleteDC(); } // CTotalView 诊断 #ifdef _DEBUG void CTotalView::AssertValid() const { CView::AssertValid(); } #ifndef _WIN32_WCE void CTotalView::Dump(CDumpContext& dc) const { CView::Dump(dc); } #endif #endif //_DEBUG // CTotalView 消息处理程序 void CTotalView::OnPaint() { CPaintDC dc(this); // device context for painting OnPrepareDC(&dc); OnDraw(&dc); } BOOL CTotalView::OnEraseBkgnd(CDC* pDC) { return TRUE; } void CTotalView::OnLButtonDown(UINT nFlags, CPoint point) { if (pDoc == NULL) pDoc = (CMCADoc*)GetDocument(); if (pView == NULL) pView = (CControlView*)pDoc->GetView(RUNTIME_CLASS(CControlView)); int nX = (point.x - 1) / 2; if (nX < pView->m_nCursor2) { pView->m_nCursor1 = nX; pView->m_nWidth = pView->m_nCursor2 - pView->m_nCursor1 + 1; pView->m_nCursorROI = max(pView->m_nCursor1, pView->m_nCursorROI); } pView->UpdateData(FALSE); pDoc->UpdateAllViews(NULL); CView::OnLButtonDown(nFlags, point); } void CTotalView::OnRButtonDown(UINT nFlags, CPoint point) { if (pDoc == NULL) pDoc = (CMCADoc*)GetDocument(); if (pView == NULL) pView = (CControlView*)pDoc->GetView(RUNTIME_CLASS(CControlView)); int nX = (point.x - 1) / 2; if (nX > pView->m_nCursor1) { pView->m_nCursor2 = nX; pView->m_nWidth = pView->m_nCursor2 - pView->m_nCursor1 + 1; pView->m_nCursorROI = min(pView->m_nCursor2, pView->m_nCursorROI); } pView->UpdateData(FALSE); pDoc->UpdateAllViews(NULL); CView::OnRButtonDown(nFlags, point); }