MapInfo开发心得——控件篇【转】
生活随笔
收集整理的這篇文章主要介紹了
MapInfo开发心得——控件篇【转】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前陣做一個項目過程中,需要結合MapInfo進行地方展示開發,積累一點點心得與大家共享 以下所有基于MapXtreme 6.6 MapInfo提供了足夠強大的WinForm地圖空間,可以很方便地在VS中拖拉擺放。 但如此強大的控件也帶來了封閉性太強的問題。 現在我們都接觸到了大量Web上的地圖,比如Google Map,LiveMap等,這些Web地圖都具有非常高的交互能力,縮放由鼠標雙擊或鼠標中鍵滾動,或者使用縮放工具完成,但換到WinForm上,這些非常好的交互能力全都沒有了,變成了一個個冰冷的控件(如下圖),需要手動觸發才能調用相應功能,這樣的功能給用戶多大的困擾啊! 需要改變一下了:? 首先在需要使用MapControl的窗體構造一個MapControl對象,并聲明如下事件: 縮放等級改變事件
1????????/**////?<summary>
2????????///?縮放等級改變事件
3?????????///?</summary>
4????????///?<remarks>在本地圖的縮放等級發生變化后觸發</remarks>
5????????public?event?EventHandler?ZoomLevelChanged;
????????/**////?<summary>
????????///?設置地圖顯示比例
????????///?</summary>
????????///?<remarks>窗體上所有縮放事件均進入該方法進行</remarks>
????????///?<param?name="ZoomLevel"></param>
????????public?void?SetZoomLevel?(int?ZoomLevel)
????????{
????????????_helper.Zoom?(?ZoomLevel?);
????????????_zoomLevel?=?_helper.ZoomLevel;
????????????if?(?ZoomLevelChanged?!=?null?)
????????????{
????????????????//觸發事件
????????????????ZoomLevelChanged?(?this,?new?MapControlEventArg?(?_zoomLevel?)?);
????????????}
????????}
聲明ZoomLevelChanged事件時,為了省事,沒有使用相應的委托來做,其實在EventArg處,我使用了一個繼承自EventArg的類,并把當前縮放等級值傳入其中。 準備工作完成了,那么現在是時候構造地圖縮放工具了。 設計思路是這樣的: 由于縮放地圖具有一定的范圍,那么我就把地圖的縮放設置為8個等級,并對應MapInfo的縮放距離,該縮放方法使用一個外部類控制: 設置地圖縮放等級
????????///?<summary>
????????///?設置地圖縮放層級
????????///?</summary>
????????///?<param?name="map">地圖實例引用</param>
????????///?<param?name="zoomLevel">縮放層級</param>
????????private?void?SetZoomLevel?(?Map?map,int?zoomLevel?)
????????{
????????????try
????????????{
????????????????map.Zoom?=?ExchangeZoomLevel?(?zoomLevel?);
????????????}
????????????catch
????????????{?}
????????}
點擊該縮放控件時,調用的是上面的方法,并把地圖控件中的地圖引用傳遞過去,實現縮放功能。 由于MapInfo的MapControl控件已經提供了比較完善的API,使得縮放功能得以方便地實現。 構造縮放控件類,并在類中聲明以下變量以供使用 聲明變量
????????///?<summary>
????????///?保存對父控件的引用
????????///?</summary>
????????private?System.Windows.Forms.Control?_control;
????????///?<summary>
????????///?維護當前的等級Label
????????///?</summary>
????????private?List<System.Windows.Forms.Label>?levelLabelList;
????????///?<summary>
????????///?控件左上角顯示坐標X
????????///?</summary>
????????private?readonly?int?xPosition?=?10;
????????///?<summary>
????????///?控件左上角顯示坐標Y
????????///?</summary>
????????private?readonly?int?oginYPosition?=?10;
????????///?<summary>
????????///?當前縮放等級Label顏色
????????///?</summary>
????????private?System.Drawing.Color?currentLevelLabelColor?=?System.Drawing.Color.Blue;
????????///?<summary>
????????///?各控件的ToolTip
????????///?</summary>
????????System.Windows.Forms.ToolTip?tt;
接下來構造控件的現實狀態。由于UserControl或Control類生成出來的控件都會帶有默認的矩形背景,這一點都不雅觀,所以我還是采用了一個愚蠢方法,在MapControl上直接使用AddControl()。 構造縮放工具
?1?????????/**////?<summary>
?2????????///?構造縮放工具
?3????????///?</summary>
?4????????public?void?BuildZoomTool?(?)
?5????????{
?6????????????System.Windows.Forms.Control?mc?=?(?(MapControl)?_control?).mapControl;
?7????????????System.Windows.Forms.Label?labelZoomIn?=?CreateZoomInLabel?();
?8????????????mc.Controls.Add?(?labelZoomIn?);
?9????????????int?yPosition?=?32;
10????????????//循環次數與最大縮放等級有關
11????????????for?(?int?i?=?MapHelper.MinZoomLevel;?i?<=?MapHelper.MaxZoomLevel;?i++,?yPosition?+=?15?)
12????????????{
13????????????????System.Windows.Forms.Label?levelLabel?=?CreateLevelLabel?(?i,?yPosition+oginYPosition?);
14????????????????levelLabelList.Add?(?levelLabel?);
15????????????????mc.Controls.Add?(?levelLabel?);
16????????????}
17????????????System.Windows.Forms.Label?labelZoomOut?=?CreateZoomOutLabel?(?yPosition+oginYPosition?);
18????????????mc.Controls.Add?(?labelZoomOut?);
19????????}
20 以下是構造Label的方法: 構造各Label
?1?????????private?System.Windows.Forms.Label?CreateLevelLabel?(?int?zoomLevel,int?yPosition?)
?2????????{
?3????????????System.Windows.Forms.Label?label?=?new?System.Windows.Forms.Label?();
?4????????????label.BackColor?=?System.Drawing.Color.White;
?5????????????label.BorderStyle?=?System.Windows.Forms.BorderStyle.FixedSingle;
?6????????????label.Font?=?new?System.Drawing.Font?(?"宋體",?15.75F,?System.Drawing.FontStyle.Regular,?System.Drawing.GraphicsUnit.Point,?(?(byte)?(?134?)?)?);
?7????????????label.Text?=?"??????";
?8????????????label.Name?=?"lblLevel"?+?zoomLevel.ToString?();
?9????????????label.Tag?=?zoomLevel;
10????????????label.Cursor?=?System.Windows.Forms.Cursors.Hand;
11????????????label.Location?=?new?System.Drawing.Point?(?xPosition,?yPosition?);
12????????????label.Size?=?new?System.Drawing.Size?(?37,?11?);
13????????????label.Click?+=?new?EventHandler?(?label_Click?);
14????????????tt?=?new?System.Windows.Forms.ToolTip?();
15????????????tt.ShowAlways?=?true;
16????????????tt.SetToolTip?(?label,?"縮放地圖到"+zoomLevel.ToString()+"級"?);
17????????????return?label;
18????????}
19 以上需要注意的是,我把該控件所關聯的縮放等級設置到控件的Tag中,并注冊了點擊事件,那么在該事件中,我們只需要把該控件所保留的縮放等級設置到地圖上就可以了: Label事件
1????????void?label_Click?(?object?sender,?EventArgs?e?)
2????????{
3????????????System.Windows.Forms.Label?label?=?(System.Windows.Forms.Label)?sender;
4????????????MapControl?mc?=?(MapControl)?_control;
5????????????mc.SetZoomLevel?(?Int32.Parse?(?label.Tag.ToString?()?)?);
6????????} 如此以上,我們的地圖縮放工具就完成了。 當然,有了這個工具還是不夠的,所以我又在MapControl上注冊了鼠標雙擊事件,由雙擊鼠標來進行地圖的縮放: MapControl雙擊事件
?1????????public?void?mc_Map_MouseDoubleClick?(?object?sender,?MouseEventArgs?e?)
?2????????{
?3????????????switch?(?e.Button?)
?4????????????{
?5????????????????case?MouseButtons.Left:
?6????????????????????ZoomIn?();
?7????????????????????break;
?8????????????????case?MouseButtons.Right:
?9????????????????????ZoomOut?();
10????????????????????break;
11????????????}
12????????????_helper.SetCenter?(?e.Location?);
13????????}
14
1????????/**////?<summary>
2????????///?縮放等級改變事件
3?????????///?</summary>
4????????///?<remarks>在本地圖的縮放等級發生變化后觸發</remarks>
5????????public?event?EventHandler?ZoomLevelChanged;
這個事件的使用如下所示:
Code????????/**////?<summary>
????????///?設置地圖顯示比例
????????///?</summary>
????????///?<remarks>窗體上所有縮放事件均進入該方法進行</remarks>
????????///?<param?name="ZoomLevel"></param>
????????public?void?SetZoomLevel?(int?ZoomLevel)
????????{
????????????_helper.Zoom?(?ZoomLevel?);
????????????_zoomLevel?=?_helper.ZoomLevel;
????????????if?(?ZoomLevelChanged?!=?null?)
????????????{
????????????????//觸發事件
????????????????ZoomLevelChanged?(?this,?new?MapControlEventArg?(?_zoomLevel?)?);
????????????}
????????}
聲明ZoomLevelChanged事件時,為了省事,沒有使用相應的委托來做,其實在EventArg處,我使用了一個繼承自EventArg的類,并把當前縮放等級值傳入其中。 準備工作完成了,那么現在是時候構造地圖縮放工具了。 設計思路是這樣的: 由于縮放地圖具有一定的范圍,那么我就把地圖的縮放設置為8個等級,并對應MapInfo的縮放距離,該縮放方法使用一個外部類控制: 設置地圖縮放等級
????????///?<summary>
????????///?設置地圖縮放層級
????????///?</summary>
????????///?<param?name="map">地圖實例引用</param>
????????///?<param?name="zoomLevel">縮放層級</param>
????????private?void?SetZoomLevel?(?Map?map,int?zoomLevel?)
????????{
????????????try
????????????{
????????????????map.Zoom?=?ExchangeZoomLevel?(?zoomLevel?);
????????????}
????????????catch
????????????{?}
????????}
點擊該縮放控件時,調用的是上面的方法,并把地圖控件中的地圖引用傳遞過去,實現縮放功能。 由于MapInfo的MapControl控件已經提供了比較完善的API,使得縮放功能得以方便地實現。 構造縮放控件類,并在類中聲明以下變量以供使用 聲明變量
????????///?<summary>
????????///?保存對父控件的引用
????????///?</summary>
????????private?System.Windows.Forms.Control?_control;
????????///?<summary>
????????///?維護當前的等級Label
????????///?</summary>
????????private?List<System.Windows.Forms.Label>?levelLabelList;
????????///?<summary>
????????///?控件左上角顯示坐標X
????????///?</summary>
????????private?readonly?int?xPosition?=?10;
????????///?<summary>
????????///?控件左上角顯示坐標Y
????????///?</summary>
????????private?readonly?int?oginYPosition?=?10;
????????///?<summary>
????????///?當前縮放等級Label顏色
????????///?</summary>
????????private?System.Drawing.Color?currentLevelLabelColor?=?System.Drawing.Color.Blue;
????????///?<summary>
????????///?各控件的ToolTip
????????///?</summary>
????????System.Windows.Forms.ToolTip?tt;
接下來構造控件的現實狀態。由于UserControl或Control類生成出來的控件都會帶有默認的矩形背景,這一點都不雅觀,所以我還是采用了一個愚蠢方法,在MapControl上直接使用AddControl()。 構造縮放工具
?1?????????/**////?<summary>
?2????????///?構造縮放工具
?3????????///?</summary>
?4????????public?void?BuildZoomTool?(?)
?5????????{
?6????????????System.Windows.Forms.Control?mc?=?(?(MapControl)?_control?).mapControl;
?7????????????System.Windows.Forms.Label?labelZoomIn?=?CreateZoomInLabel?();
?8????????????mc.Controls.Add?(?labelZoomIn?);
?9????????????int?yPosition?=?32;
10????????????//循環次數與最大縮放等級有關
11????????????for?(?int?i?=?MapHelper.MinZoomLevel;?i?<=?MapHelper.MaxZoomLevel;?i++,?yPosition?+=?15?)
12????????????{
13????????????????System.Windows.Forms.Label?levelLabel?=?CreateLevelLabel?(?i,?yPosition+oginYPosition?);
14????????????????levelLabelList.Add?(?levelLabel?);
15????????????????mc.Controls.Add?(?levelLabel?);
16????????????}
17????????????System.Windows.Forms.Label?labelZoomOut?=?CreateZoomOutLabel?(?yPosition+oginYPosition?);
18????????????mc.Controls.Add?(?labelZoomOut?);
19????????}
20 以下是構造Label的方法: 構造各Label
?1?????????private?System.Windows.Forms.Label?CreateLevelLabel?(?int?zoomLevel,int?yPosition?)
?2????????{
?3????????????System.Windows.Forms.Label?label?=?new?System.Windows.Forms.Label?();
?4????????????label.BackColor?=?System.Drawing.Color.White;
?5????????????label.BorderStyle?=?System.Windows.Forms.BorderStyle.FixedSingle;
?6????????????label.Font?=?new?System.Drawing.Font?(?"宋體",?15.75F,?System.Drawing.FontStyle.Regular,?System.Drawing.GraphicsUnit.Point,?(?(byte)?(?134?)?)?);
?7????????????label.Text?=?"??????";
?8????????????label.Name?=?"lblLevel"?+?zoomLevel.ToString?();
?9????????????label.Tag?=?zoomLevel;
10????????????label.Cursor?=?System.Windows.Forms.Cursors.Hand;
11????????????label.Location?=?new?System.Drawing.Point?(?xPosition,?yPosition?);
12????????????label.Size?=?new?System.Drawing.Size?(?37,?11?);
13????????????label.Click?+=?new?EventHandler?(?label_Click?);
14????????????tt?=?new?System.Windows.Forms.ToolTip?();
15????????????tt.ShowAlways?=?true;
16????????????tt.SetToolTip?(?label,?"縮放地圖到"+zoomLevel.ToString()+"級"?);
17????????????return?label;
18????????}
19 以上需要注意的是,我把該控件所關聯的縮放等級設置到控件的Tag中,并注冊了點擊事件,那么在該事件中,我們只需要把該控件所保留的縮放等級設置到地圖上就可以了: Label事件
1????????void?label_Click?(?object?sender,?EventArgs?e?)
2????????{
3????????????System.Windows.Forms.Label?label?=?(System.Windows.Forms.Label)?sender;
4????????????MapControl?mc?=?(MapControl)?_control;
5????????????mc.SetZoomLevel?(?Int32.Parse?(?label.Tag.ToString?()?)?);
6????????} 如此以上,我們的地圖縮放工具就完成了。 當然,有了這個工具還是不夠的,所以我又在MapControl上注冊了鼠標雙擊事件,由雙擊鼠標來進行地圖的縮放: MapControl雙擊事件
?1????????public?void?mc_Map_MouseDoubleClick?(?object?sender,?MouseEventArgs?e?)
?2????????{
?3????????????switch?(?e.Button?)
?4????????????{
?5????????????????case?MouseButtons.Left:
?6????????????????????ZoomIn?();
?7????????????????????break;
?8????????????????case?MouseButtons.Right:
?9????????????????????ZoomOut?();
10????????????????????break;
11????????????}
12????????????_helper.SetCenter?(?e.Location?);
13????????}
14
這是最后的效果,當點擊任意的縮放等級,地圖就會縮放到適當的大小
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的MapInfo开发心得——控件篇【转】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Word2007 设置Tab键的默认缩进
- 下一篇: MS CRM2011实体介绍(四)——目