⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 curveview.cpp

📁 一个多线程的网络数据采集系统(客户端)
💻 CPP
字号:
// CurveView.cpp : CCurveView 类的实现
//

#include "stdafx.h"
#include "WspProcess.h"

#include "EachItemDoc.h"
#include "CurveView.h"
#include "ClientSocket.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#define XSCROLLBARID 12001
#define YSCROLLBARID 12002

// CCurveView

IMPLEMENT_DYNCREATE(CCurveView, CView)

BEGIN_MESSAGE_MAP(CCurveView, CView)
	// 标准打印命令
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
	ON_WM_SIZE()
	ON_WM_HSCROLL()
	ON_WM_VSCROLL()
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
	ON_MESSAGE(WM_ONRECEIVE, OnReceive)
END_MESSAGE_MAP()

// CCurveView 构造/销毁

CCurveView::CCurveView()
{
	// TODO: 在此处添加构造代码
	m_bCanSize = false;
	m_bFlag = false;	
}

CCurveView::~CCurveView()
{
}

BOOL CCurveView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或
	// 样式

	return CView::PreCreateWindow(cs);
}

void CCurveView::OnInitialUpdate()
{
	CView::OnInitialUpdate();

	// TODO: 在此添加专用代码和/或调用基类
	CEachItemDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	CRealTime *pGraph;
	pGraph = &(pDoc->m_graph);
	DWORD SecsPerCycle = pGraph->m_SpeedLevel[7];// 1 seconds(1 cycle per second)
	double UnitsPerCycle = pGraph->m_gapLevel[3];//(0.5 cycle per unit)
	pGraph->InitialSetting(30, 5, 50, 5, SecsPerCycle, 0, UnitsPerCycle);
	pGraph->AddLine("Sample Line1", 1000, RGB(255, 0, 0));
	pGraph->AddLine("Sample Line2", 3000, RGB(0, 255, 0));
	pGraph->AddLine("Sample Line3", 3000, RGB(0, 255, 0));
	pGraph->AddLine("Sample Line4", 3000, RGB(0, 255, 0));
	pGraph->AddLine("Sample Line5", 3000, RGB(0, 255, 0));
	pGraph->AddLine("Sample Line6", 3000, RGB(0, 255, 0));
	pGraph->AddLine("Sample Line7", 3000, RGB(0, 255, 0));
	pGraph->AddLine("Sample Line8", 3000, RGB(0, 255, 0));
	pGraph->AddLine("Sample Line9", 3000, RGB(0, 255, 0));
	pGraph->AddLine("Sample Line10", 3000, RGB(0, 255, 0));
	pGraph->AddLine("Sample Line11", 3000, RGB(0, 255, 0));
	pGraph->AddLine("Sample Line12", 3000, RGB(0, 255, 0));
	pGraph->AddLine("Sample Line13", 3000, RGB(0, 255, 0));

	CRect rect;
	GetClientRect(&rect);
	pGraph->RecalcRects(rect);
	m_xScrollBar.Create(WS_CHILD | WS_VISIBLE | SBS_HORZ, pGraph->XScrollBarSize(), this, XSCROLLBARID);
	m_xScrollBar.SetScrollRange(pGraph->m_nXTicks, pGraph->m_nXTicks);
	m_xScrollBar.EnableWindow(FALSE);
    m_yScrollBar.Create(WS_CHILD | WS_VISIBLE | SBS_VERT, pGraph->YScrollBarSize(), this, YSCROLLBARID);
	m_yScrollBar.SetScrollRange(0, pGraph->m_nYTicks * pGraph->m_nYPages);
    m_yScrollBar.SetScrollPos(pGraph->m_nYTicks * pGraph->m_nYPages / 2);
	m_yScrollBar.EnableWindow(FALSE);
	m_bCanSize = true;

/*	pGraph->m_curLine.m_nColor = RGB(255, 0, 0);//亮红色
	pGraph->m_curLine.m_dScaleLow = 10;
	pGraph->m_curLine.m_dScaleHigh = 90;
	pGraph->m_curLine.m_sName = "Sample Line";
	pGraph->m_curLine.m_sDescription = "N/A";
	pGraph->m_curLine.m_sUnit = "N/A";
	pGraph->m_curLine.m_dMin = 0;
	pGraph->m_curLine.m_dMax =100;
	pGraph->m_curLine.m_nLineStyle = PS_SOLID;
	pGraph->m_curLine.m_nLineWidth = 0;*/
}

// CCurveView 绘制

void CCurveView::OnDraw(CDC* pDC)
{
	CEachItemDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	// TODO: 在此处为本机数据添加绘制代码
	CRealTime *pGraph;
	pGraph = &(pDoc->m_graph);
	
	CRect rect;
	GetClientRect(rect);
	pGraph->DoPrepare(pDC,rect);

	bool realTime = pGraph->m_bRealTime;
    pGraph->m_bRealTime = false;
    pGraph->RefreshGraph(pDC);
	pGraph->m_redrawFlag = false;
//	if(realTime)pGraph->RedrawLastPage(pDC);
	if(realTime)
		pGraph->RestoreRealDraw();
	else
        pGraph->m_bRealTime = false;

/*	CRect rect,rect1;
	GetClientRect(rect);
	rect1.SetRect(rect.left + rect.Width() / 4, rect.top + rect.Height() / 4,
		rect.right - rect.Width() / 4, rect.bottom - rect.Height() / 4);
	pDC->Rectangle(rect1);
	LOGFONT lf;
	CString str(_T("HELLOKJHGF"));
	::ZeroMemory(&lf, sizeof(lf));
	lf.lfHeight = rect1.Height() * 4 / 5;
	lf.lfWidth = rect1.Width() / 2 / str.GetLength();
	lf.lfWeight = FW_NORMAL;
	lf.lfOrientation= 0;
	lf.lfEscapement = 0;
	::lstrcpy(lf.lfFaceName, _T("Times New Roman"));
	CFont font, *pOldFont;
	font.CreateFontIndirect(&lf);
	pOldFont = pDC->SelectObject(&font);
	pDC->DrawText(str, &rect1, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
	pDC->SelectObject(pOldFont);*/
}

// CCurveView 打印

BOOL CCurveView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// 默认准备
	return DoPreparePrinting(pInfo);
}

void CCurveView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 打印前添加额外的初始化
}

void CCurveView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 打印后添加清除过程
}


// CCurveView 诊断

#ifdef _DEBUG
void CCurveView::AssertValid() const
{
	CView::AssertValid();
}

void CCurveView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CEachItemDoc* CCurveView::GetDocument() const // 非调试版本是内联的
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CEachItemDoc)));
	return (CEachItemDoc*)m_pDocument;
}
#endif //_DEBUG


// CCurveView 消息处理程序

void CCurveView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
	CRealTime *pGraph = &(GetDocument()->m_graph);
	if(m_bFlag)
	{
        CClientDC dc(this);
		pGraph->RefreshGraph(&dc);
	}
	else 
		m_bFlag = true;
	if (pGraph->m_bRealTime)
	{
		m_xScrollBar.EnableWindow(FALSE);
		m_yScrollBar.EnableWindow(FALSE);
	}
	else
	{
		int nPos = pGraph->m_nPage * pGraph->m_nXTicks + pGraph->m_nTick;
		if(nPos >= 0)
		{
			int nMin, nMax;
			m_xScrollBar.GetScrollRange(&nMin, &nMax);
			if(nMax > pGraph->m_nXTicks)
				m_xScrollBar.SetScrollPos(nPos);
			else
				m_xScrollBar.EnableWindow(FALSE);
			m_yScrollBar.EnableWindow(TRUE);
		}
	}
}

void CCurveView::OnSize(UINT nType, int cx, int cy)
{
	CView::OnSize(nType, cx, cy);
	if(m_bCanSize)
	{
        CRect rect;
		GetClientRect(&rect);
		CRealTime *pGraph = &(GetDocument()->m_graph);
		pGraph->RecalcRects(rect);
		rect = pGraph->XScrollBarSize();
		m_xScrollBar.MoveWindow(rect);
		rect = pGraph->YScrollBarSize();
		m_yScrollBar.MoveWindow(rect);
	}
}

void CCurveView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	CView::OnHScroll(nSBCode, nPos, pScrollBar);
	
	CRealTime *pGraph = &(GetDocument()->m_graph);
	int nTemp1, nMin, nMax;
	nTemp1 = pScrollBar->GetScrollPos();
	pScrollBar->GetScrollRange(&nMin, &nMax);
	switch(nSBCode)
	{
		case SB_THUMBPOSITION:
			pScrollBar->SetScrollPos(nPos);
			if (nPos < nTemp1)
			{
				pGraph->SetForward(false);
				pGraph->m_nOffset = nTemp1 - nPos;				
			}
			else 
			{
				pGraph->SetForward(true);
				pGraph->m_nOffset = nPos - nTemp1;
			}
			pGraph->m_nTick = nPos % pGraph->m_nXTicks;
			pGraph->m_nPage = nPos / pGraph->m_nXTicks;
			break;
		case SB_LINELEFT:
			if (nTemp1 > nMin)
			{
				--nTemp1;
				pGraph->SetForward(false);
				pGraph->m_nOffset = 1;
			}
			else 
			{
				nTemp1 = nMin;
				pGraph->m_nOffset = 0;
			}
            pScrollBar->SetScrollPos(nTemp1);
			pGraph->m_nTick = nTemp1 % pGraph->m_nXTicks;
			pGraph->m_nPage = nTemp1 / pGraph->m_nXTicks;
			break;
		case SB_LINERIGHT:
			if (nTemp1 < nMax)
			{
				++nTemp1;
				pGraph->SetForward(true);
				pGraph->m_nOffset = 1;
			}
			else 
			{
				nTemp1 = nMax;
				pGraph->m_nOffset = 0;
			}
			pScrollBar->SetScrollPos(nTemp1);
			pGraph->m_nTick = nTemp1 % pGraph->m_nXTicks;
			pGraph->m_nPage = nTemp1 / pGraph->m_nXTicks;
			break;
		default:
			pGraph->m_nOffset = 0;
			break;
	}
	pGraph->m_nYOffset = 0;
	GetDocument()->UpdateAllViews(NULL);
}

void CCurveView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	CView::OnVScroll(nSBCode, nPos, pScrollBar);

    CRealTime *pGraph = &(GetDocument()->m_graph);
	int nTemp1, nMin, nMax;
	nTemp1 = pScrollBar->GetScrollPos();
	pScrollBar->GetScrollRange(&nMin, &nMax);
	switch(nSBCode)
	{
		case SB_THUMBPOSITION:
			pScrollBar->SetScrollPos(nPos);
	//		pGraph->m_nYOffset = nPos - nTemp1;
			pGraph->m_nYOffset = nTemp1 - nPos;
			break;
		case SB_LINELEFT:
	//		pGraph->m_nYOffset = -1;
			pGraph->m_nYOffset = 1;
			if (nTemp1 > nMin)
			{
				--nTemp1;
			}
			else 
			{
				nTemp1 = nMin;
            }
            pScrollBar->SetScrollPos(nTemp1);
			break;
		case SB_LINERIGHT:
	//		pGraph->m_nYOffset = 1;
			pGraph->m_nYOffset = -1;
			if (nTemp1 < nMax)
			{
				++nTemp1;
			}
			else 
			{
				nTemp1 = nMax;
			}
			pScrollBar->SetScrollPos(nTemp1);
			break;
		default:
			pGraph->m_nYOffset = 0;
			break;
	}
	pGraph->m_nOffset = 0;	
	GetDocument()->UpdateAllViews(NULL);
}

void CCurveView::OnLButtonDown(UINT nFlags, CPoint point)
{
	CRealTime *pGraph = &(GetDocument()->m_graph);
	pGraph->PrepareEdit(this, point);
    CView::OnLButtonDown(nFlags, point);
}

void CCurveView::OnMouseMove(UINT nFlags, CPoint point)
{
	CRealTime *pGraph = &(GetDocument()->m_graph);
	if(pGraph->DoEditing(this, point))
        GetDocument()->UpdateAllViews(NULL);
	CView::OnMouseMove(nFlags, point);
}

void CCurveView::OnLButtonUp(UINT nFlags, CPoint point)
{
	CRealTime *pGraph = &(GetDocument()->m_graph);
	pGraph->FinishEditing(this, point);
	GetDocument()->UpdateAllViews(NULL);
	CView::OnLButtonUp(nFlags, point);
}

LRESULT CCurveView::OnReceive(WPARAM wParam, LPARAM lParam) 
{
	CEachItemDoc *pDoc = GetDocument();
	CPkg *pkg = pDoc->m_recvQueue.Remove();
	pDoc->Receive(0, pkg);
	delete pkg;
	return 0L;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -