add:
* 全谱区 * 放大区 * 结束条件 * 模拟信号 * 开始、结束、暂停
@ -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.
|
@ -1,6 +1,8 @@
|
||||
// ControlView.cpp: 实现文件
|
||||
//
|
||||
|
||||
#include <chrono>
|
||||
|
||||
#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的大小设置为当前客户区大小
|
||||
}
|
||||
}
|
||||
|
||||
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::milliseconds>(
|
||||
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";
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
|
||||
#include <chrono>
|
||||
|
||||
// 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();
|
||||
};
|
||||
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -1,6 +1,9 @@
|
||||
#pragma once
|
||||
#include <afxwin.h>
|
||||
|
||||
#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);
|
||||
};
|
||||
|
BIN
MCA/MCA.rc
@ -221,9 +221,20 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Image Include="..\UML\menu.bmp" />
|
||||
<Image Include="res\clear.ico" />
|
||||
<Image Include="res\close.ico" />
|
||||
<Image Include="res\down.ico" />
|
||||
<Image Include="res\folder.ico" />
|
||||
<Image Include="res\left.ico" />
|
||||
<Image Include="res\MCA.ico" />
|
||||
<Image Include="res\MCADoc.ico" />
|
||||
<Image Include="res\pause.ico" />
|
||||
<Image Include="res\right.ico" />
|
||||
<Image Include="res\save.ico" />
|
||||
<Image Include="res\start.ico" />
|
||||
<Image Include="res\stop.ico" />
|
||||
<Image Include="res\Toolbar.bmp" />
|
||||
<Image Include="res\up.ico" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
|
@ -110,5 +110,38 @@
|
||||
<Image Include="..\UML\menu.bmp">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\close.ico">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\down.ico">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\folder.ico">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\left.ico">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\pause.ico">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\right.ico">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\save.ico">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\start.ico">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\stop.ico">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\up.ico">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\clear.ico">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
10
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);
|
||||
};
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
@ -1,6 +1,9 @@
|
||||
#pragma once
|
||||
#include <afxwin.h>
|
||||
|
||||
#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);
|
||||
};
|
||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 12 KiB |
BIN
MCA/res/clear.ico
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
MCA/res/close.ico
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
MCA/res/down.ico
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
MCA/res/folder.ico
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
MCA/res/left.ico
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
MCA/res/right.ico
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
MCA/res/save.ico
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
MCA/res/start.ico
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
MCA/res/stop.ico
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
MCA/res/up.ico
Normal file
After Width: | Height: | Size: 10 KiB |