Winform下之地形图开发控件(GMap.NET)使用心得的二

本文主要分享部分每当Visio二次开发中碰到的各种小题目及其解决办法:

在上篇《Winform下的地形图开发控件(GMap.NET)使用体验》中略介绍了GMap.NET的控件基本气象,本篇开始介绍一下系的代码操作。

  1. 也图元设置颜色
    于一部分剖析着,如电气线路分析面临,需要根据不同的状态改变图元的颜色,那么哪些改指定图元的配备颜色吗?下面提供代码解决拖欠问题。

事实上目前GMap.NET提供的功力还未是许多,因此其现身说法的例证基本上都关乎到了,我在此基础及召开了片改良和用,总结下效果代码吧。

图片 1  shape.get_CellsU(“LineColor”).ResultIU = (double)VisDefaultColors.visDarkGreen;//有电(绿色)
图片 2

率先使用控件前,需要初始化一些变量和波,初始化代码如下所示:

内部VisDefaultColors是一个枚举,有成百上千颜料,可以查下SDK,也可使用那相应的数值来代表

图片 3图片 4代码

Constant Value Description

visBlack

0

Black

visBlue

4

Blue

visCyan

7

Cyan

visDarkBlue

10

Dark blue

visDarkCyan

13

Dark cyan

visDarkGray

19

Dark gray

visDarkGreen

9

Dark green

visDarkRed

8

Dark red

visDarkYellow

11

Dark yellow

        private void InitMapControl()
        {
            this.gMapControl1.Manager.Mode = AccessMode.ServerAndCache;
            this.gMapControl1.MapType = MapType.GoogleMapChina;
            this.gMapControl1.MaxZoom = 18;
            this.gMapControl1.MinZoom = 8;
            this.gMapControl1.Zoom = 13;

…………

            this.gMapControl1.MouseMove += new MouseEventHandler(gMapControl1_MouseMove);
            this.gMapControl1.DoubleClick += new EventHandler(gMapControl1_DoubleClick);
            this.gMapControl1.MouseDown += new MouseEventHandler(this.MainMap_MouseDown);
            this.gMapControl1.MouseUp += new MouseEventHandler(this.MainMap_MouseUp);

上面的代码是于简单的写法,当然为可行使下这种艺术:

            this.gMapControl1.OnCurrentPositionChanged += new CurrentPositionChanged(this.MainMap_OnCurrentPositionChanged);
            this.gMapControl1.OnTileLoadStart += new TileLoadStart(this.MainMap_OnTileLoadStart);
            this.gMapControl1.OnTileLoadComplete += new TileLoadComplete(this.MainMap_OnTileLoadComplete);

图片 5shape.get_CellsSRC((short)VisSectionIndices.visSectionObject, (short)VisRowIndices.visRowLine,(short)VisCellIndices.visLineColor).FormulaU = 4

            this.gMapControl1.OnMarkerClick += new MarkerClick(this.MainMap_OnMarkerClick);
            this.gMapControl1.OnMapZoomChanged += new MapZoomChanged(this.MainMap_OnMapZoomChanged);
            this.gMapControl1.OnMapTypeChanged += new MapTypeChanged(this.MainMap_OnMapTypeChanged);

  1. 得图元设备的总是关系
    每个设备Shape都发一个Connects和FromConnects集合,该集是Connect对象集合,每个Connect有ToSheet和FromSheet属性,分别是靠于一个Shape对象,我们而一旦收获装备的涉嫌关系,就是亟需判定这些Connect的ToSheet和FromSheet属性。
    正如代码:

            this.routes = new GMapOverlay(this.gMapControl1, “routes”);
            this.gMapControl1.Overlays.Add(this.routes);
            this.objects = new GMapOverlay(this.gMapControl1, “objects”);
            this.gMapControl1.Overlays.Add(this.objects);
            this.top = new GMapOverlay(this.gMapControl1, “top”);
            this.gMapControl1.Overlays.Add(this.top);
            this.currentMarker = new GMapMarkerGoogleRed(this.gMapControl1.CurrentPosition);
            this.top.Markers.Add(this.currentMarker);
            this.center = new GMapMarkerCross(this.gMapControl1.CurrentPosition);
            this.top.Markers.Add(this.center);

图片 6            string strShapes = “;”;
图片 7            if (IsSpecialEquipTypeInShape(shape))
图片 8图片 9            图片 10{
图片 11                foreach (Visio.Connect connect in shape.Connects)
图片 12图片 13                图片 14{
图片 15                    strShapes += GetConnectsShapes(shape, connect.ToSheet);     //检查衔接的配备
图片 16                    strShapes += GetConnectsShapes(shape, connect.FromSheet);   //检查衔接起之装置
图片 17                }
图片 18
图片 19                foreach (Visio.Connect connect in shape.FromConnects)
图片 20图片 21                图片 22{
图片 23                    strShapes += GetConnectsShapes(shape, connect.ToSheet);     //检查衔接的设备
图片 24                    strShapes += GetConnectsShapes(shape, connect.FromSheet);   //检查衔接起的设施
图片 25                }
图片 26            }

            this.myShop = new GMapOverlay(this.gMapControl1, “myShop”);
            this.gMapControl1.Overlays.Add(this.myShop);
            DisplayMyShop();
            
            SetZoomCenter();

图片 27图片 28        /**//// <summary>
图片 29        /// 获取和眼前底图元连接(接入或者接出)的有着相关装备
图片 30        /// </summary>
图片 31        private string GetConnectsShapes(Visio.Shape shape, Visio.Shape toFromSheet)
图片 32图片 33        图片 34{
图片 35            string strShapes = string.Empty;
图片 36            bool exist = VisioUtility.ShapeCellExist(toFromSheet, “设备项目”);
图片 37            bool isSpecial = IsSpecialEquipTypeInShape(toFromSheet);
图片 38
图片 39            if (toFromSheet != null && exist && isSpecial)
图片 40图片 41            图片 42{
图片 43                //Visio图元的连日集合,会存放自己我的,所以这边需要看清。
图片 44                if (shape.ID != toFromSheet.ID)
图片 45图片 46                图片 47{
图片 48                    strShapes += string.Format(“{0};”, toFromSheet.ID);
图片 49                }
图片 50            }
图片 51
图片 52            return strShapes;
图片 53        }

            this.gMapControl1.DragButton = MouseButtons.Left;
        }

  1. 取得图元的性质集合
    咱们懂得,每个图元Shape甚至Page对象都发多由定义属性,你可以通过当Visio的付出模式被翻ShapeSheet查相。而有这些性被,每行又象征一个性质的各种定义信息,如Label是什么,Prompt(提示)是啊,Value(值)是呀,Type(类型)是什么,这就是有接触类似于我们在数据库定义一个字段,需要指定字段的称呼,类型等等,那如若我们得把这些消息保存下来,我们该怎么获得呢?下面举例说明:

 

图片 54            Dictionary<string, StencilPropertyInfo> list = new Dictionary<string, StencilPropertyInfo>();
图片 55            StencilPropertyInfo propertyInfo;
图片 56            Visio.Cell shapeCell;
图片 57            short shortSectionProp = (short)VisSectionIndices.visSectionProp;
图片 58
图片 59            if (shape != null)
图片 60图片 61            图片 62{
图片 63                for (short i = 0; i < shape.get_RowCount(shortSectionProp); i++)
图片 64图片 65                图片 66{
图片 67                    if (shape.get_CellsSRCExists(shortSectionProp, i, (short)VisCellIndices.visCustPropsLabel, 0) != 0)
图片 68图片 69                    图片 70{
图片 71                        propertyInfo = new StencilPropertyInfo();
图片 72
图片 73                        shapeCell = shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsLabel);
图片 74                        propertyInfo.Name = VisioUtility.FormulaStringToString(shapeCell.RowNameU);
图片 75
图片 76                        shapeCell = shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsPrompt);
图片 77                        propertyInfo.Prompt = VisioUtility.FormulaStringToString(shapeCell.FormulaU);
图片 78
图片 79                        shapeCell = shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsFormat);
图片 80                        propertyInfo.Format = VisioUtility.FormulaStringToString(shapeCell.FormulaU);
图片 81
图片 82                        shapeCell = shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsValue);
图片 83                        propertyInfo.Value = VisioUtility.FormulaStringToString(shapeCell.FormulaU);
图片 84
图片 85                        shapeCell = shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsSortKey);
图片 86                        propertyInfo.SortKey = VisioUtility.FormulaStringToString(shapeCell.FormulaU);
图片 87
图片 88                        shapeCell = shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsType);
图片 89                        propertyInfo.PropType = (PropType)shapeCell.get_ResultInt((short)VisUnitCodes.visNumber, 0);

 

图片 90                        shapeCell = shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsInvis);
图片 91                        if (“True”.Equals(VisioUtility.FormulaStringToString(shapeCell.FormulaU), StringComparison.OrdinalIgnoreCase))
图片 92图片 93                        图片 94{
图片 95                            propertyInfo.InVisible = true;
图片 96                        }
图片 97
图片 98                        propertyInfo.PropRowID = i;                       
图片 99
图片 100                        if(!list.ContainsKey(propertyInfo.Name))
图片 101图片 102                        图片 103{
图片 104                            list.Add(propertyInfo.Name, propertyInfo);
图片 105                        }
图片 106                    }
图片 107                }
图片 108            }
图片 109
图片 110            return list;

里面的OnMarkerClick好像虽然发生连带的波,但是并无克捕获单击图标的流年操作,估计是绝非好该功能吧。

  1. 闭馆视图中打开的有模具
    貌似的话,一个Visio文档,一般会打开很多模具窗口,用来辅助画图的,我们偶尔不小心关闭部分,又闹或打开多几单,那么你是怎么记住这些打开的模具文件的吗,我们设什么关闭所有吧,你得行使TryCatch来关闭每个文件,即使其或许就关了,这种才保证不见面拧;我们无绝喜欢暴力,还起没有发出再次好之法门呢,让它好清楚那些可以关闭的也?

GMap.NET提供了各种鼠标的操作事件,我们重载即可实现特殊的主宰处理了:

图片 111图片 112        /**//// <summary>
图片 113        /// 关闭视图中开辟的享有模具
图片 114        /// </summary>
图片 115        /// <param name=”visApp”></param>
图片 116        /// <returns></returns>
图片 117        public bool CloseAllStencileDocument(Application visApp)
图片 118图片 119        图片 120{
图片 121            string[] strs = new string[0];
图片 122            Array arr = strs as Array;
图片 123            visApp.Documents.GetNames(out arr);
图片 124            Document visDoc;
图片 125            foreach (object file in arr)
图片 126图片 127            图片 128{
图片 129                if (file.ToString().IndexOf(“.vss”, StringComparison.OrdinalIgnoreCase) > 0)
图片 130图片 131                图片 132{
图片 133                    visDoc = visApp.Documents[file];
图片 134                    if (visDoc != null)
图片 135图片 136                    图片 137{
图片 138                        visDoc.Close();
图片 139                    }
图片 140                }
图片 141            }
图片 142            return true;
图片 143        }

图片 144图片 145鼠标事件操作

  1. 治本Visio内置的窗口
    Visio控件提供了诸多放权的窗口,你得因需要出示或者藏它,如我们经常看到底图元属性窗口、形状查询窗口、模具管理窗口等等,很独立的例子,我们不少时段不待充分样子查询窗口,想将她隐藏,那么这些该怎么操作为?
    自面前写过的文章C#进行Visio二次开发的大规模问题处理
    有说明,如下所示:

        void gMapControl1_DoubleClick(object sender, EventArgs e)
        {
            this.gMapControl1.Zoom += 1;
            this.gMapControl1.CurrentPosition = lastPosition;
        }

图片 146        //Visio2007的相窗口中去搜索形状功能
图片 147            VisApplication.Settings.ShowShapeSearchPane = false;
图片 148
图片 149图片 150            Visio2003的ShowShapeSearchPane实现方式Visio2003之ShowShapeSearchPane实现方式#region Visio2003的ShowShapeSearchPane实现方式
图片 151            //Window searchWindow = wndVisio.Windows.get_ItemFromID(Convert.ToInt16(VisWinTypes.visWinIDShapeSearch));
图片 152            //if (searchWindow != null)
图片 153            //{
图片 154            //    searchWindow.Visible = false;
图片 155            //} 
图片 156            #endregion

        void gMapControl1_MouseMove(object sender, MouseEventArgs e)
        {
            PointLatLng latLng = this.gMapControl1.FromLocalToLatLng(e.X, e.Y);
            this.tsslPosition.Text = string.Format(“经度:{0}, 纬度:{1} “, latLng.Lng, latLng.Lat);
        }

再有雷同栽办法可管理窗口,如下面代码,对各种内置的窗口实现了统一之军事管制

        private void MainMap_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                this.isMouseDown = true;
                lastPosition = this.gMapControl1.FromLocalToLatLng(e.X, e.Y);              
            }            
        }

图片 157图片 158                for (int i = drawingControl.Window.Windows.Count; i > 0; i–) 图片 159{
图片 160                    Window visWindow;
图片 161                    int windowType;
图片 162
图片 163                    visWindow = drawingControl.Window.Windows.get_ItemEx(i);
图片 164                    windowType = visWindow.Type;
图片 165
图片 166图片 167                    if (windowType == (int) VisWinTypes.visAnchorBarBuiltIn) 图片 168{
图片 169
图片 170                        switch (visWindow.ID) 
图片 171图片 172                        图片 173{
图片 174                            case (int) VisWinTypes.visWinIDCustProp:
图片 175                            case (int) VisWinTypes.visWinIDDrawingExplorer:
图片 176                            case (int) VisWinTypes.visWinIDMasterExplorer:
图片 177                            case (int) VisWinTypes.visWinIDPanZoom:
图片 178                            case (int) VisWinTypes.visWinIDShapeSearch:
图片 179                            case (int) VisWinTypes.visWinIDSizePos:
图片 180                            case (int) VisWinTypes.visWinIDStencilExplorer:
图片 181
图片 182                                visWindow.Visible = false;
图片 183                                break;
图片 184
图片 185                            default:
图片 186                                break;
图片 187                        }
图片 188                    }
图片 189                }

        private void MainMap_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                this.isMouseDown = false;
            }
        } 

顿时下知了有些了吧,要饮水思源哦

 

图片 190转载请注明出处:
图片 191撰写人:伍华聪  http://www.iqidi.com 

 

保留截图的操作如下所示

图片 192图片 193代码

        private void tsbSavePicture_Click(object sender, EventArgs e)
        {
            try
            {
                using (SaveFileDialog dialog = new SaveFileDialog())
                {
                    dialog.Filter = “PNG (*.png)|*.png”;
                    dialog.FileName = “GMap.NET image”;
                    Image image = this.gMapControl1.ToImage();
                    if (image != null)
                    {
                        using (image)
                        {
                            if (dialog.ShowDialog() == DialogResult.OK)
                            {
                                string fileName = dialog.FileName;
                                if (!fileName.EndsWith(“.png”, StringComparison.OrdinalIgnoreCase))
                                {
                                    fileName += “.png”;
                                }
                                image.Save(fileName);
                                MessageBox.Show(“图片已经封存: ” + dialog.FileName, “GMap.NET”, MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                            }
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                MessageBox.Show(“图片保存失败: ” + exception.Message, “GMap.NET”, MessageBoxButtons.OK, MessageBoxIcon.Hand);
            }

 

 

地址询问并绘制图标的代码如下:

图片 194图片 195代码

private void btnSearch_Click(object sender, EventArgs e)
        {
            if (this.txtAddress.Text.Length == 0)
            {
                this.txtAddress.Focus();
                MessageBox.Show(“请输入查询的地点”);
            }

            string search = string.Format(“{0},{1}”, this.txtCity.Text, this.txtAddress.Text);
            GeoCoderStatusCode code = this.gMapControl1.SetCurrentPositionByKeywords(search);
            if (code != GeoCoderStatusCode.G_GEO_SUCCESS)
            {
                MessageBox.Show(“地址没有找到:'” + this.txtAddress.Text + “‘, 原因:” + code.ToString(), “GMap.NET”, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }

            this.objects.Markers.Clear();
            AddLocation(this.txtAddress.Text);
        }

        private void AddLocation(string place)
        {
            GeoCoderStatusCode unknow = GeoCoderStatusCode.Unknow;
            PointLatLng? latLngFromGeocoder = Singleton<GMaps>.Instance.GetLatLngFromGeocoder(place, out unknow);
            if (latLngFromGeocoder.HasValue && (unknow == GeoCoderStatusCode.G_GEO_SUCCESS))
            {
                GMapMarker item = new GMapMarkerGoogleGreen(latLngFromGeocoder.Value);
                GMapMarkerRect rect = new GMapMarkerRect(latLngFromGeocoder.Value);
                rect.Size = new System.Drawing.Size(100, 100);
                rect.ToolTipText = place;
                rect.TooltipMode = MarkerTooltipMode.Always;
                this.objects.Markers.Add(item);
                this.objects.Markers.Add(rect);
            }
        }

 

 

制图两地之间的路图令如下所示:

图片 196图片 197代码

        private void ctxMenu_GetRout_Click(object sender, EventArgs e)
        {
            this.objects.Markers.Clear();
            this.routes.Routes.Clear();//清楚路线

            this.start = defaultLocation;
            this.end = this.gMapControl1.FromLocalToLatLng(this.contextMenuStrip1.Bounds.X, this.contextMenuStrip1.Bounds.Y);

            MapRoute route = Singleton<GMaps>.Instance.GetRouteBetweenPoints(this.start, this.end, false, (int)this.gMapControl1.Zoom);
            if (route != null)
            {
                GMapRoute item = new GMapRoute(route.Points, route.Name);
                item.Color = Color.Blue;
                this.routes.Routes.Add(item);

                GMapMarker marker = new GMapMarkerGoogleRed(this.start);
                //marker.ToolTipText = “Start: ” + route.Name;
                marker.TooltipMode = MarkerTooltipMode.Always;

                //Placemark place = this.gMapControl1.Manager.GetPlacemarkFromGeocoder(this.end);//地标不纯粹,不用
                MapRoute mapRoute = this.gMapControl1.Manager.GetRouteBetweenPoints(this.start, this.end, true, (int)this.gMapControl1.Zoom);
                GMapMarker marker2 = new GMapMarkerGoogleGreen(this.end);
                marker2.ToolTipText = string.Format(“目的地距离:{0}公里 “, Math.Round(mapRoute.Distance, 2));
                marker2.TooltipMode = MarkerTooltipMode.Always;

                this.objects.Markers.Add(marker);
                this.objects.Markers.Add(marker2);
                this.gMapControl1.ZoomAndCenterRoute(item);
            }            
        }

 

 

放、缩小、重新加载地图的操作如下:

图片 198图片 199代码

        private void ctxMenu_ZoomOut_Click(object sender, EventArgs e)
        {
            this.gMapControl1.Zoom += 1;            
        }

        private void ctxMenu_ZoomIn_Click(object sender, EventArgs e)
        {
            this.gMapControl1.Zoom -= 1;
        }

        private void tsbReload_Click(object sender, EventArgs e)
        {
            this.gMapControl1.ReloadMap();
        }

 

 

先后截图如下所示:

图片 200