📄 pipeimpl.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 + -