📄 mapview.cpp
字号:
// MapView.cpp : implementation of the CMapView class
//
#include "stdafx.h"
#include "MapDemo.h"
#include "MapDemoDoc.h"
#include "MapView.h"
#include "MapFormView.h"
#include "MainFrm.h"
#include "GeoSetDlg.h"
#include "MapXSetDlg.h"
#include "SelDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define IDC_MAP 100
#define MYTOOL_INFO 1
#define MYTOOL_DISTANCE 2
/////////////////////////////////////////////////////////////////////////////
// CMapView
IMPLEMENT_DYNCREATE(CMapView, CView)
BEGIN_MESSAGE_MAP(CMapView, CView)
//{{AFX_MSG_MAP(CMapView)
ON_WM_SIZE()
ON_WM_CREATE()
ON_COMMAND(ID_FILE_OPENGEOSET, OnFileOpengeoset)
ON_COMMAND(ID_VIEW_SYSOPTION, OnViewSysoption)
ON_COMMAND(ID_MAP_TOOL_SELECT, OnMapToolSelect)
ON_COMMAND(ID_MAP_TOOL_ZOOMIN, OnMapToolZoomin)
ON_COMMAND(ID_MAP_TOOL_ZOOMOUT, OnMapToolZoomout)
ON_COMMAND(ID_MAP_TOOL_PAN, OnMapToolPan)
ON_COMMAND(ID_MAP_TOOL_RADIUSSELECT, OnMapToolRadiusselect)
ON_COMMAND(ID_MAP_TOOL_RECTANGLESELECT, OnMapToolRectangleselect)
ON_COMMAND(ID_MAP_TOOL_INFORMATION, OnMapToolInformation)
ON_COMMAND(ID_VIEW_LAYERCONTROL, OnViewLayercontrol)
ON_COMMAND(ID_VIEW_SCALEBAR, OnViewScalebar)
ON_UPDATE_COMMAND_UI(ID_VIEW_SCALEBAR, OnUpdateViewScalebar)
ON_COMMAND(ID_TOOL_UNSELECTALL, OnToolUnselectall)
ON_COMMAND(ID_MAPEDIT_SELETTABLE, OnMapeditSelettable)
ON_COMMAND(ID_MAPEDIT_ADDTEXT, OnMapeditAddtext)
ON_COMMAND(ID_MAPEDIT_ADDSYMBOL, OnMapeditAddsymbol)
ON_UPDATE_COMMAND_UI(ID_MAPEDIT_ADDTEXT, OnUpdateMapeditAddtext)
ON_UPDATE_COMMAND_UI(ID_MAPEDIT_ADDSYMBOL, OnUpdateMapeditAddsymbol)
ON_COMMAND(ID_MAPEDIT_ADDLINE, OnMapeditAddline)
ON_UPDATE_COMMAND_UI(ID_MAPEDIT_ADDLINE, OnUpdateMapeditAddline)
ON_COMMAND(ID_MAPEDIT_ADDPOLYGON, OnMapeditAddpolygon)
ON_UPDATE_COMMAND_UI(ID_MAPEDIT_ADDPOLYGON, OnUpdateMapeditAddpolygon)
ON_COMMAND(ID_MAPEDIT_ADDRECT, OnMapeditAddrect)
ON_UPDATE_COMMAND_UI(ID_MAPEDIT_ADDRECT, OnUpdateMapeditAddrect)
ON_COMMAND(ID_MAPEDIT_ADDEPPLISE, OnMapeditAddepplise)
ON_UPDATE_COMMAND_UI(ID_MAPEDIT_ADDEPPLISE, OnUpdateMapeditAddepplise)
ON_COMMAND(IDD_MAPEDIT_ADDARC, OnMapeditAddarc)
ON_UPDATE_COMMAND_UI(IDD_MAPEDIT_ADDARC, OnUpdateMapeditAddarc)
ON_WM_DESTROY()
ON_COMMAND(ID_ADD_TARGET, OnAddTarget)
ON_COMMAND(ID_EDIT_TARGET, OnEditTarget)
ON_COMMAND(ID_START_GPS, OnStartGps)
ON_UPDATE_COMMAND_UI(ID_START_GPS, OnUpdateStartGps)
ON_COMMAND(ID_END_GPS, OnEndGps)
ON_UPDATE_COMMAND_UI(ID_END_GPS, OnUpdateEndGps)
ON_UPDATE_COMMAND_UI(ID_ADD_TARGET, OnUpdateAddTarget)
ON_UPDATE_COMMAND_UI(ID_EDIT_TARGET, OnUpdateEditTarget)
ON_COMMAND(ID_GPS_CHANGESYMBOL, OnGpsChangesymbol)
ON_UPDATE_COMMAND_UI(ID_GPS_CHANGESYMBOL, OnUpdateGpsChangesymbol)
ON_WM_TIMER()
ON_COMMAND(ID_CHANGE_SYMBOL, OnChangeSymbol)
ON_UPDATE_COMMAND_UI(ID_CHANGE_SYMBOL, OnUpdateChangeSymbol)
ON_COMMAND(ID_LINE_CHANGE, OnLineChange)
ON_COMMAND(ID_REAGION_CHANGE, OnReagionChange)
ON_COMMAND(ID_MAPX_PROPERTY, OnMapxProperty)
ON_COMMAND(ID_DATABIND_NORMAL, OnDatabindNormal)
ON_UPDATE_COMMAND_UI(ID_DATABIND_NORMAL, OnUpdateDatabindNormal)
ON_COMMAND(ID_BINDDATA_ODBC, OnBinddataOdbc)
ON_UPDATE_COMMAND_UI(ID_BINDDATA_ODBC, OnUpdateBinddataOdbc)
ON_COMMAND(ID_BINDDATA_ARRAY, OnBinddataArray)
ON_UPDATE_COMMAND_UI(ID_BINDDATA_ARRAY, OnUpdateBinddataArray)
ON_COMMAND(ID_BINDDATA_NOBIND, OnBinddataNobind)
ON_UPDATE_COMMAND_UI(ID_BINDDATA_NOBIND, OnUpdateBinddataNobind)
ON_COMMAND(ID_THEME_REANGE, OnThemeReange)
ON_UPDATE_COMMAND_UI(ID_THEME_REANGE, OnUpdateThemeReange)
ON_COMMAND(ID_THEME_DOT, OnThemeDot)
ON_UPDATE_COMMAND_UI(ID_THEME_DOT, OnUpdateThemeDot)
ON_COMMAND(ID_THEME_PIE, OnThemePie)
ON_UPDATE_COMMAND_UI(ID_THEME_PIE, OnUpdateThemePie)
ON_COMMAND(ID_THEME_SYMBOL, OnThemeSymbol)
ON_UPDATE_COMMAND_UI(ID_THEME_SYMBOL, OnUpdateThemeSymbol)
ON_COMMAND(ID_THEME_INDIV, OnThemeIndiv)
ON_UPDATE_COMMAND_UI(ID_THEME_INDIV, OnUpdateThemeIndiv)
ON_COMMAND(ID_THEME_BAR, OnThemeBar)
ON_UPDATE_COMMAND_UI(ID_THEME_BAR, OnUpdateThemeBar)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
////////////////////////////////////////////////////////
//MapX事件响应函数
//使用用户自定义图层
BEGIN_EVENTSINK_MAP(CMapView, CView)
ON_EVENT(CMapView, IDC_MAP, MAPX_DISPID_DRAWUSERLAYER, OnDrawUserLayer, VTS_DISPATCH VTS_I4 VTS_I4 VTS_DISPATCH VTS_DISPATCH)
ON_EVENT(CMapView, IDC_MAP, MAPX_DISPID_TOOLUSED, OnToolUsed, VTS_I2 VTS_R8 VTS_R8 VTS_R8 VTS_R8 VTS_R8 VTS_BOOL VTS_BOOL VTS_PBOOL)
ON_EVENT(CMapView, IDC_MAP, MAPX_DISPID_POLYTOOLUSED, OnPolyToolUsedMap, VTS_I2 VTS_I4 VTS_DISPATCH VTS_BOOL VTS_BOOL VTS_PBOOL)
ON_EVENT(CMapView, IDC_MAP, -605 /* MouseDown */, OnMouseDownMap, VTS_I2 VTS_I2 VTS_R4 VTS_R4)
ON_EVENT(CMapView, IDC_MAP, DISPID_MOUSEUP, OnMouseUpInMap, VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
ON_EVENT(CMapView, IDC_MAP, DISPID_MOUSEMOVE, OnMouseMoveInMap, VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
END_EVENTSINK_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMapView construction/destruction
CMapView::CMapView()
{
m_dPrevZoom = 0;
m_dCurZoom = 0;
m_bScaleBar = FALSE;
//m_bODBCDynamic = FALSE;
m_strEditLayer="";
m_bIsStartGps=FALSE;
m_nGpsOperation=GPS_NOOPERATION;
m_bIsAutoLable=FALSE;
m_pTarget=NULL;
}
CMapView::~CMapView()
{
}
BOOL CMapView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CMapView drawing
void CMapView::OnDraw(CDC* pDC)
{
CMapDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CMapView printing
BOOL CMapView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CMapView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CMapView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CMapView diagnostics
#ifdef _DEBUG
void CMapView::AssertValid() const
{
CView::AssertValid();
}
void CMapView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CMapDemoDoc* CMapView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMapDemoDoc)));
return (CMapDemoDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMapView message handlers
void CMapView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
if (cx != 0 && cy != 0)
m_ctrlMapX.MoveWindow(0,0,cx,cy,TRUE);
}
BOOL CMapView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}
int CMapView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// 使用缺省尺寸创建一个地图
// 在OnSize函数里改变地图控件的大小,使之缩放到屏幕尺寸
m_ctrlMapX.Create(NULL, WS_VISIBLE, CRect(0,0,100,100), this, IDC_MAP);
// 创建距离工具
try {
// create some custom tools for object drawing
m_ctrlMapX.CreateCustomTool(MYTOOL_DISTANCE, miToolTypePoly, miCrossCursor);
m_ctrlMapX.CreateCustomTool(MYTOOL_INFO, miToolTypePoint, miCrossCursor);
//绘图工具
m_ctrlMapX.CreateCustomTool(CUSTOM_DRAW_TEXT_TOOL,miToolTypePoint,miCrossCursor);
m_ctrlMapX.CreateCustomTool(CUSTOM_DRAW_SYMBOL_TOOL,miToolTypePoint,miCrossCursor);
m_ctrlMapX.CreateCustomTool(CUSTOM_DRAW_LINE_TOOL,miToolTypeLine,miCrossCursor);
m_ctrlMapX.CreateCustomTool(CUSTOM_DRAW_ELLIPSE_TOOL,miToolTypeMarquee,miCrossCursor);
m_ctrlMapX.CreateCustomTool(CUSTOM_DRAW_RECT_TOOL,miToolTypeMarquee,miCrossCursor);
m_ctrlMapX.CreateCustomTool(CUSTOM_DRAW_REGION_TOOL,miToolTypePoly,miCrossCursor);
m_ctrlMapX.CreateCustomTool(CUSTOM_DRAW_ARC_TOOL,miToolTypeLine,miCrossCursor);
//GPS工具
m_ctrlMapX.CreateCustomTool(GPS_ADDTARGET,miToolTypePoint,miArrowCursor);
m_ctrlMapX.CreateCustomTool(GPS_EDITTARGET,miToolTypePoint,miArrowCursor);
}
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
SetTitleVisible(FALSE);
OnViewScalebar();
return 0;
}
void CMapView::NotifyQueryNewPalette()
{
// we don't care, but our embedded control might
m_ctrlMapX.SendMessage(WM_QUERYNEWPALETTE);
}
void CMapView::NotifyPaletteChanged(CWnd* pFocusWnd)
{
// we don't care, but our embedded control might
m_ctrlMapX.SendMessage(WM_PALETTECHANGED, (WPARAM)(pFocusWnd->m_hWnd));
}
void CMapView::OnFileOpengeoset()
{
CGeoSetDlg geoDlg(&m_ctrlMapX);
geoDlg.DoModal();
}
void CMapView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
}
void CMapView::OnViewSysoption()
{
MapXSetDlg dlg(&m_ctrlMapX);
dlg.DoModal();
}
void CMapView::OnMapToolSelect()
{
m_ctrlMapX.SetCurrentTool(miSelectTool);
}
void CMapView::OnMapToolZoomin()
{
m_ctrlMapX.SetCurrentTool(miZoomInTool);
}
void CMapView::OnMapToolZoomout()
{
m_ctrlMapX.SetCurrentTool(miZoomOutTool);
}
void CMapView::OnMapToolPan()
{
m_ctrlMapX.SetCurrentTool(miPanTool);
}
void CMapView::OnMapToolRadiusselect()
{
m_ctrlMapX.SetCurrentTool(miRadiusSelectTool);
}
void CMapView::OnMapToolRectangleselect()
{
m_ctrlMapX.SetCurrentTool(miRectSelectTool);
}
void CMapView::OnMapToolInformation()
{
m_ctrlMapX.SetCurrentTool(miRectSelectTool);
}
void CMapView::OnToolUnselectall()
{
CMapXLayers layers=m_ctrlMapX.GetLayers();
for(int i=0;i<layers.GetCount();i++)
{
CMapXLayer layer=layers.Item(i+1);
if(layer.GetSelectable())
{
CMapXSelection select=layer.GetSelection();
if(select.GetCount()>0)
select.ClearSelection();
}
}
}
// Draw the Scalebar layer whenever this event is called
// we could check the Layer.Name property if we needed to handle
// more than 1 user draw layer
void CMapView::OnDrawUserLayer(LPDISPATCH Layer, long hOutputDC, long hAttributeDC, LPDISPATCH RectFull, LPDISPATCH RectInvalid)
{
CDC dc;
dc.Attach((HDC)hOutputDC);
dc.SetAttribDC((HDC)hAttributeDC);
DrawScaleBar(&dc);
}
void CMapView::OnViewLayercontrol()
{
try {
VARIANT vHelpFile, vHelpID; // mark as optional since we don't have a helpfile
vHelpFile.vt = VT_ERROR;
vHelpFile.scode = DISP_E_PARAMNOTFOUND;
vHelpID.vt = VT_ERROR;
vHelpID.scode = DISP_E_PARAMNOTFOUND;
CMapXLayers layers = m_ctrlMapX.GetLayers();
layers.LayersDlg(vHelpFile, vHelpID);
}
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
}
//用户自定义图层绘制比例尺
void CMapView::OnViewScalebar()
{
try {
if(m_bScaleBar)
{
m_ctrlMapX.GetLayers().Remove("ScaleBar");
m_bScaleBar = FALSE;
}
else
{
m_ctrlMapX.GetLayers().AddUserDrawLayer("ScaleBar", 1);
m_bScaleBar = TRUE;
}
}
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
}
void CMapView::OnUpdateViewScalebar(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_bScaleBar);
}
void CMapView::DrawScaleBar(CDC *pDC)
{
float barWidth =(float)0.5, barHeight =(float)0.08;
float startX =(float).3, startY =(float).3;
long x1, y1;
int i;
// attach to dc that mapx passed us so we can use
// mfc CDC object. (we will detach before exiting this method
CPen pen;
CBrush brushRed, brushWhite, *pOldBrush;
CFont *pOldFont;
pen.CreatePen(0,1,(COLORREF)0);
brushRed.CreateSolidBrush(255);
brushWhite.CreateSolidBrush(16777215);
//Set map mode to HI-English
pDC->SetMapMode(MM_HIENGLISH);
//Set pen to black
CPen *pOldPen = pDC->SelectObject(&pen);
pOldBrush = pDC->SelectObject(&brushRed);
//convert to HiEnglish, Conversion needed because one HIENGLISH unit is .001 inch
x1=(long)(startX*1000);
y1=(long)(startY*1000);
barWidth*=1000;
barHeight*=1000;
for (i=0; i<=1; i++) {
long x2 =(long)(barWidth+x1);
long y2 =(long)(barHeight+y1);
/*** First Section ***/
if (i==0) {
pDC->SelectObject(&brushRed); //Red
}
else {
pDC->SelectObject(&brushWhite); //White
}
// with mapMode HIENGLISH, positive is x to the right, positive y is up
pDC->Rectangle(x1, -y1, x2, -y2);
/*** Second Section ***/
x1=x2;
x2=(long)(barWidth+x1);
if (i==0) {
pDC->SelectObject(&brushWhite); //White
}
else {
pDC->SelectObject(&brushRed); //Red
}
pDC->Rectangle(x1, -y1, x2, -y2);
/*** Third Section ***/
x1=x2;
x2=(long)(barWidth*2+x1);
if (i==0) {
pDC->SelectObject(&brushRed); //Red
}
else {
pDC->SelectObject(&brushWhite); //White
}
pDC->Rectangle(x1, -y1, x2, -y2);
/*** Reset Values for bottom bar pass***/
x1=(long)(startX*1000);
y1=y2;
} // End For
// Calculate Pixels Per Inch
CPoint pt(1000, 1000); // In HIENGLISH 1000 units = 1 inch
pDC->LPtoDP(&pt); // Convert inch to pixel
long lPixPerInch = pt.x;
CRect rc;
CView::GetClientRect(&rc);
float screenX, screenY;
double mapX1, mapY1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -