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

📄 flowunit.cpp

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

CFlowUnit::CFlowUnit() 
{
	m_pParentWnd = NULL;
}

CFlowUnit::~CFlowUnit()
{

}

void CFlowUnit::Draw(CDC *pDC, CRect &rcClient)
{
	CBrush pBackBrush, *pOldBrush;

	if (m_pParentWnd == NULL)
	{
		return;
	}
	
	pBackBrush.CreateSolidBrush(m_pParentWnd->GetUnitBackColor());
	pOldBrush = (CBrush *)pDC->SelectObject(&pBackBrush);	

	switch (m_pParentWnd->GetUnitPattern())
	{
	case UP_RECTANGLE:
		pDC->FillRect(&m_rectClient, &pBackBrush);
		break;

	case UP_CIRCLE:
		pDC->SelectObject(::GetStockObject(NULL_PEN));
		pDC->Ellipse(&m_rectClient);
		break;

	case UP_DLINE:
		{
			int xCenter = 0, yCenter = 0;
			
			if ((m_pParentWnd->GetUnitDLinePattern() == DP_RIGHT) || (m_pParentWnd->GetUnitDLinePattern() == DP_LEFT))
			{
				xCenter = m_rectClient.left + (m_rectClient.right - m_rectClient.left) / 2;
				yCenter = (rcClient.bottom - rcClient.top) / 2;
			}
			else
			{
				xCenter = (rcClient.right - rcClient.left) / 2;
				yCenter = m_rectClient.top + (m_rectClient.bottom - m_rectClient.top) / 2;
			}
			DrawDLine(pDC, CPoint(xCenter, yCenter));
		}
		break;

	case UP_TRIANGLE:
		pDC->SelectObject(::GetStockObject(NULL_PEN));
		DrawTriangle(pDC);
		break;
	}

	pDC->SelectObject(pOldBrush);
	pBackBrush.DeleteObject();
}

void CFlowUnit::DrawDLine(CDC *pDC, CPoint ptCenter)
{
	if (m_pParentWnd == NULL)
	{
		return;
	}

	switch (m_pParentWnd->GetUnitDLinePattern())
	{
	case DP_RIGHT: 
		_D_LINE_H(ptCenter.x + 0, ptCenter.y + 0, m_pParentWnd->GetUnitBackColor());
		_D_LINE_H(ptCenter.x + 1, ptCenter.y + 1, m_pParentWnd->GetUnitBackColor());
		_D_LINE_H(ptCenter.x + 2, ptCenter.y + 2, m_pParentWnd->GetUnitBackColor());
		_D_LINE_H(ptCenter.x + 1, ptCenter.y + 3, m_pParentWnd->GetUnitBackColor());
		_D_LINE_H(ptCenter.x + 0, ptCenter.y + 4, m_pParentWnd->GetUnitBackColor());
		break;

	case DP_LEFT:
		_D_LINE_H(ptCenter.x + 2, ptCenter.y + 0, m_pParentWnd->GetUnitBackColor());
		_D_LINE_H(ptCenter.x + 1, ptCenter.y + 1, m_pParentWnd->GetUnitBackColor());
		_D_LINE_H(ptCenter.x + 0, ptCenter.y + 2, m_pParentWnd->GetUnitBackColor());
		_D_LINE_H(ptCenter.x + 1, ptCenter.y + 3, m_pParentWnd->GetUnitBackColor());
		_D_LINE_H(ptCenter.x + 2, ptCenter.y + 4, m_pParentWnd->GetUnitBackColor());
		break;

	case DP_DOWN: 
		_D_LINE_V(ptCenter.x + 0, ptCenter.y + 0, m_pParentWnd->GetUnitBackColor());
		_D_LINE_V(ptCenter.x + 1, ptCenter.y + 1, m_pParentWnd->GetUnitBackColor());
		_D_LINE_V(ptCenter.x + 2, ptCenter.y + 2, m_pParentWnd->GetUnitBackColor());
		_D_LINE_V(ptCenter.x + 3, ptCenter.y + 1, m_pParentWnd->GetUnitBackColor());
		_D_LINE_V(ptCenter.x + 4, ptCenter.y + 0, m_pParentWnd->GetUnitBackColor());
		break;

	case DP_UP: 
		_D_LINE_V(ptCenter.x + 0, ptCenter.y + 2, m_pParentWnd->GetUnitBackColor());
		_D_LINE_V(ptCenter.x + 1, ptCenter.y + 1, m_pParentWnd->GetUnitBackColor());
		_D_LINE_V(ptCenter.x + 2, ptCenter.y + 0, m_pParentWnd->GetUnitBackColor());
		_D_LINE_V(ptCenter.x + 3, ptCenter.y + 1, m_pParentWnd->GetUnitBackColor());
		_D_LINE_V(ptCenter.x + 4, ptCenter.y + 2, m_pParentWnd->GetUnitBackColor());
		break;

	default:
		break;
	}
}

void CFlowUnit::DrawTriangle(CDC *pDC)
{
	if (m_pParentWnd == NULL)
	{
		return;
	}

	CPoint ptRgn[3];

	switch (m_pParentWnd->GetFlowCtrl()->GetDirectionType())
	{
	case LEFT_TO_RIGHT:
		ptRgn[0].x = m_rectClient.left;
		ptRgn[0].y = m_rectClient.top;
		ptRgn[1].x = m_rectClient.left;
		ptRgn[1].y = m_rectClient.bottom;
		ptRgn[2].x = m_rectClient.right;
		ptRgn[2].y = m_rectClient.top + (m_rectClient.bottom - m_rectClient.top) / 2;
		break;

	case RIGHT_TO_LEFT:
		ptRgn[0].x = m_rectClient.right;
		ptRgn[0].y = m_rectClient.top;
		ptRgn[1].x = m_rectClient.right;
		ptRgn[1].y = m_rectClient.bottom;
		ptRgn[2].x = m_rectClient.left;
		ptRgn[2].y = m_rectClient.top + (m_rectClient.bottom - m_rectClient.top) / 2;
		break;

	case TOP_TO_BOTTOM:
		ptRgn[0].x = m_rectClient.left;
		ptRgn[0].y = m_rectClient.top;
		ptRgn[1].x = m_rectClient.right;
		ptRgn[1].y = m_rectClient.top;
		ptRgn[2].x = m_rectClient.left + (m_rectClient.right - m_rectClient.left) / 2;
		ptRgn[2].y = m_rectClient.bottom;
		break;

	case BOTTOM_TO_TOP:
		ptRgn[0].x = m_rectClient.left;
		ptRgn[0].y = m_rectClient.bottom;
		ptRgn[1].x = m_rectClient.right;
		ptRgn[1].y = m_rectClient.bottom;
		ptRgn[2].x = m_rectClient.left + (m_rectClient.right - m_rectClient.left) / 2;
		ptRgn[2].y = m_rectClient.top;
		break;

	default:
		break;
	}

	CBrush pBackBrush, *pOldBrush;
	pBackBrush.CreateSolidBrush(m_pParentWnd->GetUnitBackColor());
	pOldBrush = (CBrush *)pDC->SelectObject(&pBackBrush);
	pDC->SetPolyFillMode(WINDING);
	pDC->Polygon(ptRgn, 3);
	pDC->SelectObject(pOldBrush);
	pBackBrush.DeleteObject();
}

void CFlowUnit::SetParentWnd(CFlowImpl *pParentWnd)
{
	m_pParentWnd = pParentWnd;
}

⌨️ 快捷键说明

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