📄 sampledlg.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 + -