⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sampledlg.cpp

📁 需要先下载安装mapx
💻 CPP
字号:
// SampleDlg.cpp : implementation file
//
/* 
 * This sample application and corresponding sample code is provided 
 * for example purposes only.  It has not undergone rigorous testing
 * and as such should not be shipped as part of a final application
 * without extensive testing on the part of the organization releasing
 * the end-user product.
 */

#include "stdafx.h"
#include "mapxsamp.h"
#include "SampleDlg.h"

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


#define MYTOOL_SYMBOL 1
#define MYTOOL_LINE 2
#define MYTOOL_REGION 3
#define MYTOOL_TEXT 4
/////////////////////////////////////////////////////////////////////////////
// CSampleDlg dialog


CSampleDlg::CSampleDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CSampleDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CSampleDlg)
	m_strX = _T("");
	m_strY = _T("");
	//}}AFX_DATA_INIT
}


void CSampleDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSampleDlg)
	DDX_Control(pDX, IDC_TOOLS, m_lbTools);
	DDX_Text(pDX, IDC_STATICX, m_strX);
	DDX_Text(pDX, IDC_STATICY, m_strY);
	//}}AFX_DATA_MAP

	DDX_Control(pDX, IDC_MAP1, m_ctrlMapX);
}


BEGIN_MESSAGE_MAP(CSampleDlg, CDialog)
	//{{AFX_MSG_MAP(CSampleDlg)
	ON_LBN_SELCHANGE(IDC_TOOLS, OnSelchangeTools)
	ON_BN_CLICKED(IDC_DELETE, OnDelete)
	ON_BN_CLICKED(IDC_DELETEALL, OnDeleteall)
	ON_BN_CLICKED(IDC_STYLE, OnStyle)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSampleDlg message handlers

BEGIN_EVENTSINK_MAP(CSampleDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CSampleDlg)
	ON_EVENT(CSampleDlg, IDC_MAP1, 3 /* ToolUsed */, OnToolUsedMap1, VTS_I2 VTS_R8 VTS_R8 VTS_R8 VTS_R8 VTS_R8 VTS_BOOL VTS_BOOL VTS_PBOOL)
	ON_EVENT(CSampleDlg, IDC_MAP1, 11 /* PolyToolUsed */, OnPolyToolUsedMap1, VTS_I2 VTS_I4 VTS_DISPATCH VTS_BOOL VTS_BOOL VTS_PBOOL)
	ON_EVENT(CSampleDlg, IDC_MAP1, -606 /* MouseMove */, OnMouseMoveMap1, VTS_I2 VTS_I2 VTS_R4 VTS_R4)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CSampleDlg::OnMouseMoveMap1(short Button, short Shift, float X, float Y) 
{
	try {
		float ScreenX = X;
		float ScreenY = Y;
		double MapX, MapY;
		CString str;

		m_ctrlMapX.ConvertCoord(&ScreenX, &ScreenY, &MapX, &MapY, miScreenToMap);
		str.Format("%2.4f", MapX);
		GetDlgItem(IDC_STATICX)->SetWindowText(str);
		str.Format("%2.4f", MapY);
		GetDlgItem(IDC_STATICY)->SetWindowText(str);
	}
	catch (COleDispatchException *e) {
		e->ReportError();
		e->Delete();
	}
	catch (COleException *e) {
		e->ReportError();
		e->Delete();
	}
	
}

BOOL CSampleDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();

	try {
		m_ctrlMapX.SetZoom(1000);	// zoom in to 1000 miles

		// create temporary layer on top for drawing on.
		CMapXLayer layer = m_ctrlMapX.GetLayers().CreateLayer("scratch layer",NULL,1);
		
		// make it the animation layer
		m_ctrlMapX.GetLayers().SetAnimationLayer(layer);

		// create somke custom tools for object drawing
		m_ctrlMapX.CreateCustomTool(MYTOOL_SYMBOL, miToolTypePoint, miCrossCursor);
		m_ctrlMapX.CreateCustomTool(MYTOOL_LINE, miToolTypePoly, miCrossCursor);
		m_ctrlMapX.CreateCustomTool(MYTOOL_REGION, miToolTypePoly, miCrossCursor);
		m_ctrlMapX.CreateCustomTool(MYTOOL_TEXT, miToolTypePoint, miIBeamCursor);

		m_ctrlMapX.SetCurrentTool(miArrowTool);
	}
	catch (COleDispatchException *e) {
		e->ReportError();
		e->Delete();
	}
	catch (COleException *e) {
		e->ReportError();
		e->Delete();
	}

	// add tools to the listbox
	// use itemdata for toolnumber
	int n;
	n = m_lbTools.AddString("Arrow");
	m_lbTools.SetItemData(n, miArrowTool);

	n = m_lbTools.AddString("Select");
	m_lbTools.SetItemData(n, miSelectTool);

	n = m_lbTools.AddString("Rect. Select");
	m_lbTools.SetItemData(n, miRectSelectTool);

	n = m_lbTools.AddString("Zoom In");
	m_lbTools.SetItemData(n, miZoomInTool);

	n = m_lbTools.AddString("Zoom Out");
	m_lbTools.SetItemData(n, miZoomOutTool);

	n = m_lbTools.AddString("Symbol");
	m_lbTools.SetItemData(n, MYTOOL_SYMBOL);

	n = m_lbTools.AddString("Line");
	m_lbTools.SetItemData(n, MYTOOL_LINE);

	n = m_lbTools.AddString("Region");
	m_lbTools.SetItemData(n, MYTOOL_REGION);

	n = m_lbTools.AddString("Text");
	m_lbTools.SetItemData(n, MYTOOL_TEXT);

	m_lbTools.SetCurSel(0);

	CWnd* featureText = GetDlgItem(IDC_TEXTBOX);
	if(featureText != NULL)
		featureText->SetWindowText("Text");

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CSampleDlg::OnSelchangeTools() 
{
	try {
		int n = m_lbTools.GetCurSel();
		DWORD dw  = miArrowTool;
		if (n != LB_ERR) {
			dw = m_lbTools.GetItemData(n);
		}
		m_ctrlMapX.SetCurrentTool(dw);
	}
	catch (COleDispatchException *e) {
		e->ReportError();
		e->Delete();
	}
	catch (COleException *e) {
		e->ReportError();
		e->Delete();
	}
}

void CSampleDlg::OnDelete() 
{
	try {
		CMapXLayer layer = m_ctrlMapX.GetLayers().Item("scratch layer");
		CMapXSelection sel = layer.GetSelection();
		CMapXFeature f;
		int n = sel.GetCount();
		for (int i=1;i<=n;i++) {
			f = sel.Item(i);
			layer.DeleteFeature(f);
		}
	}
	catch (COleDispatchException *e) {
		e->ReportError();
		e->Delete();
	}
	catch (COleException *e) {
		e->ReportError();
		e->Delete();
	}
	
}

void CSampleDlg::OnDeleteall() 
{
	try {
		CMapXLayer layer = m_ctrlMapX.GetLayers().Item("scratch layer");
		CMapXFeatures fs = layer.AllFeatures();
		CMapXFeature f;
		int n = fs.GetCount();
		for (int i=1;i<=n;i++) {
			f = fs.Item(i);
			layer.DeleteFeature(f);
		}
	}
	catch (COleDispatchException *e) {
		e->ReportError();
		e->Delete();
	}
	catch (COleException *e) {
		e->ReportError();
		e->Delete();
	}
}

// we will put up a style picker based on the style of the first item
// in the selection, then we will apply the style to all selected features
// of the same type
void CSampleDlg::OnStyle() 
{
	try {
		CMapXLayer layer = m_ctrlMapX.GetLayers().Item("scratch layer");
		CMapXSelection sel = layer.GetSelection();
		CMapXFeature f1, f;

		int n = sel.GetCount();
		if (n <= 0) {
			return;
		}
		// set style of first feature in list
		f1 = sel.Item(1);
		short nType = f1.GetType();
		BOOL bOK = FALSE;
		switch(nType) {
		case miFeatureTypeSymbol:
			bOK = f1.GetStyle().PickSymbol();
			break;
		case miFeatureTypeLine:
			bOK = f1.GetStyle().PickLine();
			break;
		case miFeatureTypeRegion:
			bOK = f1.GetStyle().PickRegion();
			break;
		case miFeatureTypeText:
			bOK = f1.GetStyle().PickText();
			break;
		default:
			return; // unknown feature type
		}
		if (!bOK) { // user cancelled
			return;
		}
		// update first feature
		f1.Update();

		for (int i=2;i<=n;i++) {
			f = sel.Item(i);
			if (f.GetType() == nType) {
				f.SetStyle(f1.GetStyle());
				f.Update();
			}
		}
	}
	catch (COleDispatchException *e) {
		e->ReportError();
		e->Delete();
	}
	catch (COleException *e) {
		e->ReportError();
		e->Delete();
	}
	
}

void CSampleDlg::OnToolUsedMap1(short ToolNum, double X1, double Y1, double X2, double Y2, double Distance, BOOL Shift, BOOL Ctrl, BOOL FAR* EnableDefault) 
{
	if (ToolNum == MYTOOL_SYMBOL || ToolNum == MYTOOL_TEXT) {
		try {
			CMapXFeature f;
			// create a new symbol or text feature

			// first create the standalone feature object
			f.CreateDispatch(f.GetClsid());
			f.Attach(m_ctrlMapX.GetDispatch());

			if (ToolNum == MYTOOL_SYMBOL) {
				f.SetType(miFeatureTypeSymbol);
			}
			else {
				CWnd* featureText = GetDlgItem(IDC_TEXTBOX);
				CString newCaption;
				if(featureText != NULL)
					featureText->GetWindowText(newCaption);
				if(newCaption == "")
					newCaption = "Text";
				f.SetType(miFeatureTypeText);
				f.SetCaption(newCaption);
			}
			// set the style and location of the feature
			f.SetStyle(m_ctrlMapX.GetDefaultStyle());
			f.GetPoint().Set(X1,Y1);
		
			// now add it to our layer
			CMapXLayer layer = m_ctrlMapX.GetLayers().Item("scratch layer");
			layer.AddFeature (f);
		}
		catch (COleDispatchException *e) {
			e->ReportError();
			e->Delete();
		}
		catch (COleException *e) {
			e->ReportError();
			e->Delete();
		}
	}
}

void CSampleDlg::OnPolyToolUsedMap1(short ToolNum, long Flags, LPDISPATCH Points, BOOL bShift, BOOL bCtrl, BOOL FAR* EnableDefault) 
{
	CMapXFeature f;
	if (Flags == miPolyToolEnd) {
		try {
			// create a new polygon or polyline
			f.CreateDispatch(f.GetClsid());
			f.Attach(m_ctrlMapX.GetDispatch());

			if (ToolNum == MYTOOL_REGION) {
				f.SetType(miFeatureTypeRegion);
			}
			else {
				f.SetType(miFeatureTypeLine);
			}
			f.SetStyle(m_ctrlMapX.GetDefaultStyle());
			f.GetParts().Add(Points);
		
			CMapXLayer layer = m_ctrlMapX.GetLayers().Item("scratch layer");
			layer.AddFeature (f);
		}
		catch (COleDispatchException *e) {
			e->ReportError();
			e->Delete();
		}
		catch (COleException *e) {
			e->ReportError();
			e->Delete();
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -