aicai
路人甲
路人甲
  • 注册日期2003-11-18
  • 发帖数191
  • QQ
  • 铜币740枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:12684回复:41

贡献Vc 中MO编辑对象代码

楼主#
更多 发布于:2004-01-09 14:59
#if !defined(AFX_EDITDRAWOBJECT_H__D41EE22A_1C29_4D51_ACCC_C34028961529__INCLUDED_)
#define AFX_EDITDRAWOBJECT_H__D41EE22A_1C29_4D51_ACCC_C34028961529__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// EditDrawObject.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// CEditDrawObject window

enum Operator
{DelVertex = 1,SelVertex };

class CEditDrawObject : public CObject
{
// Construction
public:
CEditDrawObject();

// Attributes
public:

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CEditDrawObject)
//}}AFX_VIRTUAL

// Implementation
public:
void DeleteVertex();
void AddVertex( CMoPoint pt );
void ClearSelectObject();
void DragVirtualRect( CMoPoint pt );
void MoveVertex( CMoPoint pt );
void Refresh();
void SelectObject( CMoPoint pt , bool again=NULL );
void InitialMap( CMap1 *pMap );
void DrawEffect( );
virtual ~CEditDrawObject( );

// Generated message map functions
protected:

private:
void SelectVertex(CMoPoint pt );
int m_selVertex , m_partNO , m_vertexCount ;
Operator m_curOperator ;
CMoLine         m_selLine ;//Ñ¡ÔñµÄ¶ÔÏó
CMoPolygon         m_selPolygon ;//Ñ¡ÔñµÄ¶ÔÏó
CMap1           * m_pMap ;
CMoRecordset    m_selLineRecSet;//Ñ¡ÔñÏß¼¯ºÏ
CMoRecordset    m_selPolygonRecSet;//Ñ¡ÔñÏß¼¯ºÏ
float          m_oldX , m_oldY ;

};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_EDITDRAWOBJECT_H__D41EE22A_1C29_4D51_ACCC_C34028961529__INCLUDED_)
喜欢0 评分0
aicai
路人甲
路人甲
  • 注册日期2003-11-18
  • 发帖数191
  • QQ
  • 铜币740枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2004-01-09 15:00
// EditDrawObject.cpp : implementation file
//

#include "stdafx.h"
#include "MapObjectTest.h"
#include "EditDrawObject.h"

/*#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif*/

/////////////////////////////////////////////////////////////////////////////
// CEditDrawObject

CEditDrawObject::CEditDrawObject()
{

}

CEditDrawObject::~CEditDrawObject()
{
}


/////////////////////////////////////////////////////////////////////////////
// CEditDrawObject message handlers


void CEditDrawObject::DrawEffect()
{
CMoSymbol sym;
if (!sym.CreateDispatch("MapObjects2.Symbol"))
return;
//
// draw the selected object all Vertexs ;
//
if( m_selLine || m_selPolygon )
{
CMoParts parts ;
if( m_selLine )
{
parts = m_selLine.GetParts();//È¡µÃÏߵIJ¿·Ö
}
else if( m_selPolygon )
{
parts = m_selPolygon.GetParts();//È¡µÃÃæµÄ²¿·Ö
}

sym.SetColor(moCyan);
   sym.SetStyle(moGrayFill);
   sym.SetSize( 60 );

CMoPoints pts;
CMoPoint pt;
for (int j , i = 0 ; i < parts.GetCount() ; i++ )
{
pts = parts.Item( COleVariant(short( i )) );//&Egrave;&iexcl;&micro;&Atilde;&cedil;&Atilde;&sup2;&iquest;·&Ouml;&micro;&Auml;&micro;&atilde;&frac14;&macr;&ordm;&Iuml;
m_vertexCount = pts.GetCount() ;
for ( j = 0 ; j < m_vertexCount ; j++ )
{
pt = pts.Item( COleVariant(short( j )));//&Egrave;&iexcl;&micro;&Atilde;&cedil;&Atilde;&frac14;&macr;&ordm;&Iuml;&micro;&Auml;&micro;&atilde;
m_pMap->DrawShape( pt, sym);
//&Igrave;&Oslash;±&eth;&Iuml;&Ocirc;&Ecirc;&frac34;&Iacute;&frac14;&ETH;&Icirc;&micro;&Auml;±&raquo;&Ntilde;&iexcl;&Ocirc;&ntilde;&micro;&Auml;&frac12;&Uacute;&micro;&atilde;
if( m_selVertex == j )
{
//if( m_curOperator == DelVertex  )
{
}
//else if( m_curOperator == SelVertex  )
{
m_partNO = i ;
sym.SetColor( moYellow ) ;
m_pMap->DrawShape( pt , sym );
sym.SetColor( moCyan );
}
}
}
}
}
}

void CEditDrawObject::InitialMap(CMap1 *pMap)
{
m_pMap = pMap ;
m_selLine = NULL ;
m_selPolygon = NULL ;
m_selVertex = -1 ;

}

void CEditDrawObject::SelectObject(CMoPoint pt , bool again )
{
Refresh() ;
m_oldX = m_oldY = 0;
m_curOperator = SelVertex ;
if( ( m_selLine || m_selPolygon ) && !again )
{
SelectVertex( pt );
return ;
}
CMoLayers layers(m_pMap->GetLayers());
// Set the variant to select the states layer (1) (integer value)
// Variant used by a number of different calls
VARIANT va;
VariantInit(&va);
va.vt = VT_I4;
va.lVal = 1 ;  
CMoMapLayer layer ;
if (!layer.CreateDispatch(TEXT("MapObjects2.MapLayer")))
{
AfxMessageBox("&Iacute;&frac14;&sup2;&atilde;&Atilde;&raquo;&Oacute;&ETH;&acute;&acute;&frac12;¨&sup3;&Eacute;&sup1;&brvbar;&pound;&iexcl;&pound;&iexcl;&pound;&iexcl;");
return;
}

    int layerCount = layers.GetCount() ;
long layerShapeType ;

for( int i = 0 ; i <  layerCount ; i ++ )
{
va.lVal =  i ;
layer = layers.Item( va ) ;
if( layer.GetVisible() == FALSE )
continue ;
layerShapeType = layer.GetShapeType();
switch( layerShapeType )
{
case moShapeTypePolygon:
{
m_selPolygonRecSet = layer.SearchShape( pt , moPointInPolygon ,"" );//moLineCross  moPointInPolygon
m_selPolygonRecSet.MoveFirst();
while (!m_selPolygonRecSet.GetEof())
{
CMoFields Fields(m_selPolygonRecSet.GetFields());
CMoField ShapeField(Fields.Item(COleVariant(TEXT("Shape"))));

m_selPolygon.AttachDispatch(ShapeField.GetValue().pdispVal);

//m_pMap->FlashShape(m_selPolygon, 1);

m_selPolygonRecSet.MoveNext();
SelectVertex( pt );
return ;
}
m_selLine = NULL ;
break;
}
case moShapeTypeLine:
{
const double tolerance = m_pMap->ToMapDistance((float)2);
m_selLineRecSet = layer.SearchByDistance(pt, tolerance, TEXT(""));
m_selLineRecSet.MoveFirst();
while (!m_selLineRecSet.GetEof())
{
//MessageBox("&Ntilde;&iexcl;&Ocirc;&ntilde;&micro;&frac12;&Iuml;&szlig;&Aacute;&Euml;!!!");
CMoFields Fields(m_selLineRecSet.GetFields());
CMoField ShapeField(Fields.Item(COleVariant(TEXT("Shape"))));

m_selLine.AttachDispatch(ShapeField.GetValue().pdispVal);

//m_pMap->FlashShape(m_selLine, 1);

m_selLineRecSet.MoveNext();
SelectVertex( pt );
return ;
}
m_selPolygon = NULL ;
break;
}
}
}

}

void CEditDrawObject::Refresh()
{
//&Iuml;&Ocirc;&Ecirc;&frac34;&Ntilde;&iexcl;&Ocirc;&ntilde;&Iacute;&frac14;&ETH;&Icirc;&micro;&Auml;&Euml;ù&Oacute;&ETH;&frac12;&Uacute;&micro;&atilde;
if( m_selLine || m_selPolygon)
{
CMoRectangle rect ;
if (!rect.CreateDispatch(TEXT("MapObjects2.Rectangle")))
{
AfxMessageBox("&frac34;&Oslash;&ETH;&Icirc;&Atilde;&raquo;&Oacute;&ETH;&acute;&acute;&frac12;¨&sup3;&Eacute;&sup1;&brvbar;(CEditDrawObject::Refresh())!!!");
return;
}
if( m_selLine )
{
rect = m_selLine.GetExtent() ;
}
else
{
rect = m_selPolygon.GetExtent() ;
}

CMoPoint ptLeftTop;
CMoPoint ptRightBottom ;
if (!ptLeftTop.CreateDispatch(TEXT("MapObjects2.Point")))
{
AfxMessageBox("&Iacute;&frac14;&sup2;&atilde;&Atilde;&raquo;&Oacute;&ETH;&acute;&acute;&frac12;¨&sup3;&Eacute;&sup1;&brvbar;&pound;&iexcl;&pound;&iexcl;&pound;&iexcl;");
return;
}

if (!ptRightBottom.CreateDispatch(TEXT("MapObjects2.Point")))
{
AfxMessageBox("&Iacute;&frac14;&sup2;&atilde;&Atilde;&raquo;&Oacute;&ETH;&acute;&acute;&frac12;¨&sup3;&Eacute;&sup1;&brvbar;&pound;&iexcl;&pound;&iexcl;&pound;&iexcl;");
return;
}
ptLeftTop.SetX( rect.GetLeft() - 5 );
ptLeftTop.SetY( rect.GetTop()  + 5 );
ptRightBottom.SetX( rect.GetRight()  + 5 );
ptRightBottom.SetY( rect.GetBottom() - 5 );

float x1 , y1 , x2 ,y2 ;
m_pMap->FromMapPoint( ptLeftTop ,  &x1 , &y1 );
m_pMap->FromMapPoint( ptRightBottom ,  &x2 , &y2 );
CRect r((int)x1 , (int)y1 , (int)x2 ,(int)y2 );

m_pMap->InvalidateRect( r );
}

}

void CEditDrawObject::SelectVertex(CMoPoint pt)
{
if( m_selLine || m_selPolygon)
{
double tol = m_pMap->ToMapDistance( 7 );
   double dist  ;

CMoParts parts ;
CMoPoints pts ;
CMoPoint  point ;
if( m_selLine )
{
parts = m_selLine.GetParts();
}
else if( m_selPolygon )
{
parts = m_selPolygon.GetParts();
}

for (int j , i = 0 ; i < parts.GetCount() ; i++ )
{
pts = parts.Item( COleVariant(short( i )) );//&Egrave;&iexcl;&micro;&Atilde;&cedil;&Atilde;&sup2;&iquest;·&Ouml;&micro;&Auml;&micro;&atilde;&frac14;&macr;&ordm;&Iuml;
for ( j = 0 ; j < pts.GetCount() ; j++ )
{
point = pts.Item( COleVariant(short( j )));//&Egrave;&iexcl;&micro;&Atilde;&cedil;&Atilde;&frac14;&macr;&ordm;&Iuml;&micro;&Auml;&micro;&atilde;
dist = point.DistanceTo( pt ) ;
if( dist < tol )
{
m_pMap->FromMapPoint( point ,  &m_oldX , &m_oldY );
m_selVertex = j ;
return ;
}
}
}
m_selVertex = -1 ;
}
}
举报 回复(0) 喜欢(0)     评分
aicai
路人甲
路人甲
  • 注册日期2003-11-18
  • 发帖数191
  • QQ
  • 铜币740枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2004-01-09 15:01
void CEditDrawObject::MoveVertex(CMoPoint pt)
{
if( !m_selLineRecSet && !m_selPolygon )
{
return ;
}

if( m_selLineRecSet.GetCount() >= 0 )
{
CMoFields stateFields ;
CMoField stateShapeField ;
CMoTrackingLayer tLayer(m_pMap->GetTrackingLayer());

CMoRectangle r ;
VARIANT va;

m_selLineRecSet.MoveFirst();
while (!m_selLineRecSet.GetEof())
{
stateFields     = m_selLineRecSet.GetFields() ;
stateShapeField = stateFields.Item(COleVariant(TEXT("Shape")));
CMoLine* pLine  = new CMoLine();
pLine->AttachDispatch(stateShapeField.GetValue().pdispVal);

r = pLine->GetExtent();
VariantInit(&va);
va.vt = VT_DISPATCH;
va.pdispVal = r.m_lpDispatch;
m_pMap->RefreshRect( r );

CMoParts parts = pLine->GetParts();//&Egrave;&iexcl;&micro;&Atilde;&Iuml;&szlig;&micro;&Auml;&sup2;&iquest;·&Ouml;
CMoPoints pts;
CMoPoint point;
m_selLineRecSet.Edit();
for (int i = 0 ; i < parts.GetCount() ; i++ )
{
pts = parts.Item( COleVariant(short( i )) );//&Egrave;&iexcl;&micro;&Atilde;&cedil;&Atilde;&sup2;&iquest;·&Ouml;&micro;&Auml;&micro;&atilde;&frac14;&macr;&ordm;&Iuml;
for (int j = 0 ; j < pts.GetCount() ; j++ )
{
if( j == m_selVertex )
{
pts.Set( j , pt );
}
}
}

            r = pLine->GetExtent();
VariantInit(&va);
va.vt = VT_DISPATCH;
va.pdispVal = r.m_lpDispatch;
m_pMap->RefreshRect( r );

VariantInit(&va);
va.vt = VT_DISPATCH;
va.pdispVal = pLine->m_lpDispatch;
stateShapeField.Set_Value( va );
m_selLineRecSet.Update();
m_selLineRecSet.StopEditing();

delete pLine ;
m_selLineRecSet.MoveNext();
}
}
if( m_selPolygonRecSet.GetCount() >= 0 )
{
CMoFields stateFields ;
CMoField stateShapeField ;
CMoTrackingLayer tLayer(m_pMap->GetTrackingLayer());

CMoRectangle r ;
VARIANT va;

m_selPolygonRecSet.MoveFirst();
while (!m_selPolygonRecSet.GetEof())
{
stateFields     = m_selPolygonRecSet.GetFields() ;
stateShapeField = stateFields.Item(COleVariant(TEXT("Shape")));
CMoPolygon* pPolygon  = new CMoPolygon();
pPolygon->AttachDispatch(stateShapeField.GetValue().pdispVal);

r = pPolygon->GetExtent();
VariantInit(&va);
va.vt = VT_DISPATCH;
va.pdispVal = r.m_lpDispatch;
m_pMap->RefreshRect( r );

CMoParts parts = pPolygon->GetParts();//&Egrave;&iexcl;&micro;&Atilde;&Iuml;&szlig;&micro;&Auml;&sup2;&iquest;·&Ouml;
CMoPoints pts;
CMoPoint point;
m_selPolygonRecSet.Edit();
for (int i = 0 ; i < parts.GetCount() ; i++ )
{
pts = parts.Item( COleVariant(short( i )) );//&Egrave;&iexcl;&micro;&Atilde;&cedil;&Atilde;&sup2;&iquest;·&Ouml;&micro;&Auml;&micro;&atilde;&frac14;&macr;&ordm;&Iuml;
for (int j = 0 ; j < pts.GetCount() ; j++ )
{
if( j == m_selVertex )
{
pts.Set( j , pt );
}
}
}

            r = pPolygon->GetExtent();
VariantInit(&va);
va.vt = VT_DISPATCH;
va.pdispVal = r.m_lpDispatch;
m_pMap->RefreshRect( r );

VariantInit(&va);
va.vt = VT_DISPATCH;
va.pdispVal = pPolygon->m_lpDispatch;
stateShapeField.Set_Value( va );
m_selPolygonRecSet.Update();
m_selPolygonRecSet.StopEditing();

delete pPolygon ;
m_selPolygonRecSet.MoveNext();
}
}
SelectObject( pt , true );

}

void CEditDrawObject::DragVirtualRect(CMoPoint pt)
{
if( !m_selLine && !m_selPolygon  )
{
return ;
}
if( m_selVertex == -1 )
return ;

float x1 , y1;
m_pMap->FromMapPoint( pt ,  &x1 , &y1 );

/////&raquo;&shy;&ETH;§&sup1;&ucirc;&Iuml;&szlig;(&frac34;&Oslash;&ETH;&Icirc;)&iquest;&ordf;&Ecirc;&frac14;//////////////
CDC *pDC ;
CPen pen, *pOldPen;
pDC = m_pMap->GetDC();
pen.CreatePen(1, 1, (COLORREF)pDC->GetBkColor());
pOldPen = pDC->SelectObject(&pen);
pDC->SelectStockObject( HOLLOW_BRUSH );
pDC->SetROP2 (R2_NOT);

int xx1 ,yy1 ,xx2 ,yy2 ;

xx1 = (int)m_oldX - 3  ;
yy1 = (int)m_oldY + 3  ;
xx2 = (int)m_oldX + 3  ;
yy2 = (int)m_oldY - 3  ;


pDC->MoveTo( xx1 , yy1 );
pDC->LineTo( xx2 , yy1 );

pDC->MoveTo( xx1 , yy1 );
pDC->LineTo( xx1 , yy2 );

pDC->MoveTo( xx2 , yy1 );
pDC->LineTo( xx2 , yy2 );

pDC->MoveTo( xx1 , yy2 );
pDC->LineTo( xx2 , yy2 );

xx1 = (int)x1 - 3  ;
yy1 = (int)y1 + 3  ;
xx2 = (int)x1 + 3  ;
yy2 = (int)y1 - 3  ;

pDC->MoveTo( xx1 , yy1 );
pDC->LineTo( xx2 , yy1 );

pDC->MoveTo( xx1 , yy1 );
pDC->LineTo( xx1 , yy2 );

pDC->MoveTo( xx2 , yy1 );
pDC->LineTo( xx2 , yy2 );

pDC->MoveTo( xx1 , yy2 );
pDC->LineTo( xx2 , yy2 );

//m_pMap->ReleaseDC( pDC );
/////&raquo;&shy;&ETH;§&sup1;&ucirc;&Iuml;&szlig;(&frac34;&Oslash;&ETH;&Icirc;)&frac12;á&Ecirc;&oslash;//////////////

/////&raquo;&shy;&ETH;§&sup1;&ucirc;&Iuml;&szlig;(&Iuml;&eth;&AElig;¤&Iuml;&szlig;)&iquest;&ordf;&Ecirc;&frac14;//////////////
//&Ntilde;&iexcl;&Ocirc;&ntilde;&micro;&Auml;&Ecirc;&Ccedil;&micro;&Uacute;&Ograve;&raquo;&cedil;&ouml;&para;&Euml;&micro;&atilde;
if( m_selVertex == 0)
{
if( m_selLine || m_selPolygon )
{
CMoParts parts ;
if( m_selLine )
{
parts = m_selLine.GetParts();//&Egrave;&iexcl;&micro;&Atilde;&Iuml;&szlig;&micro;&Auml;&sup2;&iquest;·&Ouml;
}
else if( m_selPolygon )
{
parts = m_selPolygon.GetParts();//&Egrave;&iexcl;&micro;&Atilde;&Atilde;&aelig;&micro;&Auml;&sup2;&iquest;·&Ouml;
}

CMoPoints pts;
CMoPoint ptNO2;
pts = parts.Item( COleVariant(short( m_partNO )) );//&Egrave;&iexcl;&micro;&Atilde;&cedil;&Atilde;&sup2;&iquest;·&Ouml;&micro;&Auml;&micro;&atilde;&frac14;&macr;&ordm;&Iuml;
ptNO2 = pts.Item( COleVariant(short( 1 )));//&Egrave;&iexcl;&micro;&Atilde;&cedil;&Atilde;&frac14;&macr;&ordm;&Iuml;&micro;&Auml;&micro;&atilde;

float No2X , No2Y ;
m_pMap->FromMapPoint( ptNO2 ,  &No2X , &No2Y );
pDC->MoveTo( (int)No2X , (int)No2Y);
pDC->LineTo( (int)m_oldX , (int)m_oldY );

pDC->MoveTo( (int)No2X , (int)No2Y );
pDC->LineTo( (int)x1 ,  (int)y1 );
            //&Atilde;&aelig;&Ecirc;&Ccedil;&Ecirc;×&Icirc;&sup2;&Iuml;à&Aacute;&not;&micro;&Auml;&pound;&not;&Ograve;&ordf;&Aacute;&not;×&icirc;&ordm;ó&Ograve;&raquo;&micro;&atilde;
if( m_selPolygon )
{
CMoPoint ptLast;
ptLast = pts.Item( COleVariant(short( m_vertexCount - 1 )));//&Egrave;&iexcl;&micro;&Atilde;&cedil;&Atilde;&frac14;&macr;&ordm;&Iuml;&micro;&Auml;&micro;&atilde;

m_pMap->FromMapPoint( ptLast ,  &No2X , &No2Y );
pDC->MoveTo( (int)No2X , (int)No2Y);
pDC->LineTo( (int)m_oldX , (int)m_oldY );

pDC->MoveTo( (int)No2X , (int)No2Y );
pDC->LineTo( (int)x1 ,  (int)y1 );
}
}
}
//&Ntilde;&iexcl;&Ocirc;&ntilde;&micro;&Auml;&Ecirc;&Ccedil;×&icirc;&ordm;ó&para;&Euml;&micro;&atilde;
else if( m_selVertex == m_vertexCount - 1 )
{
if( m_selLine || m_selPolygon )
{
CMoParts parts ;
if( m_selLine )
{
parts = m_selLine.GetParts();//&Egrave;&iexcl;&micro;&Atilde;&Iuml;&szlig;&micro;&Auml;&sup2;&iquest;·&Ouml;
}
else if( m_selPolygon )
{
parts = m_selPolygon.GetParts();//&Egrave;&iexcl;&micro;&Atilde;&Atilde;&aelig;&micro;&Auml;&sup2;&iquest;·&Ouml;
}

CMoPoints pts;
CMoPoint ptLast;
pts = parts.Item( COleVariant(short( m_partNO )) );//&Egrave;&iexcl;&micro;&Atilde;&cedil;&Atilde;&sup2;&iquest;·&Ouml;&micro;&Auml;&micro;&atilde;&frac14;&macr;&ordm;&Iuml;
ptLast = pts.Item( COleVariant(short( m_vertexCount - 2 )));//&Egrave;&iexcl;&micro;&Atilde;&cedil;&Atilde;&frac14;&macr;&ordm;&Iuml;&micro;&Auml;&micro;&atilde;

float LastX , LastY ;
m_pMap->FromMapPoint( ptLast ,  &LastX , &LastY );
pDC->MoveTo( (int)LastX , (int)LastY);
pDC->LineTo( (int)m_oldX , (int)m_oldY );
pDC->MoveTo( (int)LastX , (int)LastY );
pDC->LineTo( (int)x1 ,  (int)y1 );
//&Atilde;&aelig;&Ecirc;&Ccedil;&Ecirc;×&Icirc;&sup2;&Iuml;à&Aacute;&not;&micro;&Auml;&pound;&not;&Ograve;&ordf;&Aacute;&not;&iquest;&ordf;&Ecirc;&frac14;&Ograve;&raquo;&micro;&atilde;
if( m_selPolygon )
{
CMoPoint ptFirst ;
ptFirst = pts.Item( COleVariant(short( 0 )));//&Egrave;&iexcl;&micro;&Atilde;&cedil;&Atilde;&frac14;&macr;&ordm;&Iuml;&micro;&Auml;&micro;&atilde;m_vertexCount - 1

m_pMap->FromMapPoint( ptFirst ,  &LastX , &LastY );
pDC->MoveTo( (int)LastX , (int)LastY);
pDC->LineTo( (int)m_oldX , (int)m_oldY );

pDC->MoveTo( (int)LastX , (int)LastY );
pDC->LineTo( (int)x1 ,  (int)y1 );
}

}
}
//&Ntilde;&iexcl;&Ocirc;&ntilde;&micro;&Auml;&Ecirc;&Ccedil;&Ouml;&ETH;&frac14;&auml;&para;&Euml;&micro;&atilde;
else
{
if( m_selLine || m_selPolygon )
{
CMoParts parts ;
if( m_selLine )
{
parts = m_selLine.GetParts();//&Egrave;&iexcl;&micro;&Atilde;&Iuml;&szlig;&micro;&Auml;&sup2;&iquest;·&Ouml;
}
else if( m_selPolygon )
{
parts = m_selPolygon.GetParts();//&Egrave;&iexcl;&micro;&Atilde;&Atilde;&aelig;&micro;&Auml;&sup2;&iquest;·&Ouml;
}

CMoPoints pts;
CMoPoint ptFront , ptBack ;
pts = parts.Item( COleVariant(short( m_partNO )) );//&Egrave;&iexcl;&micro;&Atilde;&cedil;&Atilde;&sup2;&iquest;·&Ouml;&micro;&Auml;&micro;&atilde;&frac14;&macr;&ordm;&Iuml;
ptFront = pts.Item( COleVariant(short( m_selVertex - 1 )));//&Egrave;&iexcl;&micro;&Atilde;&cedil;&Atilde;&frac14;&macr;&ordm;&Iuml;&micro;&Auml;&micro;&atilde;
ptBack = pts.Item( COleVariant(short( m_selVertex + 1 )));//&Egrave;&iexcl;&micro;&Atilde;&cedil;&Atilde;&frac14;&macr;&ordm;&Iuml;&micro;&Auml;&micro;&atilde;

float tempX , tempY ;
//&Ccedil;°&Iuml;&eth;&AElig;¤&Iuml;&szlig;
m_pMap->FromMapPoint( ptFront ,  &tempX , &tempY );
pDC->MoveTo( (int)tempX , (int)tempY);
pDC->LineTo( (int)m_oldX , (int)m_oldY );

pDC->MoveTo( (int)tempX , (int)tempY );
pDC->LineTo( (int)x1 ,  (int)y1 );

//&ordm;ó&Iuml;&eth;&AElig;¤&Iuml;&szlig;
m_pMap->FromMapPoint( ptBack ,  &tempX , &tempY );
pDC->MoveTo( (int)tempX , (int)tempY);
pDC->LineTo( (int)m_oldX , (int)m_oldY );

pDC->MoveTo( (int)tempX , (int)tempY );
pDC->LineTo( (int)x1 ,  (int)y1 );

}
}

m_pMap->ReleaseDC( pDC );
m_oldX = x1 ;
m_oldY = y1 ;
/////&raquo;&shy;&ETH;§&sup1;&ucirc;&Iuml;&szlig;(&Iuml;&eth;&AElig;¤&Iuml;&szlig;)&frac12;á&Ecirc;&oslash;//////////////

}
举报 回复(0) 喜欢(0)     评分
aicai
路人甲
路人甲
  • 注册日期2003-11-18
  • 发帖数191
  • QQ
  • 铜币740枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2004-01-09 15:01
void CEditDrawObject::ClearSelectObject()
{
m_selLine = NULL ;
m_selPolygon = NULL ;
}

void CEditDrawObject::AddVertex(CMoPoint pt)
{
if( !m_selLineRecSet && !m_selPolygon )
{
return ;
}

double tol = m_pMap->ToMapDistance( 7 );
double dist  ;

if( m_selLineRecSet.GetCount() >= 0 )
{
CMoFields stateFields ;
CMoField stateShapeField ;
CMoTrackingLayer tLayer(m_pMap->GetTrackingLayer());

CMoRectangle r ;
VARIANT va1 , va2 ;

m_selLineRecSet.MoveFirst();
while (!m_selLineRecSet.GetEof())
{
stateFields     = m_selLineRecSet.GetFields() ;
stateShapeField = stateFields.Item(COleVariant(TEXT("Shape")));
CMoLine* pLine  = new CMoLine();
pLine->AttachDispatch(stateShapeField.GetValue().pdispVal);

/*r = pLine->GetExtent();
VariantInit(&va);
va.vt = VT_DISPATCH;
va.pdispVal = r.m_lpDispatch;
m_pMap->RefreshRect( r );*/

VariantInit(&va1);
va1.vt = VT_DISPATCH;
VariantInit(&va2);
va2.vt = VT_DISPATCH;

CMoParts parts = pLine->GetParts();//&Egrave;&iexcl;&micro;&Atilde;&Iuml;&szlig;&micro;&Auml;&sup2;&iquest;·&Ouml;
CMoPoints pts;
CMoPoint point1 , point2 ;
m_selLineRecSet.Edit();
for (int i = 0 ; i < parts.GetCount() ; i++ )
{
pts = parts.Item( COleVariant(short( i )) );//&Egrave;&iexcl;&micro;&Atilde;&cedil;&Atilde;&sup2;&iquest;·&Ouml;&micro;&Auml;&micro;&atilde;&frac14;&macr;&ordm;&Iuml;
for (int j = 0 ; j < pts.GetCount() - 1 ; j++ )
{
point1 = pts.Item( COleVariant(short( j )));
point2 = pts.Item( COleVariant(short( j + 1 )));
dist = pt.DistanceToSegment( point1, point2 ) ;
if( dist <= tol )
{
pts.Insert( j + 1  , pt );
m_selVertex = j  ;
break ;
}
}
}

            r = pLine->GetExtent();
VariantInit(&va1);
va1.vt = VT_DISPATCH;
va1.pdispVal = r.m_lpDispatch;
m_pMap->RefreshRect( r );

VariantInit(&va1);
va1.vt = VT_DISPATCH;
va1.pdispVal = pLine->m_lpDispatch;
stateShapeField.Set_Value( va1 );
m_selLineRecSet.Update();
m_selLineRecSet.StopEditing();

delete pLine ;
m_selLineRecSet.MoveNext();
SelectObject( pt , true );
}
}
if( m_selPolygonRecSet.GetCount() >= 0 )
{
CMoFields stateFields ;
CMoField stateShapeField ;
CMoTrackingLayer tLayer(m_pMap->GetTrackingLayer());

CMoRectangle r ;
VARIANT va1 , va2 ;

m_selPolygonRecSet.MoveFirst();
while (!m_selPolygonRecSet.GetEof())
{
stateFields     = m_selPolygonRecSet.GetFields() ;
stateShapeField = stateFields.Item(COleVariant(TEXT("Shape")));
CMoPolygon* pPolygon  = new CMoPolygon();
pPolygon->AttachDispatch(stateShapeField.GetValue().pdispVal);

/*r = pLine->GetExtent();
VariantInit(&va);
va.vt = VT_DISPATCH;
va.pdispVal = r.m_lpDispatch;
m_pMap->RefreshRect( r );*/

VariantInit(&va1);
va1.vt = VT_DISPATCH;
VariantInit(&va2);
va2.vt = VT_DISPATCH;

CMoParts parts = pPolygon->GetParts();//&Egrave;&iexcl;&micro;&Atilde;&Iuml;&szlig;&micro;&Auml;&sup2;&iquest;·&Ouml;
CMoPoints pts;
CMoPoint point1 , point2 ;
m_selPolygonRecSet.Edit();
for (int i = 0 ; i < parts.GetCount() ; i++ )
{
pts = parts.Item( COleVariant(short( i )) );//&Egrave;&iexcl;&micro;&Atilde;&cedil;&Atilde;&sup2;&iquest;·&Ouml;&micro;&Auml;&micro;&atilde;&frac14;&macr;&ordm;&Iuml;
for (int j = 0 ; j < pts.GetCount() - 1 ; j++ )
{
point1 = pts.Item( COleVariant(short( j )));
point2 = pts.Item( COleVariant(short( j + 1 )));
dist = pt.DistanceToSegment( point1, point2 ) ;
if( dist <= tol )
{
pts.Insert( j + 1  , pt );
m_selVertex = j  ;
break ;
}
}
//&Ocirc;&Uacute;&Ograve;&raquo;&cedil;&ouml;&micro;&atilde;&ordm;&Iacute;×&icirc;&ordm;ó&Ograve;&raquo;&micro;&atilde;&Ouml;&reg;&frac14;&auml;&micro;&Auml;&para;&Icirc;&Ecirc;±
point1 = pts.Item( COleVariant(short( pts.GetCount() - 1 )));
point2 = pts.Item( COleVariant(short( 0 )));
dist = pt.DistanceToSegment( point1, point2 ) ;
if( dist <= tol )
{
pts.Insert( 0  , pt );
m_selVertex = 0  ;
}
}

            r = pPolygon->GetExtent();
VariantInit(&va1);
va1.vt = VT_DISPATCH;
va1.pdispVal = r.m_lpDispatch;
m_pMap->RefreshRect( r );

VariantInit(&va1);
va1.vt = VT_DISPATCH;
va1.pdispVal = pPolygon->m_lpDispatch;
stateShapeField.Set_Value( va1 );
m_selPolygonRecSet.Update();
m_selPolygonRecSet.StopEditing();

delete pPolygon ;
m_selPolygonRecSet.MoveNext();
SelectObject( pt , true );
}
}

}

void CEditDrawObject::DeleteVertex()
{
if( !m_selLineRecSet && !m_selPolygon )
{
return ;
}
    
if( m_selLineRecSet.GetCount() >= 0 )
{

CMoFields stateFields ;
CMoField stateShapeField ;
CMoPoint    ptAgainSelect ;
CMoTrackingLayer tLayer(m_pMap->GetTrackingLayer());

CMoRectangle r ;
VARIANT va;

m_selLineRecSet.MoveFirst();
while (!m_selLineRecSet.GetEof())
{
stateFields     = m_selLineRecSet.GetFields() ;
stateShapeField = stateFields.Item(COleVariant(TEXT("Shape")));
CMoLine* pLine  = new CMoLine();
pLine->AttachDispatch(stateShapeField.GetValue().pdispVal);

r = pLine->GetExtent();
VariantInit(&va);
va.vt = VT_DISPATCH;
va.pdispVal = r.m_lpDispatch;
m_pMap->RefreshRect( r );

CMoParts parts = pLine->GetParts();//&Egrave;&iexcl;&micro;&Atilde;&Iuml;&szlig;&micro;&Auml;&sup2;&iquest;·&Ouml;
CMoPoints pts;
//CMoPoints points;
m_selLineRecSet.Edit();
if( m_selVertex >= 0 )
{
for (int i = 0 ; i < parts.GetCount() ; i++ )
{
pts = parts.Item( COleVariant(short( i )) );//&Egrave;&iexcl;&micro;&Atilde;&cedil;&Atilde;&sup2;&iquest;·&Ouml;&micro;&Auml;&micro;&atilde;&frac14;&macr;&ordm;&Iuml;
if( pts.GetCount() == 2 )
continue ;
for (int j = 0 ; j < pts.GetCount() ; j++ )
{
if( m_partNO == i && m_selVertex == j )
{
pts.Remove( j );
m_selVertex = j - 1;
ptAgainSelect = pts.Item( COleVariant(short( j - 1 ) ));
//m_curOperator = DelVertex ;
//m_partNO = -1 ;
//m_selVertex = -1 ;
break;
}
}
}
}

            r = pLine->GetExtent();
VariantInit(&va);
va.vt = VT_DISPATCH;
va.pdispVal = r.m_lpDispatch;
m_pMap->RefreshRect( r );

VariantInit(&va);
va.vt = VT_DISPATCH;
va.pdispVal = pLine->m_lpDispatch;
stateShapeField.Set_Value( va );
m_selLineRecSet.Update();
m_selLineRecSet.StopEditing();

delete pLine ;
m_selLineRecSet.MoveNext();
SelectObject( ptAgainSelect , true );
}
}
if( m_selPolygonRecSet.GetCount() >= 0 )
{

CMoFields stateFields ;
CMoField stateShapeField ;
CMoPoint    ptAgainSelect ;
CMoTrackingLayer tLayer(m_pMap->GetTrackingLayer());

CMoRectangle r ;
VARIANT va;

m_selPolygonRecSet.MoveFirst();
while (!m_selPolygonRecSet.GetEof())
{
stateFields     = m_selPolygonRecSet.GetFields() ;
stateShapeField = stateFields.Item(COleVariant(TEXT("Shape")));
CMoPolygon* pPolygon  = new CMoPolygon();
pPolygon->AttachDispatch(stateShapeField.GetValue().pdispVal);

r = pPolygon->GetExtent();
VariantInit(&va);
va.vt = VT_DISPATCH;
va.pdispVal = r.m_lpDispatch;
m_pMap->RefreshRect( r );

CMoParts parts = pPolygon->GetParts();//&Egrave;&iexcl;&micro;&Atilde;&Iuml;&szlig;&micro;&Auml;&sup2;&iquest;·&Ouml;
CMoPoints pts;
//CMoPoints points;
m_selPolygonRecSet.Edit();
if( m_selVertex >= 0 )
{
for (int i = 0 ; i < parts.GetCount() ; i++ )
{
pts = parts.Item( COleVariant(short( i )) );//&Egrave;&iexcl;&micro;&Atilde;&cedil;&Atilde;&sup2;&iquest;·&Ouml;&micro;&Auml;&micro;&atilde;&frac14;&macr;&ordm;&Iuml;
if( pts.GetCount() == 3 )
continue ;
for (int j = 0 ; j < pts.GetCount() ; j++ )
{
if( m_partNO == i && m_selVertex == j )
{
pts.Remove( j );
m_selVertex = j - 1;
ptAgainSelect = pts.Item( COleVariant(short( j - 1 ) ));
//m_curOperator = DelVertex ;
//m_partNO = -1 ;
//m_selVertex = -1 ;
break;
}
}
}
}

            r = pPolygon->GetExtent();
VariantInit(&va);
va.vt = VT_DISPATCH;
va.pdispVal = r.m_lpDispatch;
m_pMap->RefreshRect( r );

VariantInit(&va);
va.vt = VT_DISPATCH;
va.pdispVal = pPolygon->m_lpDispatch;
stateShapeField.Set_Value( va );
m_selPolygonRecSet.Update();
m_selPolygonRecSet.StopEditing();

delete pPolygon ;
m_selPolygonRecSet.MoveNext();
SelectObject( ptAgainSelect , true );
}
}
}

举报 回复(0) 喜欢(0)     评分
gis1117
  • 注册日期
  • 发帖数
  • QQ
  • 铜币
  • 威望
  • 贡献值
  • 银元
4楼#
发布于:2004-01-10 09:21
能加上点说明就更好了
举报 回复(0) 喜欢(0)     评分
aicai
路人甲
路人甲
  • 注册日期2003-11-18
  • 发帖数191
  • QQ
  • 铜币740枚
  • 威望0点
  • 贡献值0点
  • 银元0个
5楼#
发布于:2004-01-10 21:15
Sorry , 说明不知怎么了变成乱码了!
不过可以从函数的名字中得到启示!
有特别需要的朋友给我联系,我尽早回复你!!
举报 回复(0) 喜欢(0)     评分
sjf_2003
路人甲
路人甲
  • 注册日期2003-12-05
  • 发帖数145
  • QQ
  • 铜币165枚
  • 威望0点
  • 贡献值0点
  • 银元0个
6楼#
发布于:2004-01-11 00:11
好,谢谢了
举报 回复(0) 喜欢(0)     评分
sutiany
路人甲
路人甲
  • 注册日期2003-10-15
  • 发帖数114
  • QQ
  • 铜币0枚
  • 威望0点
  • 贡献值0点
  • 银元0个
7楼#
发布于:2004-06-21 19:24
还有我。sutiany@sina.com
举报 回复(0) 喜欢(0)     评分
ypyan
路人甲
路人甲
  • 注册日期2004-06-28
  • 发帖数7
  • QQ
  • 铜币132枚
  • 威望0点
  • 贡献值0点
  • 银元0个
8楼#
发布于:2004-06-28 21:50
我也想要一份。please <a href="mailtmail target="_blank" >mail to :ypyan@sohu.com</A>    <a href="mailtthanks.qq:19774800,mail:ypyan@sohu.com" target="_blank" ><FONT color=#000000>。     </FONT>thanks. qq:19774800,</A>
举报 回复(0) 喜欢(0)     评分
ypyan
路人甲
路人甲
  • 注册日期2004-06-28
  • 发帖数7
  • QQ
  • 铜币132枚
  • 威望0点
  • 贡献值0点
  • 银元0个
9楼#
发布于:2004-06-28 21:58
<P>我也想要一份有注释的代码,能发给我吗!</P><P>先谢谢</P><P><a href="mailtypyan@sohu.com" target="_blank" >ypyan@sohu.com</A></P>
举报 回复(0) 喜欢(0)     评分
上一页
游客

返回顶部