📄 shpfile.cpp
字号:
pPoint = (CMapPoint*)m_ObList.GetAt(pos);
//判断要绘制的的对象是否在当前屏幕范围内
if ( !m_CurMapExtent.IsPointIn(*pPoint))
{
m_ObList.GetNext(pos);
continue;
}
DrawPointElement(pDC,pPoint,draw );
m_ObList.GetNext(pos);
}
pDC->SelectObject(pOldBrush);
} else if ( m_pRender->GetRenderType() == SIMPLE_RENDER )
{
m_pRender->GetSimpleRender(simpleRender);
//pen.CreatePen(PS_SOLID,1,simpleRender.OutlineColor);
if ( simpleRender.iIndex == 0 )
{
brSimple.CreateSolidBrush(simpleRender.FillColor);
pOldBrush = pDC->SelectObject(&brSimple);
}
else
{
if (!brSimple.CreateHatchBrush( simpleRender.iIndex,
simpleRender.FillColor))
{
pOldBrush = pDC->SelectObject(&br);
}
else
{
pOldBrush = pDC->SelectObject(&brSimple);
}
}
for( pos = m_ObList.GetHeadPosition(); pos != NULL; )
{
pPoint = (CMapPoint*)m_ObList.GetAt(pos);
if ( !m_CurMapExtent.IsPointIn(*pPoint))
{
m_ObList.GetNext(pos);
continue;
}
DrawPointElement(pDC,pPoint,draw );
m_ObList.GetNext(pos);
}
pDC->SelectObject(pOldBrush);
pen.DeleteObject();
brSimple.DeleteObject();
}
else if ( m_pRender->GetRenderType() == UNIQUE_RENDER )
{
iField = m_pRender->GetFieldIndex();
for( pos = m_ObList.GetHeadPosition(); pos != NULL; )
{
pPoint = (CMapPoint*)m_ObList.GetAt(pos);
if ( !m_CurMapExtent.IsPointIn(*pPoint))
{
m_ObList.GetNext(pos);
continue;
}
iIndex = pPoint->GetIndex();
pRecordSet->Move(iIndex,BookmarkFirst);
pFields = pRecordSet->GetFields(0);
if ( iField >= 0 && iField < pFields->GetCout())
{
pField = pFields->GetField(iField);
csValue = pField->GetValueAsString();
rInfo = m_pRender->GetByValue(csValue);
ASSERT(rInfo);
CBrush brush(rInfo->clr);
pOldBrush = pDC->SelectObject(&brush);
DrawPointElement(pDC,pPoint,draw );
pDC->SelectObject(pOldBrush);
}
m_ObList.GetNext(pos);
}
}
}
/*************************************************
描述: 绘制单个的点对象
输入: 设备指针、点对象对象指针、
坐标变换参数结构对象
输出: 无
*************************************************/
void CShpFile::DrawPointElement(CDC*pDC,CMapPoint *pPoint, DrawParam& draw )
{
int iX,iY;
CRect rc;
if ( pPoint == NULL )
return;
iX = (int)((pPoint->GetX()-draw.m_StartX )/draw.m_Scale);
iY = (int)((draw.m_StartY-pPoint->GetY())/draw.m_Scale);
rc.left = iX - 4;
rc.right = iX + 4;
rc.top = iY - 4;
rc.bottom = iY + 4;
pDC->Rectangle(&rc);
}
/*************************************************
描述: 绘制线对象
输入: 设备指针、图例对象指针、坐标变换参数结构对象
输出: 无
*************************************************/
void CShpFile::DrawPLine(CDC*pDC , CMapRender* m_pRender , DrawParam& draw )
{
int iIndex,iField;
CPen *pOldPen;
SIMPLERENDER simpleRender;
CPen penSimple;
CPen pen(PS_SOLID,1,RGB(255,0,0));
CBrush br(RGB(255,239,156));
CMapFields *pFields;
CMapField *pField;
CMapLine *pLine;
POSITION pos;
CString csValue;
CMapRectangle shpRC;
RENDERINFO *rInfo;
if ( m_pRender == NULL )
{
pOldPen = pDC->SelectObject(&pen);
for( pos = m_ObList.GetHeadPosition(); pos != NULL; )
{
pLine = (CMapLine*)m_ObList.GetAt(pos);
shpRC = pLine->GetExtent();
if ( !m_CurMapExtent.IsInsercet(shpRC))
{
m_ObList.GetNext(pos);
continue;
}
DrawPLineElement(pDC,pLine,draw );
m_ObList.GetNext(pos);
}
pDC->SelectObject(pOldPen);
} else if ( m_pRender->GetRenderType() == SIMPLE_RENDER )
{
m_pRender->GetSimpleRender(simpleRender);
if ( simpleRender.iIndex == 0 )
{
pOldPen = pDC->SelectObject(&pen);
}
else
{
if (!penSimple.CreatePen(PS_SOLID,1,simpleRender.FillColor))
{
pOldPen = pDC->SelectObject(&pen);
}
else
{
pOldPen = pDC->SelectObject(&penSimple);
}
}
for( pos = m_ObList.GetHeadPosition(); pos != NULL; )
{
pLine = (CMapLine*)m_ObList.GetAt(pos);
shpRC = pLine->GetExtent();
if ( !m_CurMapExtent.IsInsercet(shpRC))
{
m_ObList.GetNext(pos);
continue;
}
DrawPLineElement(pDC,pLine,draw );
m_ObList.GetNext(pos);
}
pDC->SelectObject(pOldPen);
if ( penSimple.GetSafeHandle() != NULL )
penSimple.DeleteObject();
}
else if (m_pRender->GetRenderType() == UNIQUE_RENDER )
{
iField = m_pRender->GetFieldIndex();
for( pos = m_ObList.GetHeadPosition(); pos != NULL; )
{
pLine = (CMapLine*)m_ObList.GetAt(pos);
shpRC = pLine->GetExtent();
if ( !m_CurMapExtent.IsInsercet(shpRC))
{
m_ObList.GetNext(pos);
continue;
}
iIndex = pLine->GetIndex();
pRecordSet->Move(iIndex,BookmarkFirst);
pFields = pRecordSet->GetFields(0);
if ( iField >= 0 && iField < pFields->GetCout())
{
pField = pFields->GetField(iField);
csValue = pField->GetValueAsString();
rInfo = m_pRender->GetByValue(csValue);
ASSERT(rInfo);
CPen penTemp(PS_SOLID,1,rInfo->clr);
pOldPen = pDC->SelectObject(&penTemp);
DrawPLineElement(pDC,pLine,draw );
pDC->SelectObject(pOldPen);
}
m_ObList.GetNext(pos);
}
}
}
/*************************************************
描述: 绘制单个的线对象
输入: 设备指针、线对象对象指针、
坐标变换参数结构对象
输出: 无
*************************************************/
void CShpFile::DrawPLineElement(CDC*pDC, CMapLine *pPline , DrawParam& draw )
{
int i,j,k,iCount;
CMapPoint *pPoint;
CMapPoints *pPoints;
CMapParts *pParts;
CMapRectangle MapExtent;
CPoint *pPtArray; //顶点数组
if ( pPline == NULL )
return;
for ( i = 0 ; i < pPline->GetCount() ; i++ )
{
pParts = pPline->GetParts(i);
for ( j = 0 ; j < pParts->GetCount() ; j++)
{
pPoints = pParts->Get(j);
iCount = pPoints->GetCount();
pPtArray = new CPoint[iCount];
if ( pPtArray == NULL )
return ;
for ( k = 0 ; k < iCount; k++)
{
pPoint = pPoints->Get(k);
pPtArray[k].x = (int)((pPoint->GetX()-draw.m_StartX)/draw.m_Scale);
pPtArray[k].y = (int)((draw.m_StartY - pPoint->GetY())/draw.m_Scale);
}
}
}
//绘制多义线
pDC->Polyline(pPtArray,pPoints->GetCount());
delete []pPtArray;
}
/*************************************************
描述: 绘制面对象
输入: 设备指针、图例对象指针、坐标变换参数结构对象
输出: 无
*************************************************/
void CShpFile::DrawPolygon(CDC*pDC , CMapRender* m_pRender , DrawParam& draw )
{
int iIndex,iField;
//CPen *pOldPen;
CBrush *pOldBrush;
SIMPLERENDER simpleRender;
CBrush brSimple;
CPen pen;
CBrush br(RGB(255,239,156));
CMapFields *pFields;
CMapField *pField;
POSITION pos;
CString csValue;
RENDERINFO *rInfo;
CMapPolygon *pPolygon;
CMapRectangle shpRC;
if ( m_pRender == NULL )
{
pOldBrush = pDC->SelectObject(&br);
for( pos = m_ObList.GetHeadPosition(); pos != NULL; )
{
pPolygon = (CMapPolygon*)m_ObList.GetAt(pos);
shpRC = pPolygon->GetExtent();
if ( !m_CurMapExtent.IsInsercet(shpRC))
{
//要绘制的对象外接矩形是不是与屏幕相交
m_ObList.GetNext(pos);
continue;
}
DrawPolygonElement(pDC,pPolygon,draw );
m_ObList.GetNext(pos);
}
pDC->SelectObject(pOldBrush);
} else if ( m_pRender->GetRenderType() == SIMPLE_RENDER )
{
m_pRender->GetSimpleRender(simpleRender);
//pen.CreatePen(PS_SOLID,1,simpleRender.OutlineColor);
if ( simpleRender.iIndex == 0 )
{
brSimple.CreateSolidBrush(simpleRender.FillColor);
pOldBrush = pDC->SelectObject(&brSimple);
}
else
{
if (!brSimple.CreateHatchBrush( simpleRender.iIndex,
simpleRender.FillColor))
{
pOldBrush = pDC->SelectObject(&br);
}
else
{
pOldBrush = pDC->SelectObject(&brSimple);
}
}
for( pos = m_ObList.GetHeadPosition(); pos != NULL; )
{
pPolygon = (CMapPolygon*)m_ObList.GetAt(pos);
shpRC = pPolygon->GetExtent();
if ( !m_CurMapExtent.IsInsercet(shpRC))
{
//要绘制的对象外接矩形是不是与屏幕相交
m_ObList.GetNext(pos);
continue;
}
DrawPolygonElement(pDC,pPolygon,draw );
m_ObList.GetNext(pos);
}
pDC->SelectObject(pOldBrush);
if ( brSimple.GetSafeHandle() != NULL )
brSimple.DeleteObject();
}
else if ( m_pRender->GetRenderType() == UNIQUE_RENDER )
{
iField = m_pRender->GetFieldIndex();
for( pos = m_ObList.GetHeadPosition(); pos != NULL; )
{
pPolygon = (CMapPolygon*)m_ObList.GetAt(pos);
shpRC = pPolygon->GetExtent();
if ( !m_CurMapExtent.IsInsercet(shpRC))
{
//要绘制的对象外接矩形是不是与屏幕相交
m_ObList.GetNext(pos);
continue;
}
iIndex = pPolygon ->GetIndex();
pRecordSet->Move(iIndex,BookmarkFirst);
pFields = pRecordSet->GetFields(0);
if ( iField >= 0 && iField < pFields->GetCout())
{
pField = pFields->GetField(iField);
csValue = pField->GetValueAsString();
rInfo = m_pRender->GetByValue(csValue);
ASSERT(rInfo != NULL);
CBrush brush(rInfo->clr);
pOldBrush = pDC->SelectObject(&brush);
DrawPolygonElement(pDC,pPolygon,draw );
pDC->SelectObject(pOldBrush);
}
m_ObList.GetNext(pos);
}
}
}
/*************************************************
描述: 绘制单个的面对象
输入: 设备指针、面对象对象指针、
坐标变换参数结构对象
输出: 无
*************************************************/
void CShpFile::DrawPolygonElement(CDC*pDC , CMapPolygon* pPolygon , DrawParam& draw )
{
int i,j,k,m,iCount;
CMapPoint *pPoint;
CMapPoints *pPoints;
CMapParts *pParts;
CPoint *pPtArray; //顶点数组
int *pPolygonCount; //每个多边型的顶点数组
if ( pPolygon == NULL )
return;
iCount = pPolygon->GetCount(); //多边形个数
pPolygonCount = new int[iCount];
if ( pPolygonCount == NULL )
return;
//计算复合多边型每部分的顶点数,和总顶点数
for ( m= 0,i = 0 ; i < pPolygon->GetCount() ; i++ )
{
pParts = pPolygon->GetParts(i);
k = 0;
for ( j = 0 ; j < pParts->GetCount() ; j++)
{
pPoints = pParts->Get(j);
k += pPoints->GetCount();
}
pPolygonCount[i] = k;
m += k;
}
pPtArray = new CPoint[m];
if ( pPtArray == NULL )
{
delete []pPolygonCount;
return ;
}
for ( m= 0 , i = 0 ; i < pPolygon->GetCount() ; i++ )
{
pParts = pPolygon->GetParts(i);
for ( j = 0 ; j < pParts->GetCount() ; j++)
{
pPoints = pParts->Get(j);
for ( k = 0 ; k < pPoints->GetCount(); k++ )
{
pPoint = pPoints->Get(k);
pPtArray[m].x = (int)((pPoint->GetX() - draw.m_StartX)/draw.m_Scale);
pPtArray[m++].y = (long)((draw.m_StartY - pPoint->GetY() )/draw.m_Scale);
}
}
}
if ( pPolygon->GetCount() > 1)
pDC->PolyPolygon(pPtArray,pPolygonCount,iCount); //绘制复合多边形
else
pDC->Polygon(pPtArray, m);
delete []pPolygonCount;
delete []pPtArray;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -