From fd8d749eb9d9ad4b711b7fdd6a61fdd79f139832 Mon Sep 17 00:00:00 2001 From: YiHui Liu Date: Tue, 31 May 2022 22:21:20 +0800 Subject: [PATCH] =?UTF-8?q?add:=20*=20=E5=85=A8=E8=B0=B1=E5=8C=BA=20*=20?= =?UTF-8?q?=E6=94=BE=E5=A4=A7=E5=8C=BA=20*=20=E7=BB=93=E6=9D=9F=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=20*=20=E6=A8=A1=E6=8B=9F=E4=BF=A1=E5=8F=B7=20*=20?= =?UTF-8?q?=E5=BC=80=E5=A7=8B=E3=80=81=E7=BB=93=E6=9D=9F=E3=80=81=E6=9A=82?= =?UTF-8?q?=E5=81=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ChangeLog.md | 7 ++ MCA/ControlView.cpp | 169 +++++++++++++++++++++++++++++++++++++++- MCA/ControlView.h | 45 ++++++++++- MCA/DetailView.cpp | 94 ++++++++++++++++++++-- MCA/DetailView.h | 11 ++- MCA/MCA.rc | Bin 27700 -> 33478 bytes MCA/MCA.vcxproj | 11 +++ MCA/MCA.vcxproj.filters | 33 ++++++++ MCA/MCADoc.cpp | 60 +++++++++++--- MCA/MCADoc.h | 10 ++- MCA/MainFrm.cpp | 51 +++++++++--- MCA/MainFrm.h | 5 +- MCA/Resource.h | 67 +++++++++++++--- MCA/TotalView.cpp | 77 ++++++++++++++++-- MCA/TotalView.h | 10 +++ MCA/res/Toolbar.bmp | Bin 15118 -> 12718 bytes MCA/res/clear.ico | Bin 0 -> 10462 bytes MCA/res/close.ico | Bin 0 -> 10462 bytes MCA/res/down.ico | Bin 0 -> 10462 bytes MCA/res/folder.ico | Bin 0 -> 10462 bytes MCA/res/left.ico | Bin 0 -> 10462 bytes MCA/res/right.ico | Bin 0 -> 10462 bytes MCA/res/save.ico | Bin 0 -> 10462 bytes MCA/res/start.ico | Bin 0 -> 10462 bytes MCA/res/stop.ico | Bin 0 -> 10462 bytes MCA/res/up.ico | Bin 0 -> 10462 bytes 26 files changed, 591 insertions(+), 59 deletions(-) create mode 100644 MCA/res/clear.ico create mode 100644 MCA/res/close.ico create mode 100644 MCA/res/down.ico create mode 100644 MCA/res/folder.ico create mode 100644 MCA/res/left.ico create mode 100644 MCA/res/right.ico create mode 100644 MCA/res/save.ico create mode 100644 MCA/res/start.ico create mode 100644 MCA/res/stop.ico create mode 100644 MCA/res/up.ico diff --git a/ChangeLog.md b/ChangeLog.md index 53fcec7..6149fc9 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -9,4 +9,11 @@ ### 5.30 * control view +### 5.31 +* 全谱区 +* 放大区 +* 结束条件 +* 模拟信号 +* 开始、结束、暂停 + [^1]: Xiao M, Hu R, Ge L Q, et al. Study of a full-digital multi-waveform nuclear pulse signal generator[J]. Applied Radiation and Isotopes, 2022, 179: 110028. \ No newline at end of file diff --git a/MCA/ControlView.cpp b/MCA/ControlView.cpp index ccb631a..8e1e297 100644 --- a/MCA/ControlView.cpp +++ b/MCA/ControlView.cpp @@ -1,6 +1,8 @@ // ControlView.cpp: 实现文件 // +#include + #include "pch.h" #include "math.h" @@ -15,6 +17,18 @@ IMPLEMENT_DYNCREATE(CControlView, CFormView) CControlView::CControlView() : CFormView(IDD_DIALOG_CONTROL) + , m_nCond(100) + , m_nT0(0) + , m_nTime(0) + , m_nTimeStr((CString)'0') + , m_nTotalCount(0) + , m_nPartCount(0) + , m_nMaxCount(0) + , m_nRange(4) + , m_nCursor1(0) + , m_nCursor2(1023) + , m_nCursorROI(0) + , m_nCursorROICount(0) { } @@ -24,11 +38,33 @@ CControlView::~CControlView() void CControlView::DoDataExchange(CDataExchange* pDX) { - CFormView::DoDataExchange(pDX); + CFormView::DoDataExchange(pDX); + DDX_Text(pDX, IDC_COND, m_nCond); + DDX_Text(pDX, IDC_TIME, m_nTimeStr); + DDX_Text(pDX, IDC_TCOUNT, m_nTotalCount); + DDX_Text(pDX, IDC_PCOUNT, m_nPartCount); + DDX_Text(pDX, IDC_MCOUNT, m_nMaxCount); + DDX_Control(pDX, IDC_MODE, m_ComboMode); + DDX_Control(pDX, IDC_AXIS, m_ComboAxis); + DDX_Text(pDX, IDC_RANGE, m_nRange); + DDX_Text(pDX, IDC_CURSOR1, m_nCursor1); + DDX_Text(pDX, IDC_CURSOR2, m_nCursor2); + DDX_Text(pDX, IDC_CURSORROI, m_nCursorROI); + DDX_Text(pDX, IDC_CURSORROI_COUNT, m_nCursorROICount); } BEGIN_MESSAGE_MAP(CControlView, CFormView) ON_WM_SIZE() + ON_COMMAND(ID_STA_START, &CControlView::OnStaStart) + ON_COMMAND(ID_STA_STOP, &CControlView::OnStaStop) + ON_UPDATE_COMMAND_UI(ID_STA_START, &CControlView::OnUpdateStaStart) + ON_UPDATE_COMMAND_UI(ID_STA_STOP, &CControlView::OnUpdateStaStop) + ON_COMMAND(ID_STA_CLEAR, &CControlView::OnStaClear) + ON_UPDATE_COMMAND_UI(ID_STA_CLEAR, &CControlView::OnUpdateStaClear) + ON_WM_TIMER() + ON_COMMAND(ID_SIMU_CO, &CControlView::OnSimuCo) + ON_COMMAND(ID_SIMU_CS, &CControlView::OnSimuCs) + ON_COMMAND(ID_SIMU_NA, &CControlView::OnSimuNa) END_MESSAGE_MAP() @@ -50,8 +86,6 @@ void CControlView::Dump(CDumpContext& dc) const // CControlView 消息处理程序 - - void CControlView::OnSize(UINT nType, int cx, int cy) { CFormView::OnSize(nType, cx, cy); @@ -62,4 +96,131 @@ void CControlView::OnSize(UINT nType, int cx, int cy) size.cx = rect.right - rect.left; size.cy = rect.bottom - rect.top; SetScrollSizes(MM_HIMETRIC, size); // 将CScrollView的大小设置为当前客户区大小 -} \ No newline at end of file +} + +void CControlView::OnInitialUpdate() +{ + CFormView::OnInitialUpdate(); + + // 添加运行模式 + m_ComboMode.AddString((CString)"时间"); + m_ComboMode.AddString((CString)"计数"); + m_ComboMode.SetCurSel(0); + // 添加坐标轴模式 + m_ComboAxis.AddString((CString)"线性"); + m_ComboAxis.AddString((CString)"对数"); + m_ComboAxis.SetCurSel(0); + + m_Menu.LoadMenuW(IDR_MAINFRAME); + m_wndToolBar.LoadToolBar(IDR_MAINFRAME); + SetMenu(&m_Menu); +} + +void CControlView::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/) +{ +} + +double CControlView::GetMilliTime() +{ + std::chrono::milliseconds ms = std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch() + ); + return ms.count() / 1000.; +} + +void CControlView::OnStaStart() +{ + // 重置结束条件 + m_nT0 = GetMilliTime(); + // 设置状态 + startFlag = FALSE; + stopFlag = TRUE; + clearFlag = FALSE; + ((CEdit*)GetDlgItem(IDC_COND))->EnableWindow(FALSE); + // 获取屏幕值至变量 + UpdateData(TRUE); + // 设置更新 + SetTimer(1, 100, NULL); +} + +void CControlView::OnUpdateStaStart(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(startFlag); +} + +void CControlView::OnStaStop() +{ + // 设置状态 + startFlag = TRUE; + stopFlag = FALSE; + clearFlag = TRUE; + ((CEdit*)GetDlgItem(IDC_COND))->EnableWindow(TRUE); + // 停止更新 + KillTimer(1); +} + +void CControlView::OnUpdateStaStop(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(stopFlag); +} + +void CControlView::OnStaClear() +{ + CMCADoc* pDoc = (CMCADoc*)GetDocument(); + // 重置 + m_nTime = 0; + m_nMaxCount = 0; + m_nPartCount = 0; + m_nTotalCount = 0; + m_nTimeStr = (CString)"0.0"; + // 获取屏幕值至变量 + UpdateData(FALSE); + // 设置曲线 + for (int i = 0; i < pDoc->m_nChannelNum; i++) + pDoc->m_nChannelCount[i] = 0; + pDoc->UpdateAllViews(NULL); +} + +void CControlView::OnUpdateStaClear(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(clearFlag); +} + +void CControlView::OnTimer(UINT_PTR nIDEvent) +{ + CString tmp; + CMCADoc* pDoc = (CMCADoc*)GetDocument(); + m_nTotalCount = pDoc->GetTotal(0, 1023); + m_nMaxCount = pDoc->GetMax(0, 1023); + m_nPartCount = pDoc->GetTotal(m_nCursor1, m_nCursor2); + + m_nTime += GetMilliTime() - m_nT0; + m_nTimeStr.Format(_T("%.1f"), m_nTime); + m_nT0 = GetMilliTime(); + + m_ComboMode.GetWindowText(tmp); + if (tmp == "时间" && m_nTime >= m_nCond) OnStaStop(); + if (tmp == "计数" && m_nTotalCount >= m_nCond) OnStaStop(); + + UpdateData(FALSE); + + int n = rand() % 50 + 25; + ((CMCADoc*)GetDocument())->RandomPeak(source, n); + ((CMCADoc*)GetDocument())->UpdateAllViews(NULL); + CFormView::OnTimer(nIDEvent); +} + +void CControlView::OnSimuCo() +{ + source = (CString)"Co60"; +} + +void CControlView::OnSimuCs() +{ + source = (CString)"Cs137"; +} + +void CControlView::OnSimuNa() +{ + source = (CString)"Na22"; +} diff --git a/MCA/ControlView.h b/MCA/ControlView.h index 2c182d4..ee27ef0 100644 --- a/MCA/ControlView.h +++ b/MCA/ControlView.h @@ -1,6 +1,6 @@ #pragma once - +#include // CControlView 窗体视图 @@ -29,6 +29,45 @@ protected: DECLARE_MESSAGE_MAP() public: afx_msg void OnSize(UINT nType, int cx, int cy); + virtual void OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/); + double GetMilliTime(); + + // 选择信息 + CString source = (CString)"Cs137"; + + // 光标信息 + int m_nCursor1; + int m_nCursor2; + int m_nCursorROI; + int m_nCursorROICount; + + // 侧边信息 + double m_nCond; + double m_nT0; + double m_nTime; + CString m_nTimeStr; + int m_nTotalCount; + int m_nPartCount; + int m_nMaxCount; + int m_nRange; + CComboBox m_ComboMode; + CComboBox m_ComboAxis; + virtual void OnInitialUpdate(); + + // 菜单与工具栏响应 + CMenu m_Menu; + CToolBar m_wndToolBar; + BOOL startFlag = TRUE; + BOOL stopFlag = FALSE; + BOOL clearFlag = FALSE; + afx_msg void OnStaStart(); + afx_msg void OnUpdateStaStart(CCmdUI* pCmdUI); + afx_msg void OnStaStop(); + afx_msg void OnUpdateStaStop(CCmdUI* pCmdUI); + afx_msg void OnStaClear(); + afx_msg void OnUpdateStaClear(CCmdUI* pCmdUI); + afx_msg void OnTimer(UINT_PTR nIDEvent); + afx_msg void OnSimuCo(); + afx_msg void OnSimuCs(); + afx_msg void OnSimuNa(); }; - - diff --git a/MCA/DetailView.cpp b/MCA/DetailView.cpp index 42c8546..9fdec91 100644 --- a/MCA/DetailView.cpp +++ b/MCA/DetailView.cpp @@ -6,6 +6,7 @@ #include "MCA.h" #include "MCADoc.h" #include "DetailView.h" +#include "ControlView.h" // CDetailView @@ -14,7 +15,6 @@ IMPLEMENT_DYNCREATE(CDetailView, CView) CDetailView::CDetailView() { - } CDetailView::~CDetailView() @@ -22,16 +22,52 @@ CDetailView::~CDetailView() } BEGIN_MESSAGE_MAP(CDetailView, CView) -// ON_WM_PAINT() + ON_WM_PAINT() + ON_WM_ERASEBKGND() + ON_WM_LBUTTONDOWN() + ON_WM_RBUTTONDOWN() END_MESSAGE_MAP() // CDetailView ͼ -void CDetailView::OnDraw(CDC* pDC) +void CDetailView::OnDraw(CDC* pDc) { - CDocument* pDoc = GetDocument(); - // TODO: ڴӻƴ + // ȡ + int L, R; + if (pDoc == NULL) pDoc = (CMCADoc*)GetDocument(); + if (pView == NULL) pView = (CControlView*)pDoc->GetView(RUNTIME_CLASS(CControlView)); + L = pView->m_nCursor1; + R = pView->m_nCursor2; + // + CRect rect; + GetClientRect(&rect); + ZF = rect.Width() / (R - L + 1.); + + // ɫɫ + CDC MemDC; + CBitmap Bitmap, * OldBitmap; + CPen pen(PS_SOLID, 2, RGB(255, 255, 255)); + CPen* oldpen = MemDC.SelectObject(&pen); + + GetClientRect(&rect); + MemDC.CreateCompatibleDC(pDc); + Bitmap.CreateCompatibleBitmap(pDc, rect.Width(), rect.Height()); + OldBitmap = MemDC.SelectObject(&Bitmap); + MemDC.FillSolidRect(0, 0, rect.Width(), rect.Height(), RGB(119, 7, 243)); + + // ͼ + MemDC.MoveTo(1, rect.Height() - pDoc->m_nChannelCount[L]); + for (int i = L; i <= R; i++) + MemDC.LineTo((i - L) * ZF, rect.Height() - pDoc->m_nChannelCount[i]); + + //ͷԴ + pDc->BitBlt(0, 0, rect.Width(), rect.Width(), &MemDC, 0, 0, SRCCOPY); + MemDC.SelectObject(oldpen); + MemDC.SelectObject(OldBitmap); + pen.DeleteObject(); + Bitmap.DeleteObject(); + MemDC.DeleteDC(); } @@ -53,3 +89,51 @@ void CDetailView::Dump(CDumpContext& dc) const // CDetailView Ϣ + + +void CDetailView::OnPaint() +{ + if (pDoc == NULL) pDoc = (CMCADoc*)GetDocument(); + CPaintDC dc(this); // device context for painting + OnPrepareDC(&dc); + OnDraw(&dc); +} + +BOOL CDetailView::OnEraseBkgnd(CDC* pDC) +{ + return TRUE; +} + +void CDetailView::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 / ZF + pView->m_nCursor1; + pView->m_nCursorROI = nX; + pView->m_nCursorROICount = pDoc->m_nChannelCount[nX]; + + CPen pen; + CDC* pDC = GetDC(); + pen.CreatePen(PS_SOLID, 5, RGB(255, 180, 20)); + CPen* oldpen = pDC->SelectObject(&pen); + CRect rect; + GetClientRect(&rect); + pDC->SetROP2(R2_XORPEN); // + pDC->MoveTo(point.x, 0); //ƹ + pDC->LineTo(point.x, rect.Height()); + pDC->SelectObject(oldpen); + pen.DeleteObject(); + + CView::OnLButtonDown(nFlags, point); +} + + +void CDetailView::OnRButtonDown(UINT nFlags, CPoint point) +{ + if (pDoc == NULL) pDoc = (CMCADoc*)GetDocument(); + if (pView == NULL) pView = (CControlView*)pDoc->GetView(RUNTIME_CLASS(CControlView)); + pView->m_nCursor1 = 0; + pView->m_nCursor2 = 1023; + + CView::OnRButtonDown(nFlags, point); +} diff --git a/MCA/DetailView.h b/MCA/DetailView.h index d2e0aeb..8e55f02 100644 --- a/MCA/DetailView.h +++ b/MCA/DetailView.h @@ -1,6 +1,9 @@ #pragma once #include +#include "MCADoc.h" +#include "ControlView.h" + class CDetailView : public CView { @@ -26,5 +29,11 @@ protected: protected: DECLARE_MESSAGE_MAP() public: -// afx_msg void OnPaint(); + double ZF = 1.0; + CMCADoc* pDoc = nullptr; + CControlView* pView = nullptr; + afx_msg void OnPaint(); + afx_msg BOOL OnEraseBkgnd(CDC* pDC); + afx_msg void OnLButtonDown(UINT nFlags, CPoint point); + afx_msg void OnRButtonDown(UINT nFlags, CPoint point); }; diff --git a/MCA/MCA.rc b/MCA/MCA.rc index d76ac034c5dbe1834f5732770c98b69d6a0fb79a..5832fb61ad073d9a07a9e811ed4e5257067c0242 100644 GIT binary patch delta 5545 zcmcgwT}+#06h0k=77G2LrKR0g3obH*(LWe4nS=ff7WzY5#;Q1+gAF4x9Qe0rHjIlg z@n_^DyV%9T?$nrUhQ%vyOw3H?#p0bYUU+4^95FFw#>8{puiwX4*2aAUOhftlzUMvX zIp=-OdC&LW{z-S|@~&HYqh$nQFalE$g;7XD4t2REyks%smxe>Nr(q7x!6MAyy1}kU z#z<}gQn+Gk!7mI0hG~*{6XsdQE^AAW%qVG&Ll$kdds)tOhUDg88fM@;%Qnceqa>BU zV8D&5hJ;~`=Fh-ViN!1-JPN}_86#_}Jr6I#S(ue169A1@fq?@35#x*({AIlDt820eiV2hfb>l&GlYfNHpR#YdwC_FkmN_ z=);>cC1ewl)+Y6MF_cAn>KS%}?3HLKZuQ!7!}GeTIGn&!b-VGp*KGP==FilAcnT8G zj;E|GxN39u9)uqHgz2vnk~EVi80-+6Ows;Hqd6Ll)9)dO2#_(fS&racOa6eiRW~f{ zn6PSJ)n+JS!y((p9U5%nyI#NP`;|La+3(~w`Td|Vazwr9ydimw@#9F`w;QXXGA6t8 zuv#Y(NxMdU_5Acz%s9KzXVBv#5JR2YuVPpmE;M=YZd0s(Lw8uS#vl$m zBPtDAGwg+jpWkqtj3$xA;72&!qdG>X4j`YDnyy@>pN3hi-$pj%l zQZ#1FO(nDUR!kT0QqZGJvI<^c49hBdgbJ7CsOZ?J_o8+vO%0aKZ^swA_IHG!pG^0P zeCsCV4NylArBAsv-*xTl=oPv3=xcrrdT}mL*UnB#t9nR-+7f3&QXrGiy=HB?7^N&p z(l|HwofI-DL;(>fKA6IUwv+NGB2Iyr@GnEs;-x{H3S0xF8aW|kj?;Hk$c@sxdWH{U z)+3s537NSVgt&Nb$zw~%P3?((oMAEC6peRM56VST`j$c&6rqd@gL3&EE-|cje3N$J zG#Boqa9Yw!EFc??s$FtRvY#a_Ln0(8a=1`*IYsC>Fj7!B;8~KPHz;UmRPBCwXzcnp zInT|b1W!s>1Hdo%BT5j&x}6L{ z-9{M_LD^^k9T9V;Mkh!KrA<^muvlQNK9oZ^L|C|O%tv^*XQ)}UYGBKvfUsF3(jFKTFxya7 z7QR?EK0U`^Nsj>UgfI;7Kbn*Bi`0)xo#c4v6E^vR_GRLN+|zAjYUN5GJiqk`wudS BNi6^X diff --git a/MCA/MCA.vcxproj b/MCA/MCA.vcxproj index 423c4aa..44191c7 100644 --- a/MCA/MCA.vcxproj +++ b/MCA/MCA.vcxproj @@ -221,9 +221,20 @@ + + + + + + + + + + + diff --git a/MCA/MCA.vcxproj.filters b/MCA/MCA.vcxproj.filters index 780b105..ce94177 100644 --- a/MCA/MCA.vcxproj.filters +++ b/MCA/MCA.vcxproj.filters @@ -110,5 +110,38 @@ 资源文件 + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + \ No newline at end of file diff --git a/MCA/MCADoc.cpp b/MCA/MCADoc.cpp index bf41ad0..1b59242 100644 --- a/MCA/MCADoc.cpp +++ b/MCA/MCADoc.cpp @@ -37,7 +37,7 @@ CMCADoc::CMCADoc() noexcept FILE *stream_tmp; int channel_id, channel_count; - srand((unsigned)time(NULL)); + srand((unsigned)time(0)); m_nChannelCount = new int[m_nChannelNum]; for (int i = 0; i < m_nChannelNum; i++) m_nChannelCount[i] = 0; @@ -85,6 +85,7 @@ BOOL CMCADoc::OnNewDocument() // TODO: 在此添加重新初始化代码 // (SDI 文档将重用该文档) + SetTitle(TEXT("MultiChannel Analyzer")); return TRUE; } @@ -168,23 +169,58 @@ void CMCADoc::Dump(CDumpContext& dc) const } #endif //_DEBUG - // CMCADoc 命令 -double CMCADoc::uniform() +double CMCADoc::Uniform() { int x = rand(); - double y = (float)(x % 100) / 100; + double y = (x % 10000) / 10000.0; return y; } -void CMCADoc::random_peaks(std::string name) +void CMCADoc::RandomPeak(CString name, int n) { - int K; - double eps = uniform(); + __int64 K; + double eps; - if (name == "Co60") K = std::lower_bound(es_Co60, es_Co60 + 1024, eps) - es_Co60; - else if (name == "Cs137") K = std::lower_bound(es_Cs137, es_Cs137 + 1024, eps) - es_Cs137; - else K = std::lower_bound(es_Na22, es_Na22 + 1024, eps) - es_Na22; + for (int i = 0; i < n; i++) { + eps = Uniform(); - m_nChannelCount[K] += 1; -} \ No newline at end of file + if (name == "Co60") K = std::lower_bound(es_Co60, es_Co60 + 1024, eps) - es_Co60; + else if (name == "Cs137") K = std::lower_bound(es_Cs137, es_Cs137 + 1024, eps) - es_Cs137; + else K = std::lower_bound(es_Na22, es_Na22 + 1024, eps) - es_Na22; + + m_nChannelCount[K] += 1; + } +} + +int CMCADoc::GetTotal(int L, int R) +{ + int cSum = 0; + for (int i = L; i <= min(m_nChannelNum-1, R); i++) cSum += m_nChannelCount[i]; + return cSum; +} + +int CMCADoc::GetMax(int L, int R) +{ + int cMax = 0; + for (int i = L; i <= min(m_nChannelNum - 1, R); i++) + if (m_nChannelCount[i] > cMax) + cMax = m_nChannelCount[i]; + return cMax; +} + + +CView* CMCADoc::GetView(CRuntimeClass* pClass) +{ + CView* pView{}; + POSITION pos = GetFirstViewPosition(); + while (pos != NULL) { + pView = GetNextView(pos); + if (pView->IsKindOf(pClass)) break; + } + if (!pView->IsKindOf(pClass)) { + AfxMessageBox((CString)"Cannot Locate the View!"); + return nullptr; + } + return pView; +} diff --git a/MCA/MCADoc.h b/MCA/MCADoc.h index 7f5f49b..2a6b56a 100644 --- a/MCA/MCADoc.h +++ b/MCA/MCADoc.h @@ -26,10 +26,8 @@ private: // 操作 public: - void random_peaks(std::string name); - -private: - double uniform(); + void RandomPeak(CString name, int n); + double Uniform(); // 重写 public: @@ -59,4 +57,8 @@ protected: // 用于为搜索处理程序设置搜索内容的 Helper 函数 void SetSearchContent(const CString& value); #endif // SHARED_HANDLERS +public: + int GetTotal(int L, int R); + int GetMax(int L, int R); + CView* GetView(CRuntimeClass* pClass); }; diff --git a/MCA/MainFrm.cpp b/MCA/MainFrm.cpp index b06cbc2..0f83fbb 100644 --- a/MCA/MainFrm.cpp +++ b/MCA/MainFrm.cpp @@ -67,7 +67,10 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); + MoveWindow(0, 0, 2386, 1200); + CenterWindow(); + OnLoadToolBarIcon(); return 0; } @@ -79,16 +82,17 @@ BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, WS_CHILD | WS_VISIBLE, AFX_IDW_PANE_FIRST)); // 左侧窗口创建视图,第0行第0列 VERIFY(m_wndSplitter.CreateView(0, 0, - RUNTIME_CLASS(CControlView), CSize(360, 0), pContext)); + RUNTIME_CLASS(CControlView), CSize(300, 0), pContext)); // 右侧窗口上下拆分,2行1列 - VERIFY(m_wndSplitter_2.CreateStatic(&m_wndSplitter, 2, 1, + VERIFY(m_wndSplitter2.CreateStatic(&m_wndSplitter, 2, 1, WS_CHILD | WS_VISIBLE, m_wndSplitter.IdFromRowCol(0, 1))); // 右上窗口创建视图,第0行第0列 - VERIFY(m_wndSplitter_2.CreateView(0, 0, - RUNTIME_CLASS(CTotalView), CSize(0, 300), pContext)); + VERIFY(m_wndSplitter2.CreateView(0, 0, + RUNTIME_CLASS(CTotalView), CSize(2086, 400), pContext)); // 右下窗口创建视图,第1行第0列 - VERIFY(m_wndSplitter_2.CreateView(1, 0, - RUNTIME_CLASS(CDetailView), CSize(0, 0), pContext)); + VERIFY(m_wndSplitter2.CreateView(1, 0, + RUNTIME_CLASS(CDetailView), CSize(2086, 0), pContext)); + return TRUE; } @@ -96,9 +100,8 @@ BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; - // TODO: 在此处通过修改 - // CREATESTRUCT cs 来修改窗口类或样式 - + cs.style &= ~WS_THICKFRAME; + cs.style &= ~WS_MAXIMIZEBOX; return TRUE; } @@ -119,3 +122,33 @@ void CMainFrame::Dump(CDumpContext& dc) const // CMainFrame 消息处理程序 + + +void CMainFrame::OnLoadToolBarIcon() +{ + HICON icon; + m_imgList.Create(50, 50, TRUE | ILC_COLOR32, 10, 0); + + icon = AfxGetApp()->LoadIconW(IDI_START); + m_imgList.Add(icon); + icon = AfxGetApp()->LoadIconW(IDI_STOP); + m_imgList.Add(icon); + icon = AfxGetApp()->LoadIconW(IDI_CLEAR); + m_imgList.Add(icon); + icon = AfxGetApp()->LoadIconW(IDI_FOLDER); + m_imgList.Add(icon); + icon = AfxGetApp()->LoadIconW(IDI_SAVE); + m_imgList.Add(icon); + icon = AfxGetApp()->LoadIconW(IDI_LEFT); + m_imgList.Add(icon); + icon = AfxGetApp()->LoadIconW(IDI_RIGHT); + m_imgList.Add(icon); + icon = AfxGetApp()->LoadIconW(IDI_UP); + m_imgList.Add(icon); + icon = AfxGetApp()->LoadIconW(IDI_DOWN); + m_imgList.Add(icon); + icon = AfxGetApp()->LoadIconW(IDI_CLOSE); + m_imgList.Add(icon); + + m_wndToolBar.GetToolBarCtrl().SetImageList(&m_imgList); +} diff --git a/MCA/MainFrm.h b/MCA/MainFrm.h index af188b2..0129579 100644 --- a/MCA/MainFrm.h +++ b/MCA/MainFrm.h @@ -14,7 +14,7 @@ protected: // 仅从序列化创建 // 特性 protected: CSplitterWnd m_wndSplitter; - CSplitterWnd m_wndSplitter_2; + CSplitterWnd m_wndSplitter2; public: // 操作 @@ -42,6 +42,9 @@ protected: afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); DECLARE_MESSAGE_MAP() +public: + void OnLoadToolBarIcon(); + CImageList m_imgList; }; diff --git a/MCA/Resource.h b/MCA/Resource.h index 3190013..4d38bae 100644 --- a/MCA/Resource.h +++ b/MCA/Resource.h @@ -6,11 +6,34 @@ #define IDP_OLE_INIT_FAILED 100 #define IDR_MAINFRAME 128 #define IDR_MCATYPE 130 -#define IDD_DIALOG1 310 #define IDD_DIALOG_CONTROL 310 -#define IDC_TREE1 1010 +#define IDI_CLOSE 313 +#define IDI_DOWN 314 +#define IDI_FOLDER 315 +#define IDI_LEFT 316 +#define IDI_RIGHT 318 +#define IDI_SAVE 319 +#define IDI_START 320 +#define IDI_STOP 321 +#define IDI_UP 322 +#define IDI_CLEAR 323 #define IDC_MFCSHELLTREE1 1013 -#define IDC_MFCMASKEDEDIT1 1015 +#define IDC_MODE 1017 +#define IDC_COND 1018 +#define IDC_TIME 1019 +#define IDC_TCOUNT 1020 +#define IDC_BCHA 1021 +#define IDC_ECHA 1022 +#define IDC_CURSOR1 1023 +#define IDC_CURSORROI_COUNT 1024 +#define IDC_RANGE 1025 +#define IDC_MCOUNT 1026 +#define IDC_AXIS 1027 +#define IDC_CURSOR1_COUNT 1028 +#define IDC_CURSOR2 1029 +#define IDC_CURSOR2_COUNT 1030 +#define IDC_CURSORROI 1031 +#define IDC_PCOUNT 1032 #define ID_32786 32786 #define ID_32787 32787 #define ID_32788 32788 @@ -29,25 +52,45 @@ #define ID_32801 32801 #define ID_BUTTON32803 32803 #define ID_BUTTON32804 32804 -#define ID_BUTTON32805 32805 -#define ID_BUTTON32806 32806 -#define ID_BUTTON32807 32807 +#define ID_ARROW_RIGHT 32805 +#define ID_ARROW_UP 32806 +#define ID_ARROW_DOWN 32807 #define ID_BUTTON32808 32808 -#define ID_BUTTON32809 32809 -#define ID_BUTTON32810 32810 -#define ID_BUTTON32811 32811 +#define ID_STA_START 32809 +#define ID_STA_STOP 32811 #define ID_32812 32812 #define ID_32813 32813 #define ID_32814 32814 #define ID_32815 32815 +#define ID_ARROW_LEFT 32817 +#define ID_32818 32818 +#define ID_32819 32819 +#define ID_32820 32820 +#define ID_AXIS_LINEAR 32821 +#define ID_AXIS_LOG 32822 +#define ID_RANGE_AUTO 32823 +#define ID_RANGE_D4 32826 +#define ID_RANGE_D2 32827 +#define ID_RANGE_M2 32828 +#define ID_RANGE_M4 32829 +#define ID_32830 32830 +#define ID_SIMU_CO 32831 +#define ID_SIMU_CS 32832 +#define ID_SIMU_NA 32833 +#define ID_DATA_ORIGIN 32834 +#define ID_DATA_3 32835 +#define ID_DATA_5 32836 +#define ID_STA_CLEAR 32837 +#define ID_32838 32838 +#define ID_32839 32839 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 313 -#define _APS_NEXT_COMMAND_VALUE 32816 -#define _APS_NEXT_CONTROL_VALUE 1016 +#define _APS_NEXT_RESOURCE_VALUE 324 +#define _APS_NEXT_COMMAND_VALUE 32840 +#define _APS_NEXT_CONTROL_VALUE 1019 #define _APS_NEXT_SYMED_VALUE 310 #endif #endif diff --git a/MCA/TotalView.cpp b/MCA/TotalView.cpp index 4a75fe0..d834c3b 100644 --- a/MCA/TotalView.cpp +++ b/MCA/TotalView.cpp @@ -1,11 +1,12 @@ -// TotalView.cpp : ʵļ +// TotalView.cpp : 实现文件 // #include "pch.h" #include "MCA.h" +#include "MCADoc.h" #include "TotalView.h" - +#include "ControlView.h" // CTotalView @@ -21,19 +22,46 @@ CTotalView::~CTotalView() } BEGIN_MESSAGE_MAP(CTotalView, CView) + ON_WM_PAINT() + ON_WM_ERASEBKGND() + ON_WM_LBUTTONDOWN() + ON_WM_RBUTTONDOWN() END_MESSAGE_MAP() -// CTotalView ͼ +// CTotalView 绘图 -void CTotalView::OnDraw(CDC* pDC) +void CTotalView::OnDraw(CDC* pDc) { - CDocument* pDoc = GetDocument(); - // TODO: ڴӻƴ + // 背景颜色、笔颜色等设置 + CDC MemDC; + CRect rect; + CBitmap Bitmap, * OldBitmap; + CPen pen(PS_SOLID, 2, RGB(0, 0, 0)); + CPen* oldpen = MemDC.SelectObject(&pen); + + GetClientRect(&rect); + MemDC.CreateCompatibleDC(pDc); + Bitmap.CreateCompatibleBitmap(pDc, rect.Width(), rect.Height()); + OldBitmap = MemDC.SelectObject(&Bitmap); + MemDC.FillSolidRect(0, 0, rect.Width(), rect.Height(), RGB(36, 217, 163)); + + // 绘图 + MemDC.MoveTo(1, rect.Height() - pDoc->m_nChannelCount[0]); + for (int i = 0; i < pDoc->m_nChannelNum; i++) + MemDC.LineTo(2 * i + 1, rect.Height() - pDoc->m_nChannelCount[i]); + + //释放资源    + pDc->BitBlt(0, 0, rect.Width(), rect.Height(), &MemDC, 0, 0, SRCCOPY); + MemDC.SelectObject(oldpen); + MemDC.SelectObject(OldBitmap); + pen.DeleteObject(); + Bitmap.DeleteObject(); + MemDC.DeleteDC(); } -// CTotalView +// CTotalView 诊断 #ifdef _DEBUG void CTotalView::AssertValid() const @@ -50,4 +78,37 @@ void CTotalView::Dump(CDumpContext& dc) const #endif //_DEBUG -// CTotalView Ϣ +// CTotalView 消息处理程序 + + +void CTotalView::OnPaint() +{ + if (pDoc == NULL) pDoc = (CMCADoc*)GetDocument(); + 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; + 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; + CView::OnRButtonDown(nFlags, point); +} \ No newline at end of file diff --git a/MCA/TotalView.h b/MCA/TotalView.h index 4d316f8..595ecf7 100644 --- a/MCA/TotalView.h +++ b/MCA/TotalView.h @@ -1,6 +1,9 @@ #pragma once #include +#include "MCADoc.h" +#include "ControlView.h" + class CTotalView : public CView { @@ -25,4 +28,11 @@ protected: // ɵϢӳ亯 protected: DECLARE_MESSAGE_MAP() +public: + CMCADoc* pDoc = nullptr; + CControlView* pView = nullptr; + afx_msg void OnPaint(); + afx_msg BOOL OnEraseBkgnd(CDC* pDC); + afx_msg void OnLButtonDown(UINT nFlags, CPoint point); + afx_msg void OnRButtonDown(UINT nFlags, CPoint point); }; diff --git a/MCA/res/Toolbar.bmp b/MCA/res/Toolbar.bmp index 45784c73ce023b95be8ff71aa930f98c83eb99b8..a3def617ad40ae76035548159d8814c64010f468 100644 GIT binary patch literal 12718 zcmeIuu@S>C2mnBQ=K(TC+PF%c-s`y5M43TDrB^`q6uw6SB&1h#=J2`y)yIEsEQy!fB*pk1PBlyK!5-N0t5&U qAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5)$RNxN>eHZos literal 15118 zcmeI2JCfrz5QbrwtE9;CF&sOzGw05I3`Qn1B9pR7eVjQGGb*G1zX6clc#I@^YG~m}z>~m}z-J&Z96y5=Uqgq^9lnO5pFm3- z1Yf>|8e?maxmEG`%H74)j>hBpomF)WfrI-pum-nGwTRUWV-1sUk)2#^6!h{Y2KWa9 z!hkPCDrL%bb!nXwW!P7D@Jdiw2lR-#lo|SIt=0x3I?d~osGH>5faxx4 zGNasNWm?CP_OJrF4vt%09Myf0ku=$&EDX1A*O_Tr`$C|Z5n2%|eY%ln_YxP{Vi($N zRuz4BusUL{p+kMftE@bD#I%}ge7EX6eLuBa&aY^KJWfWGY$wGXR#s-)zRfDhQwr~3 zb;8uSu@S=kO&Lt=Hd#|aDsD3Z?6w3zK>HB*?juYX6s zf_-FF{2mH_lT<>aN5R{C?h6h}AoRgiO%zzEBR`15q#yWE1K`#zDqtyb_pyRKI_>o)f*Kx zw%||BAm7Ldw)f^N}*GZ|H%8*B0S!rJ;>|-U4 zm751va~#sFTVWMKNt0DJz`l-B4jroK4)HE!G^Dx@PH`X9 zC#BRWdTDx$xv-k3mBn}mt4tCe_p)mEiO-cvIyc&*x^%gb=TLm+{Hrr9WXfZHumgY5 zmU&O~D~m}qGOUVMCgfh3+nuZ$ZpAlFMa-abkG*flRy%`LfrJp5@_j4DKFMt8qs#h= zMut_2OJI)|X%CDS!b&Yh*{Vl%UfdVkc*auI`R$r*rtgeOM zK}yA~cCNveTQR~KUDt<)ejgnD5i8K!lZ1$JXB+}bLr5f8>@!%{H?60YtO~a(h({~v zSGeVFq-A1Am5dYfELv(C#ntygR%+>~aXXj6E7fvHHR?zsHje}N3|2)5ij-gRm3Wr& zH#@O<7pt~g_3!le3}jN-Pi0a|RCI(xve%ckr>ZTdZ=_Vp>*|YR7pqONZS-$-SN*%0 zK^8|;;hrC!HLJp{@cyi7%^p^7xK(wG@3*i!eWY7`E$;Bduchz@YTMW(K2W32J9J}{ e_`C{#pk`CKZ+xIO&!L|Lo&=r*o&>%p0{;Q*eVg|H diff --git a/MCA/res/clear.ico b/MCA/res/clear.ico new file mode 100644 index 0000000000000000000000000000000000000000..5160b82a5e761353ab235b17b73b0a62029d5eef GIT binary patch literal 10462 zcmeHMO>7%Q6dtF7h(9?TXwwP_IPp_ah<7$|A)?}l;D!)X;>dxY6GtFYBO+)|AXFtg z>+mCSDisoNDqN5SQYp|2O;RUbr!}oq330$es#Kvg=DoM`oZ0a@vDdq859`GFX5PGc z?|W}%c4sC+6yT>+67csyapn;rb_*c@1c=0I@I^U(#vUff|Ku6SGjIbkaA9$3PhCmB zq2!f7$##-&*w?A79-r8E11NX7SW}Zv0Pla2aPQIQ-*q)9yBuXGxct$r0jZ&8M0v+g@ZyI)rIK)J7KF2Cb^fHHGK z+$tNfSTRKO&il?@=y#fI`tq%;c-wXZ<$Q%c8=id6=H0~?#~?ZmG*(?Q<-S94D0#y6 zmsK6ce^vWzX^hOHZjOD85!7!U9i1|KG2uxBh50r_g>L)e8YBk z$}#I9_M;2-Pf#369ya@?S%&?{F^a>JvuM}iRg0_-V?7U|3qJIF-93i=viN|H?@7bsUs{*XlsDg3;2*|etpU@gHD}tvAi6qFjf#BEw3$X(@6mZ263!KP z|8Ku9G3{dP@20`sv;k}Uq#lof_8PcfiHwagE)ltY|68)u&mwSks$(4Wiu)wTXZeI& z(!LdQisKf^{Xn`EcfYo=#=g?PmHGX5gI(M&Ts!MKx0yCAeta&8#K8Lf>Kgl>>*$;N z4~vb8`xNEJchAPzN^@Vr_UoSfEgX}{gDe{sVQst_+LWK#wi@1n-O#qA+j%^eP`-mM zpI>5i1J7L~n{eK-?If+^U7O~)Z1Tf4%-+O!Pl?aAFkgTzMsr-zVH2G8uNoJEW?$GXln&m$b0PHycn zH|GY$vyHAfE~c)IrM+t$rL&QhUSpPwLn1H!KhCf2*J! zU%z$W|KqI^13q*5<(=#08OSq`XCTi&o`HTd(56pS^u$de9%w`Rh7d)>YlY@0p{QyU zA&%cp*qScx!uHloagMM&8rH`~LKIcPKMT!=u>JB}>uth9a{}>_sNRd%92+SRmPZMz zGsRh~cd$GP75E(+Av`Ur<5)jhXqJxvemvKjAuKef5kG`>#97cs6wv<=BG`=}%Rvw1 Z5I!Wpz$1{UFQCq7wfD>;HGsbz@PC&D5sLr- literal 0 HcmV?d00001 diff --git a/MCA/res/close.ico b/MCA/res/close.ico new file mode 100644 index 0000000000000000000000000000000000000000..df3d896fbb0967343fbe19947aed5f175bab89bd GIT binary patch literal 10462 zcmeI1F>b>!3`G@m$mmXO(Z$``IT!F{vbA^ckc0Fp$<_lDXuJ6c89f+gKiv?}Pz07O ziLxOE%y(>2Rf{oeWv)dWillgct<_<>?!>9J}4bHROJ`a+=atCq;atGGffmc91 zBml-Wa4l2p4M7C|f@`vHZmxlA;hJ3S9s!?lj{k-~!ebjh3Z;f098ax5lf@T<^j?F- zH-iRCD2A9Up&4SZ#9|1^5}P3eixz`V7HtL}EU7TeVM&c)3QMXCE-a}tjA2;{!!?$r zF$jyjXW+d9dkT9Qsn132|H;fSXaC@m*Y{X^Eott>=5VcHUD@|R){?!(wD!m@_vJqZ ziC+rKHHM|IjA2Nf#f2eNmMILWvCLseg~bPhHj7UNEtU`ru~|Yg#A1oT5Sk?>Lnsyv z2Hz~23_e-b@?MR5vWEAZa&NQd4&)Bx4kXb58tiDsYF}gI`_Xh2w1AdGJ+v=~x)Sqj ziP{Q!AUfC36H!CZhHwZy*SG|2D-4BpB|@QnfvKRh#TC{AMzWp|$=YBh*7MDuw#dZ4 vJ7l(1&dWH7lX+y`OCHH9bx2)OC$bN93x{xBIE7pKAbpWOp-V8XZ=C)DCBE-& literal 0 HcmV?d00001 diff --git a/MCA/res/down.ico b/MCA/res/down.ico new file mode 100644 index 0000000000000000000000000000000000000000..b3c00fea40bc4f20c5defe12dd641dd1e4e59f27 GIT binary patch literal 10462 zcmeI0F>4f26oucqApt?xLV|^mG-9lTfK>|1} z$~0+`1v{IKL0vKKc+Si|m?C%2ZnArK7UqV#clMt5&i&>QW?)08;csy<;B!74EQBx{ zLO=;DPVsiJIK{;@|rzrlMr}Ag%c#t|6Ku?*X&W_nleWXa37K6-9t_xWAK_iYFxv$ zWsTPWBjCG9Vj7Kp4f#j?gBN(*a_2vxD8ddDWnD?ME=>f3Y$A0=B z_3*fHBWIW z-SYMBD^8_*^IG#1r_wE7@4n(xx;L*iPjM>U^7Za3PNjSETJsdA(k)-_zT#B6H?K8M zaVp*N_3lSbRlT_eoyXs<)IIRG;VP;Vs7}D?1kx;af?YdvX-YlT%SQgaJ(Jf~lGn4Z zd2KfHnzZt|(SDQdpJ_kOYU47iojDl77vCDJShZ2C*q!h@+?uRs^;WG|(~FCg-%DRx O^_(+So;10yuKxkIIUN=N literal 0 HcmV?d00001 diff --git a/MCA/res/folder.ico b/MCA/res/folder.ico new file mode 100644 index 0000000000000000000000000000000000000000..30dab5c8e3d205e97843d4679c68aca9599e64d1 GIT binary patch literal 10462 zcmeI1Ka5OK6vppl#iC#<(b=US8nH+=HZm$vC`3nVby`sfKbRM@s9p@3E?mgOPv>EO(J7ug9u7P8Y^TN^?CTug9u7ZbSkuupAQ| z9;@njQWzU4y+d?(tg7QD`mBir?XZj>_Z9B3st(58&e&+F#{lwJt&S7XpdFs;q9bRu zIxaioqNPrWj-1u%xEBrD;n^=ba#q#x3-v{K%NZLfwH`1YtLk`#I@{y$==KtTIjicp zBef&ZMS$T&YNo}?PI_4Z!)p1m6w;G^>*9^HWtLoSyHC}tsZ32Mgwydgy>lD{3 zt_5T8$VS%BaLcMX$o&A$&s?LU+kF69R;%Nx)OgQ~ZdU+Ec4f6XPD+i>Fwt!WfMi!z zt7EU!_)Hny_5hIV%4&72MV`<0-{7TvB9uZ{&T4fK@EM#r{`QJ)PXVZ`xsIDsJ04vG z_$+I#`tHP>-Sba1aIx>?p-2lwij`xspW_$+I#gZMAt%1=^i(*|LZE%@k=?5vfpBr>e%TXN7%n}AZ=w_ zD#wYsp3*Kx>;iX-Q_^or&W6S|^WUrFM(ApDb#EbZrY6nrrvDELu`Cw0Kxl?ejk10p#R2t zcmr?PZT8|ztwQKCz?$!X1%S(!?;{JXdqBf#J_HW~Qa<>YgxE8Hwbp@c;CH3n$1(&z z0j%=@SOQvAT76_7b_e(bSmQA;4*XSV^np8iIs#bRH&6unfOaK5dc~LRPTu0PMYP=m ztcT~N6(C7npi{3r$hb*#a3B8tegJ$N`=18VP)U6ZLF@s*{dr#H`L!QNOC|LYK`{5N z0&76pDyffi2oJ$WDA$!-N522g#Rqez^KJ>p%5~f;c6BD%PUHU|=hR7sur6_Z`@T+e zy@arC7e67~M~N3^-|uT(FT8%_btKQP@4%+r=6&BPgy%kP=Dt6NbG`6$(JSD@ZPaZ| zKoigeGyzRO6VL?yO9FATBI-U@F(i*$wp_HFG29q5T$?gn*){xFH(a!wtr2A-YK$8G xn!(4f5mgG7LCt;Pg4vgTa$Ic3iDg_lkDOO@h_2Y`j74`D1G69T#V723ZaYU6vl6@Cz>65p@y@P7WRQ1#}by@f944xcCaLZh{Y>gBmTOAdW6B zRxEaKsfvoIjo;VgKq)kBZ6dklobv0J-sIlmKr5gX&hlo4>)7}N+xkMCn2It1E{sJzR# ztWztofP=V>vEMD21?_~)*G`|Pj^%ZQ*B5&F09+4RjX32&&%J=_G1p~!+XVxlS;Q?5 z@wP#)cIpJ@AidpG=#>W2TdD>&KS0MC~zkOnq|oadspKlicy zIouI`JlDYX=b|>91L{>PpcT*xXa%$aT7iGAfLjg6M4%6@TOIe_*Fw(wT*!J_OnLg) z?`dhv*Hd2$ImeWZ=`UwJ{Z2XN6-Fz=p1Mh2^L6UC^EmcrKN$zzOB|Of^Z4_M5Ah{F O#kb@kd0~j~>-Gzet`tK6 literal 0 HcmV?d00001 diff --git a/MCA/res/save.ico b/MCA/res/save.ico new file mode 100644 index 0000000000000000000000000000000000000000..c7b4e8c2de2a50ed2e31c7e09618e0a6e011936a GIT binary patch literal 10462 zcmeHLyKWRg5Zsd`E`-P_WRQXE%pmbI7WWwh$UHs;G7{nw7J|>PWF7$o=ewMxYi|p+ zM>|u^+%0mjV~uNOs=B&o);@cuX=e6ybktb8*L-=0}aXs~o@eP-)uckXvEeVa~T zI)VBVxMiWQtbeoK-mw1F>N&HH8dbv{Zd(0mJ=lwCd=8H@LV9NCotI1gPs|-Wo{MTF zAH*tN`72)eE1v$TPR$v&FI4$bK9@Jusd>()c3tI5`CJ~QQ+&=hx~}{c&pb+}c>2_$ z@>e|bDxKo#Q;W)9@yx4qilEh>M-Gq2Jqo<6mx{1wl_u7QijD;^*%m6ay0CjCi>F`eZ#`<^b)b0!M9PmC`dT(VelNDQ3 zS2P)sjMf*`jaX{YI$B>;S4=h{8Lcm>8?n@)b+o>yu9$2@GFqR~;j?6nd%EZyo2rjT zsB~lB)19%9466DVrgZ#!p1Y@`&%a{yj!o6ayh^8d`qW^=JEB2urBl4B|J>z(*GCr+ z@s4OGq!)1eY_u+ydN6*(>nAYtk12h zmU^dp#i#mo?&JL!x^#}Unmy#au+BD=i(CX5?~!p_9qA2g`2JN;><92&RqWk47^bX literal 0 HcmV?d00001 diff --git a/MCA/res/start.ico b/MCA/res/start.ico new file mode 100644 index 0000000000000000000000000000000000000000..45b80350adcea8f9df71b0292caf8f25010b6b33 GIT binary patch literal 10462 zcmeHNO=uHA6do-Y6vZAyv=&++yW3JP_T<@v7xmbyC-I^lgtkJh$w0h|HxELg*B*Nl zBEeH{ob2}3@83(EeA#SDaoi4Z;5pzs>TsQH zzvi`O=d`NV`iiq7#c_T;j$R))rhQjK4i(e?MVH-MDumb5Hja9}>Y0<`IJXf; zFORs8&vU|n{!*`uUf}#@bh2aPNO9bbgaglb6EHR(5exEH-uIs9Ph-cq9f>aSg?6Mk z?o-Oq{&0Ua{=nTa`K-aUc7xlp=~7=(9QW5O=V6e&2xGEDJdlgCfp?zUjMIq|*H7(I z9N|&6!qK5RjAH@$d`3RVAGj{ueV@&6+qJsXmlVhCx56R5_Q%dZ4)eG^SM%|mclty2 z3ia1YsV^yx+i!(K{IuuM4cArL=Xp1*yY=pa({H^KG*6^bIv1rl?za(Vc6roE^K;3) z)xo29KY%qgwaaZ#KUH{}tAQ9Qe4Z9S+?R5z+4u;7TV_aBM&*LDB^ literal 0 HcmV?d00001 diff --git a/MCA/res/stop.ico b/MCA/res/stop.ico new file mode 100644 index 0000000000000000000000000000000000000000..589a127782f28577b68a48ec80c4b992dd701068 GIT binary patch literal 10462 zcmeH@F>b<85Cu0kph`^_+He7S&XI#s=1ghee@oNQJ$sOmvPSsH)_UIjt@;?h^SQ?T zSih&L&#D?x<5m5P|9n5M!`Bjh>kaer;D^084;-vn}Tm2RXuQaWGi<9~@Z}nRoywbG#El%ps zywz`U@JiF_w>YUk^H#sb!7ELx-{PeH%v=2y2d^}(ev6a(GjH`<9K6!B`YlfC&%D)d zaqvph>bE$lKl4_<#lb60tKZ_J{>)qb76-31t$vG>`ZI6!TO7R7wE8Vh>d(B@Z*lNS z)9SZ4sXy~pzs12TO{?GHr2foX{T2tWG_8I(duMw7=lQ+;>3{a>=iWeXpf}JP=nWVf cxG&eOR_BzsjPJ?IAkF9hlAN1d7P)?(4|n2+H2?qr literal 0 HcmV?d00001 diff --git a/MCA/res/up.ico b/MCA/res/up.ico new file mode 100644 index 0000000000000000000000000000000000000000..0fcffa915b36f6cc5256d937c6e5b1246f803ad6 GIT binary patch literal 10462 zcmeI2v5FI66ovm7aY4{nh*$`_ji{BdU}a&cFQBC$h_7HNR_iO++6g{@7V2sc1+lcT zaRb}gL>D#Un(=&@3~aIa&zi)W3Cvwi?#!J3o^$38%s|+bTKZdGPx@R-@6M-mDy5{B zbSd2yxK5ooms0n5iP44TquGIG2cmc2jSLHeZgi+A{Mn_>6QY<#IYcG;GGq z<#c>TI+Sub9UmGtW9D)?J|i7Uxtxv<4Vy7@IUS#o4y9a9$A^Z^n7N#e&q#+-E~n!| z!)DA}PRD1YLn)Wj@u6WeW-h1WGt!}y%jx)tu+L>u<#2sc9yeF<&n5}X;rfRI-pA{V z7r$LqS#$kuMq^g$tOUM|bKIO&Y@hjCV{JU}`k!?};_Tyh;ldn^(E1^ujYmX1lnH(x zg=2FtL<21}(T=JkGI}rI`*;qfXrRS!!)Qm=n#{fk_}>wxEoRX`>&&zwGtOPp{80EM zT$)0Q8D`NyYmxOp=IrNZ;p9IAVJ$PvqOs^|E5HkZJWqu~f-BarmKkQzs6(Arh;4yf z_YV+=HLPWZ**eu_h50S~5w2!}!Lf$5%+#^&Dir%X>Dj~csCve+wyxDuuqOid!n@$G zP!-2qgJTVA>ss8tN-Lel>%D&qv PyW~des?JU`w}1Z&2%a4l literal 0 HcmV?d00001