This repository has been archived on 2022-07-04. You can view files and clone it, but cannot push or open issues or pull requests.
Multichannel-Analyzer/MCA/TotalView.cpp

138 lines
3.6 KiB
C++
Raw Normal View History

// TotalView.cpp : 实现文件
2022-03-20 15:14:44 +08:00
//
#include <math.h>
2022-03-20 15:14:44 +08:00
#include "pch.h"
#include "MCA.h"
#include "MCADoc.h"
2022-03-20 15:14:44 +08:00
#include "TotalView.h"
#include "ControlView.h"
2022-03-20 15:14:44 +08:00
// CTotalView
IMPLEMENT_DYNCREATE(CTotalView, CView)
2022-06-03 13:36:34 +08:00
CTotalView::CTotalView() {
2022-03-20 15:14:44 +08:00
}
2022-06-03 13:36:34 +08:00
CTotalView::~CTotalView() {
2022-03-20 15:14:44 +08:00
}
BEGIN_MESSAGE_MAP(CTotalView, CView)
ON_WM_PAINT()
ON_WM_ERASEBKGND()
ON_WM_LBUTTONDOWN()
ON_WM_RBUTTONDOWN()
2022-03-20 15:14:44 +08:00
END_MESSAGE_MAP()
// CTotalView 绘图
2022-06-03 13:36:34 +08:00
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;
2022-06-03 21:51:15 +08:00
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));
}
// 绘制光标竖线
2022-06-03 21:51:15 +08:00
linePen.DeleteObject();
MemDC.SelectObject(&cursor1Pen);
MemDC.MoveTo(2 * pView->m_nCursor1 + 1, 0);
MemDC.LineTo(2 * pView->m_nCursor1 + 1, rect.Height());
2022-06-03 21:51:15 +08:00
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);
2022-06-03 21:51:15 +08:00
cursor2Pen.DeleteObject();
pDc->BitBlt(0, 0, rect.Width(), rect.Height(), &MemDC, 0, 0, SRCCOPY);
MemDC.SelectObject(OldBitmap);
Bitmap.DeleteObject();
MemDC.DeleteDC();
2022-03-20 15:14:44 +08:00
}
// CTotalView 诊断
2022-03-20 15:14:44 +08:00
#ifdef _DEBUG
2022-06-03 13:36:34 +08:00
void CTotalView::AssertValid() const {
2022-03-20 15:14:44 +08:00
CView::AssertValid();
}
#ifndef _WIN32_WCE
2022-06-03 13:36:34 +08:00
void CTotalView::Dump(CDumpContext& dc) const {
2022-03-20 15:14:44 +08:00
CView::Dump(dc);
}
#endif
#endif //_DEBUG
// CTotalView 消息处理程序
2022-06-03 13:36:34 +08:00
void CTotalView::OnPaint() {
CPaintDC dc(this); // device context for painting
OnPrepareDC(&dc);
OnDraw(&dc);
}
2022-06-03 13:36:34 +08:00
BOOL CTotalView::OnEraseBkgnd(CDC* pDC) {
return TRUE;
}
2022-06-03 13:36:34 +08:00
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;
2022-06-03 01:47:52 +08:00
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);
}
2022-06-03 13:36:34 +08:00
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;
2022-06-03 01:47:52 +08:00
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);
}