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