📄 gisview.cpp
字号:
// GisView.cpp : implementation of the CGisView class
//
#include "stdafx.h"
#include "Gis.h"
#include "GisDoc.h"
#include "GisView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CGisView
IMPLEMENT_DYNCREATE(CGisView, CView)
BEGIN_MESSAGE_MAP(CGisView, CView)
//{{AFX_MSG_MAP(CGisView)
ON_WM_SIZE()
ON_WM_CREATE()
ON_COMMAND(ID_LAYER, OnLayer)
ON_COMMAND(ID_SELECT, OnSelect)
ON_COMMAND(ID_SPAN, OnSpan)
ON_COMMAND(ID_ZOOMIN, OnZoomIn)
ON_COMMAND(ID_ZOOMOUT, OnZoomOut)
ON_COMMAND(ID_LINE, OnLine)
ON_COMMAND(ID_LABLE, OnLable)
ON_COMMAND(ID_PLOYLINE, OnPolyLine)
ON_COMMAND(ID_AROW, OnArrow)
ON_COMMAND(ID_TEST, OnTest)
ON_COMMAND(ID_EYES, OnEyes)
//}}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(CGisView, CView)
//使用工具时的处理
ON_EVENT(CGisView, ID_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(CGisView, ID_MAP, DISPID_MOUSEUP,
OnMouseUpInMap, VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
END_EVENTSINK_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGisView construction/destruction
CGisView::CGisView()
{
// 建立数据库连接
HRESULT hr;
hr = m_rs.CreateInstance("ADODB.Recordset");
if(!SUCCEEDED(hr))
{
AfxMessageBox("数据库初始化失败!");
return;
}
//连接数据库
hr = m_rs->Open("Select * from us_cust", "Provider=Microsoft.Jet.OLEDB.3.51;""Data Source=test.mdb",adOpenStatic, adLockReadOnly, adCmdText);
if(!SUCCEEDED(hr))
{
AfxMessageBox("数据库查询失败!");
return;
}
//创建小窗口
// m_miWindow.m_map = new CMapX;
// m_miWindow.Create(IDD_MINIWINDOW);
}
CGisView::~CGisView()
{
m_rs->Close();
}
BOOL CGisView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CGisView drawing
void CGisView::OnDraw(CDC* pDC)
{
CGisDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CGisView printing
BOOL CGisView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CGisView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CGisView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CGisView diagnostics
#ifdef _DEBUG
void CGisView::AssertValid() const
{
CView::AssertValid();
}
void CGisView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CGisDoc* CGisView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGisDoc)));
return (CGisDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CGisView message handlers
void CGisView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
m_map.MoveWindow(0,0,cx,cy);
}
int CGisView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
if(!m_map.Create(NULL,WS_VISIBLE,CRect(0,0,100,100),this,ID_MAP))
return -1;
return 0;
}
void CGisView::OnLayer()
{
m_map.GetLayers().LayersDlg();
}
void CGisView::OnSelect()
{
// TODO: Add your command handler code here
m_map.SetCurrentTool(miSelectTool);
}
void CGisView::OnSpan()
{
// TODO: Add your command handler code here
m_map.SetCurrentTool(miPanTool);
ChangeEye();
}
void CGisView::OnZoomIn()
{
// TODO: Add your command handler code here
m_map.SetCurrentTool(miZoomInTool);
ChangeEye();
}
void CGisView::OnZoomOut()
{
// TODO: Add your command handler code here
m_map.SetCurrentTool(miZoomOutTool);
ChangeEye();
}
void CGisView::OnLine()
{
// TODO: Add your command handler code here
SetInsertionLayer();
m_map.SetCurrentTool(miAddLineTool);
}
void CGisView::OnLable()
{
// TODO: Add your command handler code here
m_map.SetCurrentTool(miLabelTool);
}
void CGisView::OnPolyLine()
{
// TODO: Add your command handler code here
SetInsertionLayer();
m_map.SetCurrentTool(miAddPolylineTool);
}
void CGisView::OnArrow()
{
m_map.SetCurrentTool(miArrowTool);
}
bool CGisView::SetInsertionLayer()
{
long n;
CMapXLayer layer;
n = m_map.GetLayers().GetCount();
layer = m_map.GetLayers().Item(n);
m_map.GetLayers().Item(n).SetEditable(true);
m_map.GetLayers().SetInsertionLayer(layer);
return true;
}
void CGisView::OnTest()
{
//将数据显示在地图上
COptionalVariant optVt;//可选变量??
CMapXDataset ds;//数据集
COleVariant rsVt;//数据源指针
COleVariant BindLayerVt,FieldsVt,QueryInfoVt;
CMapXFields Fields;
CMapXBindLayer BindLayer;
//创建对象实例
if(!Fields.CreateDispatch(Fields.GetClsid())) {
TRACE0("Failed to Create Fields Object");
return;
}
if(!BindLayer.CreateDispatch(BindLayer.GetClsid())) {
TRACE0("Failed to Create BindLayer Object!");
return;
}
rsVt.vt = VT_DISPATCH;
rsVt.pdispVal = m_rs;
rsVt.pdispVal->AddRef();
try{
//绑定数据
BindLayer.SetLayerName("Customers");
BindLayer.SetLayerType(miBindLayerTypeXY);
BindLayer.SetRefColumn1("X");
BindLayer.SetRefColumn2("Y");
BindLayerVt.vt = VT_DISPATCH;
BindLayerVt.pdispVal = BindLayer;
BindLayerVt.pdispVal->AddRef();
Fields.Add(COleVariant("COMPANY"),COleVariant("Company"),COleVariant((long)miAggregationIndividual),COleVariant((long)miTypeString));
Fields.Add(COleVariant("X"),COleVariant("X"),COleVariant((long)miAggregationAverage),COleVariant((long)miTypeNumeric));
Fields.Add(COleVariant("Y"),COleVariant("Y"),COleVariant((long)miAggregationAverage),COleVariant((long)miTypeNumeric));
Fields.Add(COleVariant("ORDER_AMT"),COleVariant("Order_Amt"),COleVariant((long)miAggregationSum),COleVariant((long)miTypeNumeric));
FieldsVt.vt = VT_DISPATCH;
FieldsVt.pdispVal = Fields;
FieldsVt.pdispVal->AddRef();
ds = m_map.GetDatasets().Add(miDataSetADO,rsVt,COleVariant("company layer"),COleVariant("Company"),COptionalVariant(),BindLayerVt,FieldsVt,COptionalVariant());
//将图标用自定义图表替代
CMapXLayer layer;//指定添加的层
layer = m_map.GetLayers().Item("Customers");
layer.SetOverrideStyle(true);//设定覆盖原来默认的图标
if(layer.GetStyle().GetSupportsBitmapSymbols())
{
layer.GetStyle().SetSymbolType(miSymbolTypeBitmap);
layer.GetStyle().SetSymbolBitmapSize(12);
layer.GetStyle().SetSymbolBitmapTransparent(true);
layer.GetStyle().SetSymbolBitmapName("TOWE2-32.bmp");
}
//刷新屏幕
m_map.Refresh();
}
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
}
void CGisView::OnEyes()
{
static bool flg = false;
m_miWindow.m_GeoSet = m_map.GetGeoSet();
if(!flg)
{
m_miWindow.Create(IDD_MINIWINDOW);
flg = true;
}
ChangeEye();
m_miWindow.ShowWindow(SW_SHOW);
}
//刷新小窗口;改变鹰眼的位置
void CGisView::ChangeEye()
{
CRect rt;
GetClientRect(&rt);
float x,y,x1,y1;
x = rt.left;
y = rt.top;
x1 = rt.right;
y1 = rt.bottom;
m_map.ConvertCoord(&x,&y,&m_miWindow.m_left,&m_miWindow.m_top,miScreenToMap);
m_map.ConvertCoord(&x1,&y1,&m_miWindow.m_right,&m_miWindow.m_bottom,miScreenToMap);
m_miWindow.Invalidate();
//m_miWindow.DrawEye();
}
//使用工具时
void CGisView::OnToolUsed(short ToolNum, double X1, double Y1, double X2, double Y2, double Distance, BOOL Shift, BOOL Ctrl, BOOL* EnableDefault)
{
CString str;
str.Format("Tool=%d, [%f,%f] [%f, %f], dist=%f, %s %s\n",ToolNum, X1,Y1,X2,Y2,Distance,
(Shift)?"Shift":"",(Ctrl)?"Ctrl":"");
TRACE(str);
}
//对地图进行单击时
void CGisView::OnMouseUpInMap(short Button, short Shift, float X, float Y)
{
if(Button = 1)//left button
{
long ToolNum;
ToolNum = m_map.GetCurrentTool();
if((ToolNum < 1005) && (ToolNum > 1000))//改变视窗范围的工具
{
//刷新小视窗
//m_miWindow.DrawEye();
ChangeEye();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -