MapInfo开发心得——多地图关联篇【转】
生活随笔
收集整理的這篇文章主要介紹了
MapInfo开发心得——多地图关联篇【转】
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
多個(gè)窗體(MDI)同時(shí)展示,并相互操作這并不困難,小弟在這介紹一下由MapInfo中MapControl組成的多窗體關(guān)聯(lián)處理。 首先看看效果:
????????/**////?<summary>
????????///?傳遞子控件事件到父窗體的中間事件
????????///?</summary>
????????public?event?MouseEventHandler?MapControl_MouseMove;
????????/**////?<summary>
????????///?傳遞子控件事件到父窗體的中間事件
????????///?</summary>
????????public?event?EventHandler?ViewChanged;
????????/**////?<summary>
????????///?控件關(guān)閉事件
????????///?</summary>
????????public?event?EventHandler?Closed;
????????/**////?<summary>
????????///?在地圖控件上點(diǎn)擊后觸發(fā)
????????///?</summary>
????????public?event?MouseEventHandler?MapControl_MouseClick;
由于在ViewMap中的MapControl是私有的,MapControl的事件并不能被外界所調(diào)用,所以在此聲明兩個(gè)用于傳遞事件的中間事件,以使各地圖控件相互關(guān)聯(lián)操作。當(dāng)然,這些MapControl的事件需要在ViewMap中注冊(cè)并調(diào)用: 轉(zhuǎn)發(fā)事件
????????void?mapControl1_MapControl_MouseMove?(?object?sender,?MouseEventArgs?e?)
????????{
????????????if?(?this.MapControl_MouseMove?!=?null?)
????????????{
????????????????//把事件轉(zhuǎn)發(fā)出去
????????????????MapControl_MouseMove?(?this,?e?);
????????????}
????????}
????????void?mapControl1_MapControl_MouseClick?(?object?sender,?MouseEventArgs?e?)
????????{
????????????if?(?this.MapControl_MouseClick?!=?null?)
????????????{
????????????????MapControl_MouseClick?(?this,?e?);
????????????}
????????}
在以上代碼中,需要注意到是,我在調(diào)用MapControl_MouseMove事件時(shí),把sender的參數(shù)轉(zhuǎn)換為了ViewMap本身,這樣做,是為了將來(lái)避免死循環(huán)。 那么在需要展示多地圖的窗體上調(diào)用一下AddControl,再設(shè)置一下控件大小,坐標(biāo)等,就能方便地把地圖控件加載上去了。 添加子控件
?????????/**////?<summary>
????????///?為窗體添加子控件
????????///?</summary>
????????///?<param?name="childForm">需要添加的子窗體</param>
????????public?void?AddChildForm?(?ViewMap?childForm?)
????????{
????????????if?(?!childFormList.Contains?(?childForm?)?)
????????????{
????????????????if?(?!(?childFormList.Count?+?1?>?_maxChildForm?)?)
????????????????{
????????????????????this.childFormList.Add?(?childForm?);
????????????????}
????????????????else
????????????????{
????????????????????MessageBox.Show?(?_OVER_MAX_CHILDFORM_COUNT?);
????????????????????return;
????????????????}
????????????}
????????????childForm.MapControl_MouseMove?+=?new?MouseEventHandler?(?vm_MapControl_MouseMove?);
????????????childForm.ViewChanged?+=?new?EventHandler?(?vm_ViewChanged?);
????????????childForm.Closed?+=?new?EventHandler?(?childForm_Closed?);
????????????childForm.MapControl_MouseClick?+=?new?MouseEventHandler?(?childForm_MapControl_MouseClick?);
????????????SetChildFormLocation?();
????????????this.Controls.Add?(?childForm?);
????????}
在以上代碼中注冊(cè)的事件,以下是執(zhí)行方法節(jié)選: 執(zhí)行方法節(jié)選
?????????void?vm_MapControl_MouseMove?(?object?sender,?MouseEventArgs?e?)
????????{
????????????foreach?(?ViewMap?vm?in?childFormList?)
????????????{
????????????????if?(?!sender.Equals?(?vm?)?)
????????????????{
????????????????????vm.DrawAssistLine?(?e.Location?);
????????????????}
????????????}
????????}
????????void?vm_ViewChanged?(?object?sender,?EventArgs?e?)
????????{
????????????//遍歷所有子窗體,如當(dāng)前sender不為本身,執(zhí)行事件
????????????MapControlEventArg?mce?=?e?as?MapControlEventArg;
????????????foreach?(?ViewMap?vm?in?childFormList?)
????????????{
????????????????if?(?!sender.Equals?(?vm?)?)
????????????????{
????????????????????vm.SetCenter?(?mce.ZoomLevel,?mce.Center?);
????????????????}
????????????}
????????}
在這里,就可以看出來(lái)使用ViewMap本身替代sender的優(yōu)點(diǎn)了,在這里循環(huán)判斷一下子控件列表,如果不為控件本身,便執(zhí)行相應(yīng)方法……
?
以上多關(guān)聯(lián)地圖窗體實(shí)現(xiàn)了:在同一個(gè)窗體中加載多個(gè)(最多4個(gè))地圖,地圖的拖拽、縮放操作可相互關(guān)聯(lián),每個(gè)地圖上各個(gè)數(shù)據(jù)都可以完全不相同! 現(xiàn)在我來(lái)說(shuō)一下實(shí)現(xiàn)過(guò)程: 首先要在同一個(gè)窗體中加載多個(gè)地圖,我采用了UserControl來(lái)做: public partial class ViewMap :System.Windows.Forms.UserControl 在這個(gè)ViewMap控件中,我把地圖控件所需要的所有東西(包括加載數(shù)據(jù)的方法、展示圖元的方法等)都封裝其中。 然后在此控件中聲明幾個(gè)事件: 聲明事件????????/**////?<summary>
????????///?傳遞子控件事件到父窗體的中間事件
????????///?</summary>
????????public?event?MouseEventHandler?MapControl_MouseMove;
????????/**////?<summary>
????????///?傳遞子控件事件到父窗體的中間事件
????????///?</summary>
????????public?event?EventHandler?ViewChanged;
????????/**////?<summary>
????????///?控件關(guān)閉事件
????????///?</summary>
????????public?event?EventHandler?Closed;
????????/**////?<summary>
????????///?在地圖控件上點(diǎn)擊后觸發(fā)
????????///?</summary>
????????public?event?MouseEventHandler?MapControl_MouseClick;
由于在ViewMap中的MapControl是私有的,MapControl的事件并不能被外界所調(diào)用,所以在此聲明兩個(gè)用于傳遞事件的中間事件,以使各地圖控件相互關(guān)聯(lián)操作。當(dāng)然,這些MapControl的事件需要在ViewMap中注冊(cè)并調(diào)用: 轉(zhuǎn)發(fā)事件
????????void?mapControl1_MapControl_MouseMove?(?object?sender,?MouseEventArgs?e?)
????????{
????????????if?(?this.MapControl_MouseMove?!=?null?)
????????????{
????????????????//把事件轉(zhuǎn)發(fā)出去
????????????????MapControl_MouseMove?(?this,?e?);
????????????}
????????}
????????void?mapControl1_MapControl_MouseClick?(?object?sender,?MouseEventArgs?e?)
????????{
????????????if?(?this.MapControl_MouseClick?!=?null?)
????????????{
????????????????MapControl_MouseClick?(?this,?e?);
????????????}
????????}
在以上代碼中,需要注意到是,我在調(diào)用MapControl_MouseMove事件時(shí),把sender的參數(shù)轉(zhuǎn)換為了ViewMap本身,這樣做,是為了將來(lái)避免死循環(huán)。 那么在需要展示多地圖的窗體上調(diào)用一下AddControl,再設(shè)置一下控件大小,坐標(biāo)等,就能方便地把地圖控件加載上去了。 添加子控件
?????????/**////?<summary>
????????///?為窗體添加子控件
????????///?</summary>
????????///?<param?name="childForm">需要添加的子窗體</param>
????????public?void?AddChildForm?(?ViewMap?childForm?)
????????{
????????????if?(?!childFormList.Contains?(?childForm?)?)
????????????{
????????????????if?(?!(?childFormList.Count?+?1?>?_maxChildForm?)?)
????????????????{
????????????????????this.childFormList.Add?(?childForm?);
????????????????}
????????????????else
????????????????{
????????????????????MessageBox.Show?(?_OVER_MAX_CHILDFORM_COUNT?);
????????????????????return;
????????????????}
????????????}
????????????childForm.MapControl_MouseMove?+=?new?MouseEventHandler?(?vm_MapControl_MouseMove?);
????????????childForm.ViewChanged?+=?new?EventHandler?(?vm_ViewChanged?);
????????????childForm.Closed?+=?new?EventHandler?(?childForm_Closed?);
????????????childForm.MapControl_MouseClick?+=?new?MouseEventHandler?(?childForm_MapControl_MouseClick?);
????????????SetChildFormLocation?();
????????????this.Controls.Add?(?childForm?);
????????}
在以上代碼中注冊(cè)的事件,以下是執(zhí)行方法節(jié)選: 執(zhí)行方法節(jié)選
?????????void?vm_MapControl_MouseMove?(?object?sender,?MouseEventArgs?e?)
????????{
????????????foreach?(?ViewMap?vm?in?childFormList?)
????????????{
????????????????if?(?!sender.Equals?(?vm?)?)
????????????????{
????????????????????vm.DrawAssistLine?(?e.Location?);
????????????????}
????????????}
????????}
????????void?vm_ViewChanged?(?object?sender,?EventArgs?e?)
????????{
????????????//遍歷所有子窗體,如當(dāng)前sender不為本身,執(zhí)行事件
????????????MapControlEventArg?mce?=?e?as?MapControlEventArg;
????????????foreach?(?ViewMap?vm?in?childFormList?)
????????????{
????????????????if?(?!sender.Equals?(?vm?)?)
????????????????{
????????????????????vm.SetCenter?(?mce.ZoomLevel,?mce.Center?);
????????????????}
????????????}
????????}
在這里,就可以看出來(lái)使用ViewMap本身替代sender的優(yōu)點(diǎn)了,在這里循環(huán)判斷一下子控件列表,如果不為控件本身,便執(zhí)行相應(yīng)方法……
總結(jié)
以上是生活随笔為你收集整理的MapInfo开发心得——多地图关联篇【转】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 解决Red hat 5.4的中文问题
- 下一篇: adblock拦截iframe