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

📄 flowimpl.cpp

📁 一个工业控制管道流动控件,能够反映管道内流动情况.不是我写的,但觉得不错,因此转载上来
💻 CPP
字号:
#include "stdafx.h"
#include "FlowImpl.h"
#include "FlowCtrl.h"

CFlowImpl::CFlowImpl(CFlowCtrl *pOwer)
{
	m_pOwer = pOwer;
	m_arrayFlowUnit.RemoveAll(); 
	m_enumDLinePattern = DP_RIGHT;
	m_enumUnitPattern = UP_RECTANGLE;
	m_colorUnitBack = RGB( 255, 128, 64);
}

CFlowImpl::~CFlowImpl()
{

}

void CFlowImpl::Draw(CDC *pDC)
{
	CRect rcClient;
	m_pOwer->GetClientRect(&rcClient);
	POSITION pos = m_arrayFlowUnit.GetHeadPosition();

	while (pos != NULL)
	{
		m_arrayFlowUnit.GetNext(pos)->Draw(pDC, rcClient);
	}
}

void CFlowImpl::CalculateFlowUnit()
{
	CRect rcClient;
	m_pOwer->GetClientRect(&rcClient);

	int xResidue = (rcClient.right - rcClient.left) % 2;
	int xCenter = (rcClient.right - rcClient.left) / 2;
	int yCenter = (rcClient.bottom - rcClient.top) / 2;
	int yResidue = (rcClient.bottom - rcClient.top) % 2;

	POSITION pos = m_arrayFlowUnit.GetHeadPosition();
	while (pos != NULL)
	{
		CFlowUnit *pFlowUnit = m_arrayFlowUnit.GetAt(pos);

		//从左至右
		if (m_pOwer->GetDirectionType() == LEFT_TO_RIGHT)
		{
			CRect rcUnit = pFlowUnit->GetRect();
			rcUnit.DeflateRect(UNIT_STEP, 0, -UNIT_STEP, 0);
			pFlowUnit->SetRect(rcUnit); 		
			
			if (rcUnit.left >= rcClient.right)
			{
				pFlowUnit = m_arrayFlowUnit.GetHead();
				
				CRect rcAddUnit;
				rcAddUnit.SetRect(pFlowUnit->GetRect().left - UNIT_DISC - UNIT_WIDTH,
								  yCenter - UNIT_HEIGHT / 2,
								  pFlowUnit->GetRect().left - UNIT_DISC,
								  yCenter + UNIT_HEIGHT / 2 + yResidue);
				CFlowUnit *pAddFlowUnit = new CFlowUnit();
				pAddFlowUnit->SetRect(rcAddUnit);
				pAddFlowUnit->SetParentWnd(this);
				m_arrayFlowUnit.AddHead(pAddFlowUnit);
				
				m_arrayFlowUnit.RemoveAt(pos);
				break;
			}
		}
		//从右至左
		else if (m_pOwer->GetDirectionType() == RIGHT_TO_LEFT)
		{
			CRect rcUnit = pFlowUnit->GetRect();
			rcUnit.DeflateRect(-UNIT_STEP, 0, +UNIT_STEP, 0);
			pFlowUnit->SetRect(rcUnit); 		
			
			if (rcUnit.right <= rcClient.left)
			{
				pFlowUnit = m_arrayFlowUnit.GetTail();
				
				CRect rcAddUnit;
				rcAddUnit.SetRect(pFlowUnit->GetRect().right + UNIT_DISC,
								  yCenter - UNIT_HEIGHT / 2,
								  pFlowUnit->GetRect().right + UNIT_DISC + UNIT_WIDTH,
								  yCenter + UNIT_HEIGHT / 2 + yResidue);
				CFlowUnit *pAddFlowUnit = new CFlowUnit();
				pAddFlowUnit->SetRect(rcAddUnit);
				pAddFlowUnit->SetParentWnd(this);
				m_arrayFlowUnit.AddTail(pAddFlowUnit);
				
				m_arrayFlowUnit.RemoveAt(pos);
				break;
			}
		}
		//从上至下
		else if (m_pOwer->GetDirectionType() == TOP_TO_BOTTOM)
		{
			CRect rcUnit = pFlowUnit->GetRect();
			rcUnit.DeflateRect(0, UNIT_STEP, 0, -UNIT_STEP);
			pFlowUnit->SetRect(rcUnit); 		
			
			if (rcUnit.top >= rcClient.bottom)
			{
				pFlowUnit = m_arrayFlowUnit.GetHead();
				
				CRect rcAddUnit;
				rcAddUnit.SetRect(xCenter - UNIT_HEIGHT / 2,
								  pFlowUnit->GetRect().top - UNIT_DISC - UNIT_WIDTH,
								  xCenter + UNIT_HEIGHT / 2 + xResidue,
								  pFlowUnit->GetRect().top - UNIT_DISC);
				CFlowUnit *pAddFlowUnit = new CFlowUnit();
				pAddFlowUnit->SetRect(rcAddUnit);
				pAddFlowUnit->SetParentWnd(this);
				m_arrayFlowUnit.AddHead(pAddFlowUnit);
				
				m_arrayFlowUnit.RemoveAt(pos);
				break;
			}
		}
		//从下至上
		else if (m_pOwer->GetDirectionType() == BOTTOM_TO_TOP)
		{
			CRect rcUnit = pFlowUnit->GetRect();
			rcUnit.DeflateRect(0, -UNIT_STEP, 0, +UNIT_STEP);
			pFlowUnit->SetRect(rcUnit); 		
			
			if (rcUnit.bottom <= rcClient.top)
			{
				pFlowUnit = m_arrayFlowUnit.GetTail();
				
				CRect rcAddUnit;
				rcAddUnit.SetRect(xCenter - UNIT_HEIGHT / 2,
								  pFlowUnit->GetRect().bottom + UNIT_DISC,
								  xCenter + UNIT_HEIGHT / 2 + xResidue,
								  pFlowUnit->GetRect().bottom + UNIT_DISC + UNIT_WIDTH);
				CFlowUnit *pAddFlowUnit = new CFlowUnit();
				pAddFlowUnit->SetRect(rcAddUnit);
				pAddFlowUnit->SetParentWnd(this);
				m_arrayFlowUnit.AddTail(pAddFlowUnit);
				
				m_arrayFlowUnit.RemoveAt(pos);
				break;
			}
		}

		m_arrayFlowUnit.GetNext(pos);
	} 
}

void CFlowImpl::InitFlowUnit()
{ 
	CRect rcUnit, rcClient;
	m_pOwer->GetClientRect(&rcClient);
	m_arrayFlowUnit.RemoveAll();

	if (m_pOwer->GetDirectionType() == LEFT_TO_RIGHT
		|| m_pOwer->GetDirectionType() == RIGHT_TO_LEFT)
	{
		int nUnits = rcClient.Width() / (UNIT_WIDTH + UNIT_DISC);  
		int nResidue = (rcClient.bottom - rcClient.top) % 2;
		int yCenter = (rcClient.bottom - rcClient.top) / 2;
		for (int i=0; i<nUnits; i++)
		{		 
			rcUnit.SetRect(rcClient.left + i * (UNIT_WIDTH + UNIT_DISC),
						   yCenter - UNIT_HEIGHT / 2,
						   rcClient.left + i * (UNIT_WIDTH + UNIT_DISC) + UNIT_WIDTH,
						   yCenter + UNIT_HEIGHT / 2 + nResidue);
			
			CFlowUnit *pFlowUnit = new CFlowUnit();
			pFlowUnit->SetRect(rcUnit);
			pFlowUnit->SetParentWnd(this);
			m_arrayFlowUnit.AddTail(pFlowUnit);
		}
	}
	else
	{
		int nUnits = rcClient.bottom / (UNIT_WIDTH + UNIT_DISC);
		int nResidue = (rcClient.right - rcClient.left) % 2;
		int xCenter = (rcClient.right - rcClient.left) / 2;
		for (int i=0; i<nUnits; i++)
		{		 
			rcUnit.SetRect(xCenter - UNIT_HEIGHT / 2,
						   rcClient.top + i * (UNIT_WIDTH + UNIT_DISC),
						   xCenter + UNIT_HEIGHT / 2 + nResidue,
						   rcClient.top + i * (UNIT_WIDTH + UNIT_DISC) + UNIT_WIDTH);
			
			CFlowUnit *pFlowUnit = new CFlowUnit();
			pFlowUnit->SetRect(rcUnit);
			pFlowUnit->SetParentWnd(this);
			m_arrayFlowUnit.AddTail(pFlowUnit);
		} 
	}
}

void CFlowImpl::SetUnitBackColor(const COLORREF colorBack)
{
	m_colorUnitBack = colorBack;
}

⌨️ 快捷键说明

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