MapObject控制元件的使用之圖層操作 (轉)

worldblog發表於2007-08-17
MapObject控制元件的使用之圖層操作 (轉)[@more@]

Map的使用之圖層操作:namespace prefix = o ns = "urn:schemas--com::office" />

作者: 北京 張松偉

to:zswzwy@163.com">zswzwy@163.com

 

上一次我們已經加好了圖層,但是不能對圖層進行任何操作,比如移動、放大、縮小、全屏等。接下來我將介紹如何在MapObject中加入這些功能,準備好了嗎?讓我們開始吧。

 

首先你要在工具欄上加入四個按扭,ID為別為ID_PAN、ID_ZOOMOUT、ID_ZOOMIN、ID_FULLSCREEN。加按扭的方法不用我說了吧。分別給它們加入COMMAND各UPDATE_COMMAND_UI訊息。

 

然後在檢視類中加入成員變數 UINT m_moTool;用來標識滑鼠當前的任務。

 

好了,最關鍵的時候到了,我們要給MO加入訊息對映。大家都知道,在對話方塊中加入控制元件的訊息對映是非常簡單的,然MO控制元件是我們自己建立的,要怎麼加入呢?用普通的訊息對映可以嗎?讓我來揭來這個迷底。給MO加入訊息對映共分三步:

1、  在檢視類的CPP中訊息對映的下面加入如下程式碼:

BEGIN_EVENTSINK_MAP(CWeatherGisView, CView)

  //{{AFX_EVENTSINK_MAP(CWeatherGisView)

ON_EVENT(CWeatherGisView, ID_GISMAP, -605 /* MouseDown */, OnMouseDownMap1, VTS_I2 VTS_I2 VTS_I4 VTS_I4)

//}}AFX_EVENTSINK_MAP

END_EVENTSINK_MAP()

 

2、  在檢視類的.H檔案中加入

afx_msg void OnMouseDownMap1(short Button, short Shift, long X, long Y);

  注意要同時加入DECLARE_EVENTSINK_MAP()語句。

 

3、  好了,對映加好了,也宣告瞭,下面就要實現了。在檢視類中加入:

void CMyView::OnMouseDownMap1(short Button, short Shift, long X, long Y)

成功了,下面我們要做的就是對圖層的操作了。讓我們從放大開始。

在OnMouseDownMap1函式中我們要判斷當前滑鼠的任務是什麼,好做出相應的操作。如果用個switch語句,那簡直太方便了:

  switch(m_moTool)

  {

  case ID_PAN:

  {

    m_map.SetMousePointer(54); //設定滑鼠樣式

    m_map.Pan();//移動

    break;

  }

 

  case ID_ZOOMOUT:

  {

    CMoRectangle pRect(m_map.TrackRectangle());//MO的矩形類

    if(pRect.GetWidth()<10)

  {

    CMoPoint pt(m_map.ToMapPoint((float)X,(float)Y));//將滑鼠點轉為地圖點

    //畫出矩形並放大

    CMoRectangle r(m_map.GetExtent());

    r.ScaleRectangle(0.5);

    m_map.SetExtent(r);

    m_map.CenterAt(pt.GetX(),pt.GetY());

  }

    else if(pRect.GetWidth() < 200)

  {

    CMoPoint pt(m_map.ToMapPoint((float)X,(float)Y));

   

    CMoRectangle r(m_map.GetExtent());

    r.ScaleRectangle(0.5);

    m_map.SetExtent(r);

    m_map.CenterAt(pt.GetX(),pt.GetY());

  }

    break;

  }

  case ID_ZOOMIN:

  {

    CMoPoint pt(m_map.ToMapPoint((float)X,(float)Y));

    CMoRectangle r(m_map.GetExtent());

    r.ScaleRectangle(1.5);

    m_map.SetExtent(r);

    m_map.CenterAt(pt.GetX(),pt.GetY());

 

    break;

  }

 

好了,操作程式碼我們已經寫了,現在來設定滑鼠任務吧。在COMMAND訊息中將ID附給m_moTool,

在UPDATE_COMMAND_Ui中加入pCmdUI->SetCheck( m_moTool == ID_你的ID );注意全屏可不能加呀。

 

好了,大功告成80%了!就差一個全屏了。在ID_FULLSCREEN的COMMAND中加入如下程式碼就OK了!

CMoRectangle r(m_map.GetFullExtent());

m_map.SetExtent(r);

 

下一次我將介紹如何在圖層上畫點、線、面等圖形,好了,下次見吧。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-963741/,如需轉載,請註明出處,否則將追究法律責任。

相關文章