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
}