📄 set5view.cpp
字号:
// Set5View.cpp : implementation of the CSet5View class
//
#include "stdafx.h"
#include "CDMS.h"
#include "Set5Doc.h"
#include "Set5View.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSet5View
IMPLEMENT_DYNCREATE(CSet5View, CFormView)
BEGIN_MESSAGE_MAP(CSet5View, CFormView)
//{{AFX_MSG_MAP(CSet5View)
ON_WM_PAINT()
ON_WM_DESTROY()
ON_WM_TIMER()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSet5View construction/destruction
CSet5View::CSet5View()
: CFormView(CSet5View::IDD)
{
//{{AFX_DATA_INIT(CSet5View)
//}}AFX_DATA_INIT
// TODO: add construction code here
m_pMainFrame = NULL;
m_bStart = FALSE;
m_nCount = 0; //视图循环计数器
m_nCurMP = 0; //测点循环计数器
m_nChaDataTimer = -1; //特征数组计数器
m_nSampleFrenquence = 1024; //采样频率
m_dRPM = 4000.0; //机组转速,转/分
for(int i=0; i<12; i++)
{
for(int j=0; j<1024; j++)
m_nData[i][j] = 0.0;
m_dCharacterValue[i] = 0.0;
}
}
CSet5View::~CSet5View()
{
}
void CSet5View::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSet5View)
DDX_Control(pDX, IDC_STATIC9, m_cMP9);
DDX_Control(pDX, IDC_STATIC12, m_cMP12);
DDX_Control(pDX, IDC_STATIC8, m_cMP8);
DDX_Control(pDX, IDC_STATIC7, m_cMP7);
DDX_Control(pDX, IDC_STATIC6, m_cMP6);
DDX_Control(pDX, IDC_STATIC11, m_cMP11);
DDX_Control(pDX, IDC_STATIC10, m_cMP10);
DDX_Control(pDX, IDC_STATIC5, m_cMP5);
DDX_Control(pDX, IDC_STATIC4, m_cMP4);
DDX_Control(pDX, IDC_STATIC3, m_cMP3);
DDX_Control(pDX, IDC_STATIC2, m_cMP2);
DDX_Control(pDX, IDC_STATIC1, m_cMP1);
//}}AFX_DATA_MAP
}
BOOL CSet5View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CFormView::PreCreateWindow(cs);
}
void CSet5View::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
// ResizeParentToFit();
InitCobArray();
// ReadZutaiFile();
/*----隐藏滚动条----*/
CSize sizeTotal;
sizeTotal.cx = sizeTotal.cy = 0;
SetScrollSizes(MM_TEXT, sizeTotal);
/*----隐藏滚动条----*/
//<-------------获取主框架指针------------->
m_pMainFrame = (CMainFrame*)AfxGetMainWnd();
//<-------------保存窗口指针------------->
m_pMainFrame->m_hViewSet5 = this->m_hWnd;
}
void CSet5View::InitCobArray()
{
m_staticArray.SetSize(12);
m_staticArray.SetAt(0,&m_cMP1);
m_staticArray.SetAt(1,&m_cMP2);
m_staticArray.SetAt(2,&m_cMP3);
m_staticArray.SetAt(3,&m_cMP4);
m_staticArray.SetAt(4,&m_cMP5);
m_staticArray.SetAt(5,&m_cMP6);
m_staticArray.SetAt(6,&m_cMP7);
m_staticArray.SetAt(7,&m_cMP8);
m_staticArray.SetAt(8,&m_cMP9);
m_staticArray.SetAt(9,&m_cMP10);
m_staticArray.SetAt(10,&m_cMP11);
m_staticArray.SetAt(11,&m_cMP12);
for(int i=0;i<12;i++)
{
((CLabel*)m_staticArray.GetAt(i))->ShowWindow(FALSE);
}
}
/////////////////////////////////////////////////////////////////////////////
// CSet5View printing
BOOL CSet5View::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CSet5View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CSet5View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
void CSet5View::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/)
{
// TODO: add customized printing code here
}
/////////////////////////////////////////////////////////////////////////////
// CSet5View diagnostics
#ifdef _DEBUG
void CSet5View::AssertValid() const
{
CFormView::AssertValid();
}
void CSet5View::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
CSet5Doc* CSet5View::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSet5Doc)));
return (CSet5Doc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CSet5View message handlers
void CSet5View::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
DrawTimeDomainWave(); //画时域波形
// DrawHistoGram(); //画柱状图
DrawNarrowbandAlarm(); //画窄带报警
DrawTrendCurve(); //画趋势曲线
DrawLeftAxesTrack(); //画左轴心轨迹
DrawRightAxesTrack(); //画右轴心轨迹
// Do not call CFormView::OnPaint() for painting messages
}
void CSet5View::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(nIDEvent == 5)
{
//设置静态控件数字
SetStaticValue();
//画时域波形
DrawTimeDomainWave();
//画柱状图
// DrawHistoGram();
//画窄带报警
DrawNarrowbandAlarm();
//画趋势曲线
DrawTrendCurve();
//画左轴心轨迹
DrawLeftAxesTrack();
//画右轴心轨迹
DrawRightAxesTrack();
//测点循环
if(m_pMainFrame->m_bCycMp == TRUE)
m_nCurMP++;
if(m_nCurMP == 12)
m_nCurMP = 0;
//视图循环
if(m_pMainFrame->m_bIsSet5Active == TRUE)
{
if(m_pMainFrame->m_bCycSet == TRUE)
{
m_nCount++;
if(m_nCount == 12)
{
//显示完毕,发消息告诉主框架
::SendMessage(m_pMainFrame->m_hWnd, UM_SET5COMPLETE, NULL, NULL);
//重新开始视图循环计数
m_nCount = 0;
}
}
}
}
CFormView::OnTimer(nIDEvent);
}
void CSet5View::SetStaticValue()
{
CString ss;
for(int i=0;i<12;i++)
{
ss.Format("%.3f",m_dCharacterValue[i]);
SetBackColor(i);
((CLabel*)m_staticArray.GetAt(i))->SetText(ss);
}
CString ss2;
((CLabel*)m_staticArray.GetAt(m_nCurMP))->GetWindowText(ss2);
((CLabel*)m_staticArray.GetAt(m_nCurMP))->SetBkColor(RGB(0,255,0));
((CLabel*)m_staticArray.GetAt(m_nCurMP))->SetText(ss2);
}
//画时域波形
void CSet5View::DrawTimeDomainWave()
{
CWnd* pWnd = (CWnd*)GetDlgItem(IDC_SET5TIME);
CDC *pDC = pWnd->GetDC();
CRect rect;
pWnd->GetClientRect(rect);
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);
int i;
CBitmap *oldBitmap;
oldBitmap=dcMemory.SelectObject(&(((CCDMSApp*) AfxGetApp())->m_BlackBitmap));
CPen *oldPen;
oldPen=dcMemory.SelectObject(&(((CCDMSApp*) AfxGetApp())->m_GrayPen));
dcMemory.FillRect(&rect,&(((CCDMSApp*) AfxGetApp())->m_BlackBrush));
//画网格
double x,y;
x=rect.Width()/8.0;
y=rect.Height()/4.0;
for(i=1; i<11; i++)
{
dcMemory.MoveTo((int)(x*i),0);
dcMemory.LineTo((int)(x*i),rect.Height());
}
for(i=0; i<2; i++)
{
dcMemory.MoveTo(0,rect.Height()/2-(int)(y*i));
dcMemory.LineTo(rect.Width(),rect.Height()/2-(int)(y*i));
dcMemory.MoveTo(0,rect.Height()/2+(int)(y*i));
dcMemory.LineTo(rect.Width(),rect.Height()/2+(int)(y*i));
}
/*
//画坐标
dcMemory.SelectObject(&(((CCDMSApp*) AfxGetApp())->m_BluePen));
x=rect.Width()/8.0;
y=rect.Height()/8.0;
for(i=1; i<8; i++)
{
dcMemory.MoveTo(0,(int)(y*i));
dcMemory.LineTo(5,(int)(y*i));
}
for(i=1; i<8; i++)
{
dcMemory.MoveTo((int)(x*i),rect.Height());
dcMemory.LineTo((int)(x*i),rect.Height()-5);
}
*/
// 高度比例=rect.Height()/(2^A/D位数),即=rect.Height()×增益×灵敏度/(A/D量程)
//实际值0对应于rect.Height()/2
//每rect.Height()/4对应于(2^A/D位数)/4,即A/D量程/(4×增益×灵敏度)
if(m_bStart == TRUE)
{
//画波形
dcMemory.SelectObject(&(((CCDMSApp*) AfxGetApp())->m_GreenPen));
dcMemory.MoveTo(0,(int)m_nData[m_nCurMP][0]);
for(i=0; i<512; i++)
{
dcMemory.LineTo(4*i,(int)m_nData[m_nCurMP][i]);
}
}
pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcMemory,0,0,SRCCOPY);
dcMemory.SelectObject(oldPen);
dcMemory.SelectObject(oldBitmap);
pWnd->ReleaseDC(pDC);
::DeleteObject(&oldPen);
::DeleteObject(&oldBitmap);
}
/*
//画柱状图
void CSet5View::DrawHistoGram()
{
CWnd* pWnd = (CWnd*)GetDlgItem(IDC_SET5HISTOGRAM);
CDC *pDC = pWnd->GetDC();
CRect rect;
pWnd->GetClientRect(rect);
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);
CBitmap *oldBitmap;
oldBitmap=dcMemory.SelectObject(&(((CCDMSApp*) AfxGetApp())->m_BlackBitmap));
dcMemory.FillRect(&rect,&(((CCDMSApp*) AfxGetApp())->m_BlackBrush));
CPen *oldPen;
oldPen=dcMemory.SelectObject(&(((CCDMSApp*) AfxGetApp())->m_GrayPen));
dcMemory.MoveTo(rect.Width()/2,0);
dcMemory.LineTo(rect.Width()/2,rect.Height());
dcMemory.MoveTo(0,rect.top + rect.Height()/5);
dcMemory.LineTo(rect.Width(),rect.top + rect.Height()/5);
dcMemory.MoveTo(0,rect.top + 3*rect.Height()/5);
dcMemory.LineTo(rect.Width(),rect.top + 3*rect.Height()/5);
if(m_bStart == TRUE)
{
double dAlarm = 62; //警告值
double dAlert = 64; //报警值
double scaleHeight = 2*rect.Height()/5.0/(dAlert-dAlarm);
CRect rcRed, rcYellow, rcGreen, rcBlue;
rcRed.left = rcYellow.left = rcGreen.left = rect.left;
rcRed.right = rcYellow.right = rcGreen.right = rcBlue.left = rect.left + rect.Width()/2;
rcRed.top = rect.top;
rcRed.bottom = rcYellow.top = rect.top + rect.Height()/5;
rcYellow.bottom = rcGreen.top = rect.top + 3*rect.Height()/5;
rcGreen.bottom = rcBlue.bottom = rect.bottom;
rcBlue.right = rect.right;
rcBlue.top = rcGreen.top - (int)((m_dCharacterValue[m_nCurMP]-dAlarm) * scaleHeight);
//标纵坐标值
CString zuobiao;
zuobiao.Format("%.1f-",dAlert);
GetDlgItem(IDC_HGY_ALERT)->SetWindowText(zuobiao);
zuobiao.Format("%.1f-",dAlarm);
GetDlgItem(IDC_HGY_ALARM)->SetWindowText(zuobiao);
//画左侧参考值
dcMemory.FillRect(&rcRed,&(((CCDMSApp*) AfxGetApp())->m_RedBrush));
dcMemory.FillRect(&rcYellow,&(((CCDMSApp*) AfxGetApp())->m_YellowBrush));
dcMemory.FillRect(&rcGreen,&(((CCDMSApp*) AfxGetApp())->m_GreenBrush));
//画右侧实际值
dcMemory.FillRect(&rcBlue,&(((CCDMSApp*) AfxGetApp())->m_BlueBrush));
}
pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcMemory,0,0,SRCCOPY);
dcMemory.SelectObject(oldPen);
dcMemory.SelectObject(oldBitmap);
pWnd->ReleaseDC(pDC);
::DeleteObject(&oldPen);
::DeleteObject(&oldBitmap);
}
*/
//画窄带报警
void CSet5View::DrawNarrowbandAlarm()
{
CWnd* pWnd = (CWnd*)GetDlgItem(IDC_SET5AMPLI);
CDC *pDC = pWnd->GetDC();
CRect rect;
pWnd->GetClientRect(rect);
int i;
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);
CBitmap *oldBitmap;
oldBitmap=dcMemory.SelectObject(&(((CCDMSApp*) AfxGetApp())->m_BlackBitmap));
CPen *oldPen;
oldPen=dcMemory.SelectObject(&(((CCDMSApp*) AfxGetApp())->m_GrayPen));
dcMemory.FillRect(&rect,&(((CCDMSApp*) AfxGetApp())->m_BlackBrush));
double x,y;
x=rect.Width()/8.0;
y=rect.Height()/4.0;
for(i=1; i<11; i++)
{
dcMemory.MoveTo((int)(x*i),0);
dcMemory.LineTo((int)(x*i),rect.Height());
}
for(i=0; i<2; i++)
{
dcMemory.MoveTo(0,rect.Height()/2-(int)(y*i));
dcMemory.LineTo(rect.Width(),rect.Height()/2-(int)(y*i));
dcMemory.MoveTo(0,rect.Height()/2+(int)(y*i));
dcMemory.LineTo(rect.Width(),rect.Height()/2+(int)(y*i));
}
//---------画小矩形框---------//
int nAlarmRect; //小矩形框高度
int nXCoordinate; //小矩形中心的x坐标值
double nSixth; //窄带报警窗口宽度的1/6
nSixth = rect.Width()/6.0;
dcMemory.SelectObject(&(((CCDMSApp*) AfxGetApp())->m_BluePen));
for(i=0;i<5;i++)
{
switch (i)
{
case 0: //半倍频
nXCoordinate = (int)(0.5*nSixth);
nAlarmRect = (int)(rect.Height()*0.7);
break;
case 1: //一倍频
nXCoordinate = (int)nSixth;
nAlarmRect = (int)(rect.Height()*0.1);
break;
case 2: //二倍频
nXCoordinate = (int)(2*nSixth);
nAlarmRect = (int)(rect.Height()*0.5);
break;
case 3: //三倍频
nXCoordinate = (int)(3*nSixth);
nAlarmRect = (int)(rect.Height()*0.7);
break;
case 4: //二十倍频
nXCoordinate = (int)(5*nSixth);
nAlarmRect = (int)(rect.Height()*0.9);
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -