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

📄 pipeimpl.cpp

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

CPipeImpl::CPipeImpl(CFlowCtrl *pOwer)
{
	m_pOwer = pOwer;
}

CPipeImpl::~CPipeImpl()
{

}

void CPipeImpl::Draw(CDC *pDC)
{
	//用渐变的方法绘制管道
	DrawGradient(pDC);

	//绘制图形周围的边框
	CRect rcClient;
	m_pOwer->GetClientRect(&rcClient);
	CBrush pBlackBrush(m_colorBorder);
	pDC->FrameRect(&rcClient, &pBlackBrush);
}

void CPipeImpl::DrawGradient(CDC *pDC)
{
	CRect		rcClient;
	CBitmap		MemBmp, *pOldMemBmp;
	CDC			MemDC;
	COLORREF	crCur;
	CPoint      ptCur;

	m_pOwer->GetClientRect(&rcClient);
	int nWidth = m_pOwer->GetFlowPattern() == FP_HORIZONTAL ?
		rcClient.Height() : rcClient.Width();
	RGBTRIPLE *pRGBTriple = new RGBTRIPLE[nWidth], *pEntry;

	if (pRGBTriple == NULL)
	{
		return;
	}

	MemBmp.CreateCompatibleBitmap(pDC, 
		m_pOwer->GetFlowPattern() == FP_HORIZONTAL ? 1 : rcClient.Width(), 
		m_pOwer->GetFlowPattern() == FP_HORIZONTAL ? rcClient.Height() : 1);
	MemDC.CreateCompatibleDC(pDC);
	pOldMemBmp = (CBitmap *)MemDC.SelectObject(&MemBmp);
	ptCur = CPoint(0, 0);
	m_Gradient.MakeEntries(pRGBTriple, nWidth);

	for (int i=0; i<nWidth; i++)
	{
		if (m_pOwer->GetFlowPattern() == FP_HORIZONTAL)
		{
			ptCur.y = i;
		}
		else
		{
			ptCur.x = i;
		}
		pEntry = &pRGBTriple[i];
		crCur = RGB(pEntry->rgbtRed, pEntry->rgbtGreen, pEntry->rgbtBlue);
		MemDC.SetPixelV(ptCur, crCur);
	}

	if (m_pOwer->GetFlowPattern() == FP_HORIZONTAL)
	{
		pDC->StretchBlt(rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(),
						&MemDC, 0, 0, 1, nWidth, SRCCOPY);
	}
	else
	{
		pDC->StretchBlt(rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(),
						&MemDC, 0, 0, nWidth, 1, SRCCOPY);
	}

	MemDC.SelectObject(pOldMemBmp);
	MemBmp.DeleteObject();
	MemDC.DeleteDC();

	delete [] pRGBTriple;
}

void CPipeImpl::InitGradient()
{
	m_colorBorder = RGB(0, 85, 0);  
	m_colorCenter = RGB( 152, 251, 152);		 

	m_Gradient.SetEndPegColour(m_colorBorder);
	m_Gradient.SetStartPegColour(m_colorBorder);
	m_Gradient.AddPeg(m_colorCenter, 0.5f);
	m_Gradient.SetUseBackground(FALSE);
}

void CPipeImpl::SetBorderColor(const COLORREF colorBorder)
{
	m_colorBorder = colorBorder;
	m_Gradient.SetStartPegColour(colorBorder);
	m_Gradient.SetEndPegColour(colorBorder);
	m_pOwer->ReconstructControl();
}

void CPipeImpl::SetCenterColor(const COLORREF colorCenter)
{
	m_colorCenter = colorCenter; 
	m_Gradient.SetPeg(0, colorCenter, 0.5f);
	m_pOwer->ReconstructControl();
}

void CPipeImpl::SetPipeStyle(CGradient::InterpolationMethod enumInterpolationMethod)
{
	m_Gradient.SetInterpolationMethod(enumInterpolationMethod);
	m_pOwer->ReconstructControl();
}

⌨️ 快捷键说明

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