www.pudn.com > AddFeature1.rar > addfeatureDlg.cpp


// addfeatureDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "addfeature.h" 
#include "addfeatureDlg.h" 
 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CAboutDlg dialog used for App About 
 
class CAboutDlg : public CDialog 
{ 
public: 
	CAboutDlg(); 
 
// Dialog Data 
	//{{AFX_DATA(CAboutDlg) 
	enum { IDD = IDD_ABOUTBOX }; 
	//}}AFX_DATA 
 
	// ClassWizard generated virtual function overrides 
	//{{AFX_VIRTUAL(CAboutDlg) 
	protected: 
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support 
	//}}AFX_VIRTUAL 
 
// Implementation 
protected: 
	//{{AFX_MSG(CAboutDlg) 
	//}}AFX_MSG 
	DECLARE_MESSAGE_MAP() 
}; 
 
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 
{ 
	//{{AFX_DATA_INIT(CAboutDlg) 
	//}}AFX_DATA_INIT 
} 
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAboutDlg) 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
	//{{AFX_MSG_MAP(CAboutDlg) 
		// No message handlers 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CAddfeatureDlg dialog 
 
CAddfeatureDlg::CAddfeatureDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CAddfeatureDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CAddfeatureDlg) 
		// NOTE: the ClassWizard will add member initialization here 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
	//myMap.SetGeoSet(); 
 
} 
 
void CAddfeatureDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAddfeatureDlg) 
		// NOTE: the ClassWizard will add DDX and DDV calls here 
	//}}AFX_DATA_MAP 
	DDX_Control(pDX, IDC_MAP, myMap); 
 
} 
 
BEGIN_MESSAGE_MAP(CAddfeatureDlg, CDialog) 
	//{{AFX_MSG_MAP(CAddfeatureDlg) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CAddfeatureDlg message handlers 
 
BOOL CAddfeatureDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
 
	// Add "About..." menu item to system menu. 
 
	// IDM_ABOUTBOX must be in the system command range. 
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
	ASSERT(IDM_ABOUTBOX < 0xF000); 
 
	CMenu* pSysMenu = GetSystemMenu(FALSE); 
	if (pSysMenu != NULL) 
	{ 
		CString strAboutMenu; 
		strAboutMenu.LoadString(IDS_ABOUTBOX); 
		if (!strAboutMenu.IsEmpty()) 
		{ 
			pSysMenu->AppendMenu(MF_SEPARATOR); 
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
		} 
	} 
 
	// Set the icon for this dialog.  The framework does this automatically 
	//  when the application's main window is not a dialog 
	SetIcon(m_hIcon, TRUE);			// Set big icon 
	SetIcon(m_hIcon, FALSE);		// Set small icon 
	 
	// TODO: Add extra initialization here 
	 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
void CAddfeatureDlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
	if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
	{ 
		CAboutDlg dlgAbout; 
		dlgAbout.DoModal(); 
	} 
	else 
	{ 
		CDialog::OnSysCommand(nID, lParam); 
	} 
} 
 
// If you add a minimize button to your dialog, you will need the code below 
//  to draw the icon.  For MFC applications using the document/view model, 
//  this is automatically done for you by the framework. 
 
void CAddfeatureDlg::OnPaint()  
{ 
	if (IsIconic()) 
	{ 
		CPaintDC dc(this); // device context for painting 
 
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 
 
		// Center icon in client rectangle 
		int cxIcon = GetSystemMetrics(SM_CXICON); 
		int cyIcon = GetSystemMetrics(SM_CYICON); 
		CRect rect; 
		GetClientRect(&rect); 
		int x = (rect.Width() - cxIcon + 1) / 2; 
		int y = (rect.Height() - cyIcon + 1) / 2; 
 
		// Draw the icon 
		dc.DrawIcon(x, y, m_hIcon); 
	} 
	else 
	{ 
		CDialog::OnPaint(); 
	} 
} 
 
// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR CAddfeatureDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
void CAddfeatureDlg::OnOK()  
{ 
	// TODO: Add extra validation here 
	 
	//CDialog::OnOK(); 
	 
	 
    try   
     { 
			CMapXLayerInfo oLayerInfo ; //定义一个新的层信息 
			CMapXFields oFlds  ; //定义新层中的数据域 
			CMapXLayer oLayer; 
			CMapXRectangle rect; 
 
			//设置地图边界 
 
			if(!rect.CreateDispatch(rect.GetClsid())) { 
			  TRACE0("Could not Create rectangle object"); 
			  return; 
			 } 
 
			rect.Set(0,0,200,200); 
			myMap.SetBounds(rect); 
 
 
			if (!oFlds.CreateDispatch(oFlds.GetClsid())) //初始化对象 
			{ 
				TRACE0("Failed to Create Fields collection"); 
				return; 
			} 
			if (!oLayerInfo.CreateDispatch(oLayerInfo.GetClsid())) 
			{ 
				TRACE0("Failed to Create Fields collection"); 
				return; 
			} 
 
 
			//添加新层 
 
			//创建字段 
			 VARIANT FieldName;                     //字段名称  
			 FieldName.vt = VT_BSTR; 
 
			 CString csTmp;         //中文字段名称 
			 LPCTSTR lcsTmp; 
			 csTmp = _T("field1"); 
			 lcsTmp = (LPCTSTR)csTmp; 
			 oFlds.AddIntegerField(lcsTmp,false);  
			 csTmp = _T("field2"); 
			 lcsTmp = (LPCTSTR)csTmp; 
			 oFlds.AddIntegerField(lcsTmp,false);  
			 csTmp = _T("field3"); 
			 lcsTmp = (LPCTSTR)csTmp; 
			 oFlds.AddIntegerField(lcsTmp,false);  
			 csTmp = _T("field4"); 
			 lcsTmp = (LPCTSTR)csTmp; 
			 oFlds.AddIntegerField(lcsTmp,false);  
			 csTmp = _T("field5"); 
			 lcsTmp = (LPCTSTR)csTmp; 
			 oFlds.AddIntegerField(lcsTmp,false);  
			 csTmp = _T("field6"); 
			 lcsTmp = (LPCTSTR)csTmp; 
			 oFlds.AddIntegerField(lcsTmp,false);  
			 csTmp = _T("field7"); 
			 lcsTmp = (LPCTSTR)csTmp; 
			 oFlds.AddIntegerField(lcsTmp,false);  
			 csTmp = _T("field8"); 
			 lcsTmp = (LPCTSTR)csTmp; 
			 oFlds.AddIntegerField(lcsTmp,false);  
			 csTmp = _T("field9"); 
			 lcsTmp = (LPCTSTR)csTmp; 
			 oFlds.AddIntegerField(lcsTmp,false);  
			 csTmp = _T("field10"); 
			 lcsTmp = (LPCTSTR)csTmp; 
			 oFlds.AddIntegerField(lcsTmp,false);  
 
 
			 //VARIANT FieldLength;                  //字段长度 
			 //FieldLength.vt=VT_I2; 
			 //FieldLength.iVal =30; 
			 //long iwidth = 30; 
			 //Flds.AddStringField(lcsTmp,iwidth,false);  
 
			 VARIANT vFlds; 
			 vFlds.vt = VT_DISPATCH; 
			 vFlds.pdispVal = oFlds.m_lpDispatch; 
 
			//创建临时图层 
			 if (true){ 
					//临时图层 
					oLayerInfo.SetType(miLayerInfoTypeTemp);		//表类型 --临时表 
					oLayerInfo.AddParameter("Name", COleVariant("temp")); 
					oLayerInfo.AddParameter("FileSpec", COleVariant("e:\\temp\\temp.TAB")); //Tab file 
					oLayerInfo.AddParameter("Fields", vFlds); //Fields 
					oLayerInfo.AddParameter("OverwriteFile", COleVariant("1"));  
					oLayerInfo.AddParameter ("TableStorageType", COleVariant("MemTable")); 
					//oLayerInfo.AddParameter ("TableStorageType", COleVariant("Native")); 
			 }else{ 
 
 
					//存放于文件中 
					oLayerInfo.SetType(miLayerInfoTypeNewTable);    //本地表 
					oLayerInfo.AddParameter("Name", COleVariant("temp")); 
					oLayerInfo.AddParameter("FileSpec", COleVariant("e:\\temp\\temp.TAB")); //Tab file 
					oLayerInfo.AddParameter("Fields", vFlds); //Fields 
					oLayerInfo.AddParameter("OverwriteFile", COleVariant("1"));  
			 } 
			 
			oLayer =  myMap.GetLayers().Add(oLayerInfo.m_lpDispatch); 
 
			//添加图元 
			 CMapXFeature ftr; 
			 CMapXPoint pnt; 
			 COleVariant pntVt; 
			 COleVariant styleVt; 
			 CMapXRowValues	rvs; 
			 CMapXRowValue	rv; 
			 VARIANT var; 
 
				if(!rvs.CreateDispatch(rvs.GetClsid())) 
				{ 
					TRACE0("Failed to create RowValues object"); 
				} 
				if(!rv.CreateDispatch(rv.GetClsid())) 
				{ 
					TRACE0("Failed to create RowValue object"); 
				} 
			 if(!pnt.CreateDispatch(pnt.GetClsid())) { 
				  TRACE0("Failed to Create Point object"); 
				  return; 
			 } 
 
			COleVariant layerVt; 
			layerVt.vt = VT_DISPATCH; 
			layerVt.pdispVal = oLayer.m_lpDispatch; 
			layerVt.pdispVal->AddRef();	//Dispatch的调用规范 
 
			 CMapXDataset ods = myMap.GetDatasets().Add(miDataSetLayer, layerVt,oLayer.GetName()); 
 
 
		  styleVt.vt = VT_DISPATCH; 
		  styleVt.pdispVal = myMap.GetDefaultStyle().m_lpDispatch; 
		  styleVt.pdispVal->AddRef(); 
 
			SYSTEMTIME sc; 
			GetSystemTime(&sc); 
			TRACE("Begin Add %d:%d.%d\n", sc.wMinute, sc.wSecond, sc.wMilliseconds); 
 
			int i,j; 
 
			for(i=0;i<40;i++){ 
 
				for(j=0;j<40;j++){ 
					 
					//创建图形信息 
					  pnt.Set(5+ i * 190/40,5 + j* 190/40); 
  
					  pntVt.vt = VT_DISPATCH; 
					  pntVt.pdispVal = pnt.m_lpDispatch; 
					  pntVt.pdispVal->AddRef(); 
 
					  // Create a text feature and add it to layer 1 
 
					  ftr = myMap.GetLayers().Item(1).AddFeature(myMap.GetFeatureFactory().CreateSymbol(pntVt,styleVt)); 
 
					//添加属性值 
						rv.SetDataset(ods); 
 
						rv.SetField(ods.GetFields().Item(1)); 
						var.vt	= VT_INT; 
						var.intVal	= i + j +1; 
						rv.SetValue(var); 
						rvs.Add(rv); 
						rv.SetField(ods.GetFields().Item(2)); 
						var.vt	= VT_INT; 
						var.intVal	= i + j +2; 
						rv.SetValue(var); 
						rvs.Add(rv); 
						rv.SetField(ods.GetFields().Item(3)); 
						var.vt	= VT_INT; 
						var.intVal	= i + j +3; 
						rv.SetValue(var); 
						rvs.Add(rv); 
						rv.SetField(ods.GetFields().Item(4)); 
						var.vt	= VT_INT; 
						var.intVal	= i + j +4; 
						rv.SetValue(var); 
						rvs.Add(rv); 
						rv.SetField(ods.GetFields().Item(5)); 
						var.vt	= VT_INT; 
						var.intVal	= i + j +5; 
						rv.SetValue(var); 
						rvs.Add(rv); 
						rv.SetField(ods.GetFields().Item(6)); 
						var.vt	= VT_INT; 
						var.intVal	= i + j +6; 
						rv.SetValue(var); 
						rvs.Add(rv); 
						rv.SetField(ods.GetFields().Item(7)); 
						var.vt	= VT_INT; 
						var.intVal	= i + j +7; 
						rv.SetValue(var); 
						rvs.Add(rv); 
						rv.SetField(ods.GetFields().Item(8)); 
						var.vt	= VT_INT; 
						var.intVal	= i + j +8; 
						rv.SetValue(var); 
						rvs.Add(rv); 
						rv.SetField(ods.GetFields().Item(9)); 
						var.vt	= VT_INT; 
						var.intVal	= i + j +9; 
						rv.SetValue(var); 
						rvs.Add(rv); 
						rv.SetField(ods.GetFields().Item(10)); 
						var.vt	= VT_INT; 
						var.intVal	= i + j +10; 
						rv.SetValue(var); 
						rvs.Add(rv); 
 
 
					  oLayer.AddFeature(ftr,rvs); 
					  rvs.RemoveAll(); 
				} 
			} 
 
 
 
			//输出调试时间信息 
			long m,s,ms; 
			m = sc.wMinute ; 
			s = sc.wSecond; 
			ms = sc.wMilliseconds; 
 
			GetSystemTime(&sc); 
 
			long m1,s1,ms1; 
			m1 = sc.wMinute ; 
			s1 = sc.wSecond; 
			ms1 = sc.wMilliseconds; 
 
			TRACE("End Add %d:%d.%d\n", sc.wMinute, sc.wSecond, sc.wMilliseconds); 
			TRACE("Add %d Points Use Time %d milliseconds\n",i*j, (m1-m) * 60 * 1000 + (s1-s)*1000 + ms1-ms); 
			TRACE("Add one Points Use average Time %d milliseconds\n", ((m1-m) * 60 * 1000 + (s1-s)*1000 + ms1-ms)/i/j); 
			CString utime; 
			utime.Format(_T("%d"),((m1-m) * 60 * 1000 + (s1-s)*1000 + ms1-ms)/i/j); 
			MessageBox("时间:" + utime); 
 
 
	 } catch(COleDispatchException* e) { 
	  e->ReportError(); 
	  e->Delete(); 
	 } catch(COleException* e) { 
	  e->ReportError(); 
	  e->Delete(); 
	 } 
 
} 
 
BEGIN_EVENTSINK_MAP(CAddfeatureDlg, CDialog) 
    //{{AFX_EVENTSINK_MAP(CAddfeatureDlg) 
	ON_EVENT(CAddfeatureDlg, IDC_MAP, -600 /* Click */, OnClickMap, VTS_NONE) 
	//}}AFX_EVENTSINK_MAP 
END_EVENTSINK_MAP() 
 
void CAddfeatureDlg::OnClickMap()  
{ 
	// TODO: Add your control notification handler code here 
	 
}