QGISView.cpp
上传用户:oybseng
上传日期:2015-04-27
资源大小:7831k
文件大小:83k
源码类别:

GDI/图象编程

开发平台:

Visual C++

  1. // QGISView.cpp : implementation of the CQGISView class
  2. //
  3. #include "stdafx.h"
  4. #include "QGIS.h"
  5. #include "math.h"
  6. #include "MainFrm.h"
  7. #include "QGISDoc.h"
  8. #include "QGISView.h"
  9. #include "include/Resource.h"
  10. #include "QObjects/include/Resource.h"
  11. #include "QObjects/include/QBaseObj.h"
  12. #include "QObjects/include/QMapObj.h"
  13. #include "QObjects/include/QLayerObj.h"
  14. #include "QObjects/include/QPointObj.h"
  15. #include "QObjects/include/QLineObj.h"
  16. #include "QObjects/include/QCoordSys.h"
  17. #include "QObjects/include/QSelObjManager.h"
  18. #include "QObjects/include/QLineObj.h"
  19. #include "QObjects/include/QGISAlgorithmLib.h"
  20. #include "QObjects/include/QGlobalObj.h"
  21. #include "QDlg/DlgLayerManager.h"
  22. #include "QDlg/qdlgptattset.h"
  23. #include "QDlg/dlgmapattset.h"
  24. #include "QDlg/DlgLineAttSet.h"
  25. #include "QDlg/DlgLineBeThin.h"
  26. #include "QDlg/QDlgTextSet.h"
  27. #include "QObjects/include/QTextObj.h"
  28. #include "QReadExcelToMap.h"
  29. #ifdef _DEBUG
  30. #define new DEBUG_NEW
  31. #undef THIS_FILE
  32. static char THIS_FILE[] = __FILE__;
  33. #endif
  34. // extern int g_nPixelsPerInchX;
  35. // extern int g_nPixelsPerInchY;
  36. // extern double g_fEffectiveDistance;
  37. /////////////////////////////////////////////////////////////////////////////
  38. // CQGISView
  39. IMPLEMENT_DYNCREATE(CQGISView, CView)
  40. BEGIN_MESSAGE_MAP(CQGISView, CView)
  41. //{{AFX_MSG_MAP(CQGISView)
  42. ON_WM_LBUTTONDOWN()
  43. ON_WM_LBUTTONUP()
  44. ON_WM_MOUSEMOVE()
  45. ON_WM_RBUTTONDOWN()
  46. ON_WM_CANCELMODE()
  47. ON_COMMAND(IDM_MENU_ADD_LINE_QGIS, OnMenuAddLineQgis)
  48. ON_COMMAND(IDM_MENU_ADD_POINT_QGIS, OnMenuAddPointQgis)
  49. ON_WM_SETCURSOR()
  50. ON_COMMAND(IDM_MENU_SET_MAP_ATT, OnMenuSetMapAtt)
  51. ON_WM_SIZE()
  52. ON_COMMAND(IDM_MENU_PT_SELECT_OBJ_QGIS, OnMenuPtSelectObjQgis)
  53. ON_WM_TIMER()
  54. ON_COMMAND(IDM_MENU_USELECT_OBJ_QGIS, OnMenuUselectObjQgis)
  55. ON_COMMAND(IDM_MENU_LINE_ATT_SET, OnMenuLineAttSet)
  56. ON_UPDATE_COMMAND_UI(IDM_MENU_LINE_ATT_SET, OnUpdateMenuLineAttSet)
  57. ON_COMMAND(IDM_MENU_RECT_SELECT_OBJ_QGIS, OnMenuRectSelectObjQgis)
  58. ON_COMMAND(IDM_MENU_DELETE_OBJ_QGIS, OnMenuDeleteObjQgis)
  59. ON_COMMAND(IDM_MENU_ADD_POLYLINE, OnMenuAddPolyline)
  60. ON_COMMAND(ID_EDIT_BUTTON_ARROW, OnEditButtonArrow)
  61. ON_COMMAND(IDM_MENU_MOVE_OBJ_QGIS, OnMenuMoveObjQgis)
  62. ON_UPDATE_COMMAND_UI(IDM_MENU_MOVE_OBJ_QGIS, OnUpdateMenuMoveObjQgis)
  63. ON_COMMAND(IDM_MENU_HIDE_OBJ_QGIS, OnMenuHideObjQgis)
  64. ON_UPDATE_COMMAND_UI(IDM_MENU_HIDE_OBJ_QGIS, OnUpdateMenuHideObjQgis)
  65. ON_COMMAND(IDM_MENU_SHOW_OBJ_QGIS, OnMenuShowObjQgis)
  66. ON_COMMAND(IDM_MENU_ROTATE_OBJ_QGIS, OnMenuRotateObjQgis)
  67. ON_UPDATE_COMMAND_UI(IDM_MENU_ROTATE_OBJ_QGIS, OnUpdateMenuRotateObjQgis)
  68. ON_COMMAND(IDM_MENU_CUT_LINE_QGIS, OnMenuCutLineQgis)
  69. ON_UPDATE_COMMAND_UI(IDM_MENU_CUT_LINE_QGIS, OnUpdateMenuCutLineQgis)
  70. ON_COMMAND(IDM_MENU_DELETE_LINE_QGIS, OnMenuDeleteLineQgis)
  71. ON_UPDATE_COMMAND_UI(IDM_MENU_DELETE_LINE_QGIS, OnUpdateMenuDeleteLineQgis)
  72. ON_COMMAND(IDM_MENU_MOVE_LINE_QGIS, OnMenuMoveLineQgis)
  73. ON_UPDATE_COMMAND_UI(IDM_MENU_MOVE_LINE_QGIS, OnUpdateMenuMoveLineQgis)
  74. ON_UPDATE_COMMAND_UI(IDM_MENU_ROTATE_LINE_QGIS, OnUpdateMenuRotateLineQgis)
  75. ON_COMMAND(IDM_MENU_ROTATE_LINE_QGIS, OnMenuRotateLineQgis)
  76. ON_COMMAND(IDM_MENU_LINK_LINE_QGIS_, OnMenuLinkLineQgis)
  77. ON_COMMAND(IDM_MENU_MIRROR_LINE_X_QGIS, OnMenuMirrorLineXQgis)
  78. ON_COMMAND(IDM_MENU_MIRROR_LINE_Y_QGIS, OnMenuMirrorLineYQgis)
  79. ON_COMMAND(IDM_MENU_MIRROR_O_QGIS, OnMenuMirrorOQgis)
  80. ON_COMMAND(IDM_MENU_ADD_RECT_QGIS, OnMenuAddRectQgis)
  81. ON_COMMAND(IDM_MENU_LAYER_MANAGER_QGIS, OnMenuLayerManagerQgis)
  82. ON_COMMAND(IDM_MENU_ADD_CIRCLE_QGIS, OnMenuAddCircleQgis)
  83. ON_COMMAND(IDM_MENU_ADD_ELLIPSE_QGIS, OnMenuAddEllipseQgis)
  84. ON_UPDATE_COMMAND_UI(IDM_MENU_POINT_ATTSET_QGIS, OnUpdateMenuPointAttsetQgis)
  85. ON_COMMAND(IDM_MENU_POINT_ATTSET_QGIS, OnMenuPointAttsetQgis)
  86. ON_COMMAND(IDM_MENU_LINK_POINT_TO_LINE_QGIS, OnMenuLinkPointToLineQgis)
  87. ON_COMMAND(IDM_MENU_ADD_POLYLINE_STREAM, OnMenuAddPolylineStream)
  88. ON_COMMAND(IDM_MENU_REFRESH_VIEW, OnMenuRefreshView)
  89. ON_COMMAND(IDM_MENU_DRAW_ALLOBJ_IN_VIEW, OnMenuDrawAllobjInView)
  90. ON_COMMAND(ID_MENU_MOVE_MAP, OnMenuMoveMap)
  91. ON_COMMAND(IDM_MENU_AXIS_QGIS, OnMenuAxisQgis)
  92. //}}AFX_MSG_MAP
  93. // Standard printing commands
  94. ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
  95. ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
  96. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
  97. ON_UPDATE_COMMAND_UI(ID_MENU_INTERPRETATION_CURVE, &CQGISView::OnUpdateMenuInterpretationCurve)
  98. ON_UPDATE_COMMAND_UI(ID_MENU_TWICE_BCURVE, &CQGISView::OnUpdateMenuTwiceBcurve)
  99. ON_UPDATE_COMMAND_UI(ID_MENU_THIRD_BCURVE, &CQGISView::OnUpdateMenuThirdBcurve)
  100. ON_COMMAND(ID_MENU_INTERPRETATION_CURVE, &CQGISView::OnMenuInterpretationCurve)
  101. ON_COMMAND(ID_MENU_TWICE_BCURVE, &CQGISView::OnMenuTwiceBcurve)
  102. ON_COMMAND(ID_MENU_THIRD_BCURVE, &CQGISView::OnMenuThirdBcurve)
  103. ON_COMMAND(IDM_MENU_SELECT_POINT_QGIS, &CQGISView::OnMenuSelectPointQgis)
  104. ON_COMMAND(IDM_MENU_PT_LINK_TO_LINE_QGIS, &CQGISView::OnMenuPtLinkToLineQgis)
  105. ON_UPDATE_COMMAND_UI(IDM_MENU_PT_LINK_TO_LINE_QGIS, &CQGISView::OnUpdateMenuPtLinkToLineQgis)
  106. ON_COMMAND(ID_MENU_ADD_VERVICAL_LINE_QGIS, &CQGISView::OnMenuAddVervicalLineQgis)
  107. ON_COMMAND(ID_MENU_ADD_HORI_LINE_QGIS, &CQGISView::OnMenuAddHoriLineQgis)
  108. ON_COMMAND(ID_DGLSPK_LINE_GETPT_QGIS, &CQGISView::OnDglspkLineGetptQgis)
  109. ON_UPDATE_COMMAND_UI(ID_DGLSPK_LINE_GETPT_QGIS, &CQGISView::OnUpdateDglspkLineGetptQgis)
  110. ON_COMMAND(ID_MENU_ADD_TEXT_QGIS, &CQGISView::OnMenuAddTextQgis)
  111. ON_COMMAND(IDM_MENU_TEXT_PARA_SET, &CQGISView::OnMenuTextParaSet)
  112. ON_COMMAND(ID_MENU_READ_EXCEL_QGIS, &CQGISView::OnMenuReadExcelQgis)
  113. END_MESSAGE_MAP()
  114. /////////////////////////////////////////////////////////////////////////////
  115. // CQGISView construction/destruction
  116. CQGISView::CQGISView()
  117. {
  118. // TODO: add construction code here
  119. m_nLbtDown = 0;
  120. m_ptBegin = CQPoint(0,0);
  121. m_ptOld = CQPoint(0,0);
  122. m_ptEnd = CQPoint(0,0);
  123. m_bDrawAxis = FALSE;
  124. m_nSelectType = QGIS_SELECT_UNKNOWN;
  125. }
  126. CQGISView::~CQGISView()
  127. {
  128. m_nLbtDown = 0;
  129. m_bDrawAxis = FALSE;
  130. m_nSelectType = QGIS_SELECT_UNKNOWN;
  131. }
  132. BOOL CQGISView::PreCreateWindow(CREATESTRUCT& cs)
  133. {
  134. // TODO: Modify the Window class or styles here by modifying
  135. //  the CREATESTRUCT cs
  136. return CView::PreCreateWindow(cs);
  137. }
  138. /////////////////////////////////////////////////////////////////////////////
  139. // CQGISView drawing
  140. void CQGISView::OnDraw(CDC* pDC)
  141. {
  142. CQGISDoc* pDoc = GetDocument();
  143. ASSERT_VALID(pDoc);
  144. CQCoordSys * pSys = pDoc->m_pMap->GetCoordSysPointer();
  145. ASSERT_VALID(pSys);
  146. g_QObj.g_nPixelsPerInchX = pDC->GetDeviceCaps(LOGPIXELSX);
  147. g_QObj.g_nPixelsPerInchY = pDC->GetDeviceCaps(LOGPIXELSY);
  148. COLORREF cl = RGB(0,0,255);
  149. CQMapObj * pMap = pDoc->m_pMap;
  150. pMap->Display(pSys,pDC,R2_COPYPEN,0,&cl);
  151. long lWndX = 0,lWndY = 0;
  152. //DrawAxis(m_bDrawAxis,pDC,lWndX,lWndY);
  153. }
  154. /////////////////////////////////////////////////////////////////////////////
  155. // CQGISView printing
  156. BOOL CQGISView::OnPreparePrinting(CPrintInfo* pInfo)
  157. {
  158. // default preparation
  159. return DoPreparePrinting(pInfo);
  160. }
  161. void CQGISView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  162. {
  163. // TODO: add extra initialization before printing
  164. }
  165. void CQGISView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  166. {
  167. // TODO: add cleanup after printing
  168. }
  169. /////////////////////////////////////////////////////////////////////////////
  170. // CQGISView diagnostics
  171. #ifdef _DEBUG
  172. void CQGISView::AssertValid() const
  173. {
  174. CView::AssertValid();
  175. }
  176. void CQGISView::Dump(CDumpContext& dc) const
  177. {
  178. CView::Dump(dc);
  179. }
  180. CQGISDoc* CQGISView::GetDocument() // non-debug version is inline
  181. {
  182. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CQGISDoc)));
  183. return (CQGISDoc*)m_pDocument;
  184. }
  185. #endif //_DEBUG
  186. /////////////////////////////////////////////////////////////////////////////
  187. // CQGISView message handlers
  188. void CQGISView::OnLButtonDown(UINT nFlags, CPoint point) 
  189. {
  190. // TODO: Add your message handler code here and/or call default
  191. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  192. ASSERT(pDoc);
  193. CQMapObj * pMap = pDoc->m_pMap;
  194. ASSERT(pMap);
  195. CQCoordSys * pCoordSys = pMap->GetCoordSysPointer();
  196. ASSERT(pCoordSys);
  197. CDC * pDC = GetDC();
  198. CQSelObjManager * pSM = pMap->GetSelObjManager();
  199. ASSERT(pSM);
  200. CQPoint ptWorld;
  201. pCoordSys->LPtoWP(point,&ptWorld);
  202. static int nDrawEllipseTimes = 0; //绘制椭圆的次数
  203. //在第一次绘制椭圆的时候会弹出对话框,提示如何绘制
  204. switch(pDoc->m_MenuItemID)
  205. {
  206. case IDM_MENU_ADD_POINT_QGIS:   //添加点图元
  207. {
  208. CQPointObj * ptObj = new CQPointObj(ptWorld);
  209. ptObj->SetObjMapID(pMap->GetMapID());
  210. ptObj->SetObjLayerID(pMap->GetCurLayer()->GetLayerID());
  211. CBoundaryRect BRect;
  212. ptObj->GetBoundingRect(&BRect);
  213. pMap->AddObject(ptObj);
  214. CRect rect;
  215. pCoordSys->WPtoLP(BRect,&rect);
  216. InvalidateRect(rect);
  217. break;
  218. }
  219. case IDM_MENU_ADD_LINE_QGIS:   //添加线图元 两点直线 非折线对象 折线对象需要通过右键结束操作
  220. {
  221. if(m_nLbtDown == 0)    //当鼠标第一次点击
  222. {
  223. SetCapture();      //捕捉鼠标指针
  224. m_ptBegin = ptWorld;
  225. m_ptOld = ptWorld;
  226. m_ptEnd = ptWorld;
  227. m_nLbtDown++;
  228. }
  229. else
  230. {
  231. m_nLbtDown = 0;
  232. m_ptEnd = ptWorld;
  233. CQLineObj * pLine = new CQLineObj;
  234. pLine->SetObjMapID(pMap->GetMapID());
  235. pLine->SetObjLayerID(pMap->GetCurLayer()->GetLayerID());
  236. pLine->m_PtList.AddPoint(&m_ptBegin);
  237. pLine->m_PtList.AddPoint(&m_ptEnd);
  238. int n = pLine->m_PtList.GetSize();
  239. CBoundaryRect BRect;
  240. CRect rect;
  241. pLine->CalculateBoundary(&BRect);
  242. pMap->AddObject(pLine);
  243. pCoordSys->WPtoLP(BRect,&rect);
  244. InvalidateRect(rect,TRUE);
  245. ReleaseCapture();
  246. }
  247. break;
  248. }
  249. case IDM_MENU_PT_SELECT_OBJ_QGIS:  // 鼠标点选对象
  250. {
  251. if(m_nLbtDown==0)
  252. {
  253. m_ptBegin = ptWorld;
  254. m_nLbtDown++;
  255. }
  256. break;
  257. }
  258. case IDM_MENU_RECT_SELECT_OBJ_QGIS: //矩形选择
  259. {
  260. if(m_nLbtDown == 0)
  261. {
  262. m_ptBegin = ptWorld;
  263. m_ptOld = ptWorld;
  264. m_nLbtDown++;
  265. }
  266. break;
  267. }
  268. case IDM_MENU_ADD_POLYLINE:  //添加折线
  269. {
  270. if(m_nLbtDown == 0)
  271. {
  272. m_ptBegin = ptWorld;
  273. m_ptOld = ptWorld;
  274. m_ptEnd = ptWorld;
  275. m_nLbtDown++;
  276. m_ptArray.DeleteAll();
  277. m_ptArray.AddPoint(m_ptBegin.GetX(),m_ptBegin.GetY());
  278. SetCapture();
  279. }
  280. else
  281. {
  282. if(m_ptBegin != ptWorld)
  283. {
  284. m_ptBegin = ptWorld;
  285. m_ptOld = ptWorld;
  286. m_ptEnd = ptWorld;
  287. m_ptArray.AddPoint(ptWorld.GetX(),ptWorld.GetY());
  288. m_nLbtDown++;
  289. }
  290. }
  291. break;
  292. }
  293. case IDM_MENU_MOVE_LINE_QGIS:
  294. case IDM_MENU_MOVE_OBJ_QGIS:
  295. {
  296. if(pSM->GetSelObjCount()<=0)break;
  297. if(m_nLbtDown == 0)
  298. {
  299. m_ptBegin = ptWorld;
  300. m_ptOld = ptWorld;
  301. m_nLbtDown++;
  302. SetCapture();
  303. }
  304. else
  305. {
  306. double dx = ptWorld.GetX() - m_ptBegin.GetX();
  307. double dy = ptWorld.GetY() - m_ptBegin.GetY();
  308. int nSelObj = pSM->GetSelObjCount();
  309. POSITION pos = pSM->GetHeadPosition();
  310. while (pos)
  311. {
  312. CQBaseObj * pObj = pSM->GetNext(pos);
  313. COLORREF cl = pObj->GetObjPenColor();
  314. if(pObj && !pObj->GetObjDeleted() && !pObj->GetObjHided())
  315. {
  316. pObj->Display(pCoordSys,pDC,R2_COPYPEN,0,&cl);
  317. }
  318. }
  319. m_nLbtDown = 0;
  320. ReleaseCapture();
  321. InvalidateRect(NULL,TRUE);
  322. }
  323. break;
  324. }
  325. case IDM_MENU_ROTATE_LINE_QGIS:
  326. case IDM_MENU_ROTATE_OBJ_QGIS:  //图元的旋转
  327. {
  328. if(m_nLbtDown == 0)  //第一次鼠标电击 记录点位坐标
  329. {
  330. m_ptBegin = ptWorld;
  331. m_ptOld = ptWorld;
  332. m_ptEnd = ptWorld;
  333. SetCapture();
  334. m_nLbtDown++;
  335. }
  336. else
  337. {
  338. POSITION pos = pSM->GetHeadPosition();
  339. while (pos)
  340. {
  341. CQBaseObj * pObj = pSM->GetNext(pos);
  342. COLORREF cl = pObj->GetObjPenColor();
  343. if(pObj && !pObj->GetObjDeleted() && !pObj->GetObjHided())
  344. {
  345. pObj->Display(pCoordSys,pDC,R2_COPYPEN,0,&cl);
  346. }
  347. }
  348. m_nLbtDown = 0;
  349. ReleaseCapture();
  350. InvalidateRect(NULL,TRUE);
  351. }
  352. break;
  353. }
  354. case IDM_MENU_CUT_LINE_QGIS: //剪断线
  355. {
  356. if(m_nLbtDown == 0)
  357. {
  358. m_ptBegin = ptWorld;
  359. m_nLbtDown++;
  360. SetCapture();
  361. }
  362. break;
  363. }
  364. case IDM_MENU_MIRROR_LINE_X_QGIS:
  365. {
  366. static BOOL bSelected1 = FALSE;
  367. if(m_nLbtDown == 0)  //假如是第一次点击
  368. {
  369. m_ptBegin = ptWorld;
  370. m_nLbtDown++;
  371. pSM->RemoveAllSelObj();
  372. if(pMap->Select(pSM,pCoordSys,m_ptBegin,g_QObj.g_fEffectiveDistance))
  373. {
  374. pSM->BeginFlash((CWnd *)this,2,1000);
  375. pSM->FlashObj(pCoordSys,this->GetSafeHwnd());
  376. bSelected1 = TRUE;
  377. }
  378. else
  379. {
  380. bSelected1 = FALSE;
  381. m_nLbtDown = 0;
  382. }
  383. }
  384. else if(m_nLbtDown == 1 && bSelected1)
  385. {
  386. m_ptOld = ptWorld;
  387. m_nLbtDown = 0;
  388. CQBaseObj * pObj = (CQBaseObj *)pSM->GetCurSelObj();
  389. if(pObj->GetObjType() != QGIS_OBJ_LINE) break;
  390. CQLineObj * pOldLine = NULL;
  391. pOldLine = (CQLineObj *)pObj;
  392. if(!pOldLine)break;
  393. CQLineObj * pNewLine = new CQLineObj;
  394. pOldLine->Mirror(1,m_ptOld,pNewLine);
  395. if(pNewLine->m_PtList.GetSize()<=1)
  396. {
  397. delete pNewLine;
  398. break;           //镜像操作失败 
  399. }
  400. else
  401. {
  402. CQLayerObj * pMirrorLayer = NULL;
  403. pMirrorLayer = pMap->FindLayer(pOldLine->GetObjLayerID());
  404. if(!pMirrorLayer)break;
  405. pNewLine->CalculateBoundary(NULL);
  406. pMirrorLayer->AddObject(pNewLine);
  407. pNewLine->SetObjLayerID(pOldLine->GetObjLayerID());
  408. pNewLine->SetObjMapID(pOldLine->GetObjMapID());
  409. pSM->EndFlash((CWnd *)this,2);
  410. }
  411. Invalidate();
  412. }
  413. break;
  414. }
  415. case IDM_MENU_MIRROR_LINE_Y_QGIS:
  416. {
  417. static BOOL bSelected1 = FALSE;
  418. if(m_nLbtDown == 0)  //假如是第一次点击
  419. {
  420. m_ptBegin = ptWorld;
  421. m_nLbtDown++;
  422. pSM->RemoveAllSelObj();
  423. if(pMap->Select(pSM,pCoordSys,m_ptBegin,g_QObj.g_fEffectiveDistance))
  424. {
  425. pSM->BeginFlash((CWnd *)this,2,1000);
  426. pSM->FlashObj(pCoordSys,this->GetSafeHwnd());
  427. bSelected1 = TRUE;
  428. }
  429. else
  430. {
  431. bSelected1 = FALSE;
  432. m_nLbtDown = 0;
  433. }
  434. }
  435. else if(m_nLbtDown == 1 && bSelected1)
  436. {
  437. m_ptOld = ptWorld;
  438. m_nLbtDown = 0;
  439. CQBaseObj * pObj = (CQBaseObj *)pSM->GetCurSelObj();
  440. if(pObj->GetObjType() != QGIS_OBJ_LINE) break;
  441. CQLineObj * pOldLine = NULL;
  442. pOldLine = (CQLineObj *)pObj;
  443. if(!pOldLine)break;
  444. CQLineObj * pNewLine = new CQLineObj;
  445. pOldLine->Mirror(0,m_ptOld,pNewLine);
  446. if(pNewLine->m_PtList.GetSize()<=1)
  447. {
  448. delete pNewLine;
  449. break;           //镜像操作失败 
  450. }
  451. else
  452. {
  453. CQLayerObj * pMirrorLayer = NULL;
  454. pMirrorLayer = pMap->FindLayer(pOldLine->GetObjLayerID());
  455. if(!pMirrorLayer)break;
  456. pNewLine->CalculateBoundary(NULL);
  457. pMirrorLayer->AddObject(pNewLine);
  458. pNewLine->SetObjLayerID(pOldLine->GetObjLayerID());
  459. pNewLine->SetObjMapID(pOldLine->GetObjMapID());
  460. pSM->EndFlash((CWnd *)this,2);
  461. }
  462. Invalidate();
  463. }
  464. break;
  465. }
  466. case IDM_MENU_MIRROR_O_QGIS:
  467. {
  468. static BOOL bSelected1 = FALSE;
  469. if(m_nLbtDown == 0)  //假如是第一次点击
  470. {
  471. m_ptBegin = ptWorld;
  472. m_nLbtDown++;
  473. pSM->RemoveAllSelObj();
  474. if(pMap->Select(pSM,pCoordSys,m_ptBegin,g_QObj.g_fEffectiveDistance))
  475. {
  476. pSM->BeginFlash((CWnd *)this,2,1000);
  477. pSM->FlashObj(pCoordSys,this->GetSafeHwnd());
  478. bSelected1 = TRUE;
  479. }
  480. else
  481. {
  482. bSelected1 = FALSE;
  483. m_nLbtDown = 0;
  484. }
  485. }
  486. else if(m_nLbtDown == 1 && bSelected1)
  487. {
  488. m_ptOld = ptWorld;
  489. m_nLbtDown = 0;
  490. CQBaseObj * pObj = (CQBaseObj *)pSM->GetCurSelObj();
  491. if(pObj->GetObjType() != QGIS_OBJ_LINE) break;
  492. CQLineObj * pOldLine = NULL;
  493. pOldLine = (CQLineObj *)pObj;
  494. if(!pOldLine)break;
  495. CQLineObj * pNewLine = new CQLineObj;
  496. pOldLine->Mirror(2,m_ptOld,pNewLine);
  497. if(pNewLine->m_PtList.GetSize()<=1)
  498. {
  499. delete pNewLine;
  500. break;           //镜像操作失败 
  501. }
  502. else
  503. {
  504. CQLayerObj * pMirrorLayer = NULL;
  505. pMirrorLayer = pMap->FindLayer(pOldLine->GetObjLayerID());
  506. if(!pMirrorLayer)break;
  507. pNewLine->CalculateBoundary(NULL);
  508. pMirrorLayer->AddObject(pNewLine);
  509. pNewLine->SetObjLayerID(pOldLine->GetObjLayerID());
  510. pNewLine->SetObjMapID(pOldLine->GetObjMapID());
  511. pSM->EndFlash((CWnd *)this,2);
  512. }
  513. Invalidate();
  514. }
  515. break;
  516. }
  517. case IDM_MENU_LINK_LINE_QGIS_: //连接线
  518. {
  519. static BOOL bSelected1 = FALSE;
  520. if(m_nLbtDown == 0)  //假如是第一次点击
  521. {
  522. m_ptBegin = ptWorld;
  523. m_nLbtDown++;
  524. pSM->RemoveAllSelObj();
  525. if(pMap->Select(pSM,pCoordSys,m_ptBegin,g_QObj.g_fEffectiveDistance))
  526. {
  527. pSM->BeginFlash((CWnd *)this,2,1000);
  528. pSM->FlashObj(pCoordSys,this->GetSafeHwnd());
  529. bSelected1 = TRUE;
  530. }
  531. else
  532. {
  533. bSelected1 = FALSE;
  534. m_nLbtDown = 0;
  535. }
  536. }
  537. else if(m_nLbtDown == 1)
  538. {
  539. if(bSelected1 == TRUE)
  540. {
  541. m_ptOld = ptWorld;
  542. if(pMap->Select(pSM,pCoordSys,m_ptOld,g_QObj.g_fEffectiveDistance))
  543. {
  544. pSM->BeginFlash((CWnd *)this,2,1000);
  545. pSM->FlashObj(pCoordSys,this->GetSafeHwnd());
  546. m_nLbtDown = 0;
  547. int nSelObjCount = pSM->GetSelObjCount();
  548. if(nSelObjCount != 2)break;
  549. POSITION pos = pSM->GetHeadPosition();
  550. CQBaseObj * pObj1 = (CQBaseObj *)pSM->GetNext(pos);
  551. CQBaseObj * pObj2 = (CQBaseObj *)pSM->GetNext(pos);
  552. if(pObj1->GetObjType() != QGIS_OBJ_LINE || pObj2->GetObjType() != QGIS_OBJ_LINE)
  553. {
  554. break;
  555. }
  556. else
  557. {
  558. CQLineObj * pLine1 = (CQLineObj *)pObj1;
  559. CQLineObj * pLine2 = (CQLineObj *)pObj2;
  560. int nPtNum1 = pLine1->m_PtList.GetSize();
  561. int nPtNum2 = pLine2->m_PtList.GetSize();
  562. if(nPtNum1 == 0 || nPtNum2 == 0)break;
  563. CQPoint * ptEndLine1 = NULL;
  564. ptEndLine1 = pLine1->m_PtList.GetPoint(nPtNum1-1); // 取得第一条线的终点
  565. CQPoint * ptBeginLine2 = NULL;
  566. ptBeginLine2 = pLine2->m_PtList.GetPoint(0);
  567. CQPoint * ptEndLine2 = NULL;
  568. ptEndLine2 = pLine2->m_PtList.GetPoint(nPtNum2-1);
  569. if(!ptEndLine1 || !ptBeginLine2 || !ptEndLine2)break;
  570. double dDis1 = ptEndLine1->Distance(*ptBeginLine2);
  571. double dDis2 = ptEndLine1->Distance(*ptEndLine2);
  572. if(dDis1-dDis2<=1e-5) // 第一条线的终点离第二条线的起点近
  573. {
  574. //从第一个点开始装
  575. int nPtNUm = pLine2->m_PtList.GetSize();
  576. for(int n=0;n<nPtNUm;n++)
  577. {
  578. pLine1->m_PtList.AddPoint(pLine2->m_PtList.GetPoint(n));
  579. }
  580. }
  581. else
  582. {
  583. //从最后一个点开始装
  584. int nptNum = pLine2->m_PtList.GetSize();
  585. for(int m=nptNum-1;m>=0;m--)
  586. {
  587. pLine1->m_PtList.AddPoint(pLine2->m_PtList.GetPoint(m));
  588. }
  589. }
  590. CQLayerObj * pLayer = NULL;
  591. pLayer = pMap->FindLayer(pLine2->GetObjLayerID());
  592. if(!pLayer)break;
  593. pLayer->Deleteobject(pLine2);
  594. pLine2 = NULL;
  595. CBoundaryRect Brect;
  596. pLine1->CalculateBoundary(&Brect);
  597. CRect rect;
  598. pCoordSys->WPtoLP(Brect,&rect);
  599. pSM->EndFlash((CWnd *)this,2);
  600. InvalidateRect(rect,TRUE);
  601. }
  602. }
  603. }
  604. }
  605. break;
  606. }
  607. case IDM_MENU_ADD_RECT_QGIS:
  608. {
  609. if(m_nLbtDown == 0) //假如是鼠标第一次点击
  610. {
  611. m_ptBegin = ptWorld;
  612. m_ptOld = ptWorld;
  613. m_ptEnd = ptWorld;
  614. m_nLbtDown++;
  615. SetCapture();
  616. }
  617. else if(m_nLbtDown == 1)
  618. {
  619. m_nLbtDown = 0;
  620. m_ptEnd = ptWorld;
  621. if(m_ptEnd != m_ptBegin)
  622. {
  623. CQLineObj * pNewLine = new CQLineObj;
  624. CQPoint pt1,pt2;
  625. pt1.SetPoint(m_ptBegin.GetX(),m_ptEnd.GetY());
  626. pt2.SetPoint(m_ptEnd.GetX(),m_ptBegin.GetY());
  627. pNewLine->m_PtList.AddPoint(&m_ptBegin);
  628. pNewLine->m_PtList.AddPoint(&pt1);
  629. pNewLine->m_PtList.AddPoint(&m_ptEnd);
  630. pNewLine->m_PtList.AddPoint(&pt2);
  631. pNewLine->m_PtList.AddPoint(&m_ptBegin);
  632. pNewLine->SetLineClosed(TRUE);
  633. pNewLine->SetObjMapID(pMap->GetMapID());
  634. pNewLine->SetObjLayerID(pMap->GetCurLayer()->GetLayerID());
  635. CBoundaryRect Brect;
  636. pNewLine->CalculateBoundary(&Brect);
  637. double dStep = 5.0;
  638. Brect.Lager(dStep);
  639. pMap->AddObject(pNewLine);
  640. CRect rectTemp;
  641. pCoordSys->WPtoLP(Brect,&rectTemp);
  642. InvalidateRect(rectTemp,TRUE);
  643. ReleaseCapture();
  644. }
  645. }
  646. break;
  647. }
  648. case IDM_MENU_ADD_CIRCLE_QGIS:  //鼠标画圆
  649. {
  650. if(m_nLbtDown == 0)     //如果是 第一次单击
  651. {
  652. m_nLbtDown += 1;
  653. m_ptBegin = ptWorld;
  654. m_ptOld = ptWorld;
  655. m_ptEnd = ptWorld;
  656. SetCapture();       //捕捉鼠标
  657. }
  658. else if(m_nLbtDown == 1 && m_ptBegin != ptWorld)//假如是第二次单击
  659. {
  660. m_ptEnd = ptWorld;
  661. long rCr = (GetEndPos().x - GetBeginPos().x)*(GetEndPos().x - GetBeginPos().x) +
  662. (GetEndPos().y - GetBeginPos().y)*(GetEndPos().y - GetBeginPos().y);
  663. rCr = static_cast<long>(sqrt(static_cast<double>(rCr)));
  664. double fR = pCoordSys->LLtoWL(rCr);
  665. if(fR>0)
  666. {
  667. CQEllipseObj * pCircle = new CQEllipseObj(m_ptBegin.GetX(),m_ptBegin.GetY(),fR,fR,0,2*PI,0);
  668. pMap->AddObject(pCircle);
  669. CBoundaryRect bRect;
  670. pCircle->CalculateBoundary(&bRect);
  671. bRect.Lager(3);
  672. CRect rect;
  673. pCoordSys->WPtoLP(bRect,&rect);
  674. InvalidateRect(rect,TRUE);
  675. }
  676. m_nLbtDown = 0;
  677. ReleaseCapture();
  678. break;
  679. }
  680. break;
  681. }
  682. case IDM_MENU_ADD_ELLIPSE_QGIS:
  683. {
  684. if(m_nLbtDown == 0)
  685. {
  686. m_nLbtDown++;
  687. SetCapture();
  688. m_ptBegin = ptWorld;
  689. m_ptOld = ptWorld;
  690. m_ptEnd = ptWorld;
  691. }
  692. else if(m_nLbtDown == 1 && m_ptBegin != ptWorld)
  693. {
  694. double dx = m_ptBegin.GetX()-ptWorld.GetX();
  695. double dy = m_ptBegin.GetY()-ptWorld.GetY();
  696. double fLongAxis = sqrt(dx*dx + dy*dy)/2.0;
  697. m_Ellipse.SetLongAxis(fLongAxis);
  698. m_Ellipse.SetShortAxis(fLongAxis); // 在没有调整椭圆形状的时候 先让其形状为圆形
  699. double dcx = (m_ptBegin.GetX()+ptWorld.GetX())/2.0;
  700. double dcy = (m_ptBegin.GetY()+ptWorld.GetY())/2.0;
  701. m_Ellipse.SetCenterPoint(dcx,dcy);
  702. ptCenter.SetPoint(dcx,dcy);
  703. m_Ellipse.SetStartAngleRad(0.0f);
  704. m_Ellipse.SetEndAngleRad(2*PI);
  705. double fRotateAngle = atan2(dy,dx);  //旋转角度
  706. if(fRotateAngle<0)fRotateAngle+=2*PI;
  707. else if(fRotateAngle>2*PI) fRotateAngle -= 2*PI;
  708. m_Ellipse.SetRotateAngleRad(fRotateAngle);
  709. pDC->SetROP2(R2_NOT);
  710. m_ptOld.SetPoint(dcx,dcy);
  711. COLORREF cl = RGB(0,0,0);
  712. DrawEllipse(m_Ellipse,pDC);
  713. pDC->MoveTo(GetBeginPos());     //擦除长轴线
  714. pDC->LineTo(point);
  715. m_nLbtDown++;
  716. }
  717. else if(m_nLbtDown == 2 && ptWorld != ptCenter)
  718. {
  719. m_Ellipse.GetCenterPoint(ptCenter);
  720. double dx = ptCenter.GetX()-ptWorld.GetX();
  721. double dy = ptCenter.GetY()-ptWorld.GetY(); //确定椭圆短轴
  722. double fShortAxis = sqrt(dx*dx+dy*dy);
  723. m_Ellipse.SetShortAxis(fShortAxis);
  724. double fflag = max(abs(m_ptBegin.GetX()-ptWorld.GetX()),abs(m_ptEnd.GetY()-ptWorld.GetY()));
  725. if(fflag>0)
  726. {
  727. CQEllipseObj * pElipse = NULL;
  728. pElipse = CreateEllipse(m_Ellipse);
  729. if(pElipse)
  730. {
  731. pMap->AddObject(pElipse);
  732. CBoundaryRect bRect;
  733. pElipse->CalculateBoundary(&bRect);
  734. bRect.Lager(3.0);
  735. CRect rect;
  736. pCoordSys->WPtoLP(bRect,&rect);
  737. InvalidateRect(rect,TRUE);
  738. m_nLbtDown = 0;
  739. ReleaseCapture();
  740. }
  741. else
  742. {
  743. m_nLbtDown = 0;
  744. ReleaseCapture();
  745. }
  746. }
  747. }
  748. break;
  749. }
  750. case IDM_MENU_ADD_POLYLINE_STREAM: //造流线
  751. {
  752. if(m_nLbtDown == 0)        //鼠标第一次单击
  753. {
  754. m_ptBegin = ptWorld;
  755. m_ptOld = ptWorld;
  756. m_ptEnd = ptWorld;
  757. SetCapture();          //设置鼠标捕捉
  758. m_ptArray.AddPoint(ptWorld.GetX(),ptWorld.GetY());
  759. m_nLbtDown++;
  760. }
  761. break;
  762. }
  763. case ID_MENU_MOVE_MAP:
  764. {
  765. if(m_nLbtDown == 0) //假如是第一次单击视图
  766. {
  767. ++m_nLbtDown;
  768. m_ptBegin = ptWorld;
  769. m_ptOld = ptWorld;
  770. m_ptEnd = ptWorld;
  771. m_bDrawAxis = FALSE;
  772. SetCapture();
  773. long lOrX,lOrY;
  774. pCoordSys->GetStartOfWnd(lOrX,lOrY);
  775. CRect rectAxis = DrawAxis(m_bDrawAxis,pDC,lOrX,lOrY);
  776. InvalidateRect(rectAxis,TRUE);
  777. }
  778. break;
  779. }
  780. case IDM_MENU_LINK_POINT_TO_LINE_QGIS: //连点成线
  781. {
  782. if(m_nLbtDown == 0) // 第一次点击
  783. {
  784. pSM->RemoveAllSelObj(); //清空选择列表
  785. SetCapture();
  786. if(pMap->SingleSelect(pSM,pCoordSys,ptWorld,g_QObj.g_fEffectiveDistance,QGIS_OBJ_POINT) == 0)
  787. {
  788. m_nLbtDown = 0;
  789. break;
  790. }
  791. else
  792. {
  793. m_nLbtDown++;
  794. CQBaseObj * pObj = pSM->GetCurSelObj();
  795. if(pObj->GetObjType() == QGIS_OBJ_POINT)
  796. {
  797. m_vecObj.push_back(pObj);
  798. }
  799. }
  800. }
  801. else //  点击一次以上
  802. {
  803. if(pMap->SingleSelect(pSM,pCoordSys,ptWorld,g_QObj.g_fEffectiveDistance,QGIS_OBJ_POINT) == 0)
  804. {
  805. break;
  806. }
  807. else
  808. {
  809. m_nLbtDown++;
  810. CQBaseObj * pObj = pSM->GetCurSelObj();
  811. if(pObj->GetObjType() == QGIS_OBJ_POINT)
  812. {
  813. m_vecObj.push_back(pObj);
  814. }
  815. }
  816. }
  817. pSM->RemoveAll();
  818. break;
  819. }
  820. case ID_MENU_ADD_HORI_LINE_QGIS: //添加水平线
  821. //水平线只改变线条的X坐标而Y坐标不变
  822. {
  823. if(m_nLbtDown == 0)
  824. {
  825. SetCapture();
  826. m_ptBegin = ptWorld;
  827. m_ptOld = ptWorld;
  828. m_ptEnd = ptWorld;
  829. m_nLbtDown++;
  830. }
  831. else
  832. {
  833. m_ptEnd = ptWorld;
  834. CBoundaryRect bRect;
  835. CRect rect;
  836. CQLineObj * pHorLine = new CQLineObj;
  837. pHorLine->m_PtList.AddPoint(m_ptBegin.GetX(),m_ptBegin.GetY());
  838. pHorLine->m_PtList.AddPoint(m_ptEnd.GetX(),m_ptBegin.GetY());
  839. pHorLine->CalculateBoundary(&bRect);
  840. pCoordSys->WPtoLP(bRect,&rect);
  841. pMap->AddObject(pHorLine);
  842. InvalidateRect(rect,TRUE);
  843. m_nLbtDown = 0;
  844. ReleaseCapture();
  845. }
  846. break;
  847. }
  848. case ID_MENU_ADD_VERVICAL_LINE_QGIS:
  849. {
  850. if(m_nLbtDown == 0)
  851. {
  852. SetCapture();
  853. m_nLbtDown++;
  854. m_ptBegin = ptWorld;
  855. m_ptOld = ptWorld;
  856. m_ptEnd = ptWorld;
  857. }
  858. else
  859. {
  860. CBoundaryRect bRect;
  861. CRect rect;
  862. CQLineObj * pVerLine = new CQLineObj;
  863. m_ptEnd = ptWorld;
  864. pVerLine->m_PtList.AddPoint(m_ptBegin.GetX(),m_ptBegin.GetY());
  865. pVerLine->m_PtList.AddPoint(m_ptBegin.GetX(),m_ptEnd.GetY());
  866. pVerLine->CalculateBoundary(&bRect);
  867. pMap->AddObject(pVerLine);
  868. pCoordSys->WPtoLP(bRect,&rect);
  869. InvalidateRect(rect,TRUE);
  870. ReleaseCapture();
  871. m_nLbtDown = 0;
  872. }
  873. break;
  874. }
  875. case ID_MENU_ADD_TEXT_QGIS: //添加标住对象
  876. {
  877. CQTextObj * pTextObj = new CQTextObj;
  878. pTextObj->SetPos(ptWorld);
  879. QDlgTextSet dlg(pTextObj);
  880. if(dlg.DoModal() == IDOK)
  881. {
  882. CBoundaryRect bRect;
  883. CRect rect;
  884. pMap->AddObject(pTextObj);
  885. pTextObj->CalculateBoundary(&bRect);
  886. pCoordSys->WPtoLP(bRect,&rect);
  887. InvalidateRect(rect,TRUE);
  888. }
  889. else
  890. {
  891. delete pTextObj;
  892. pTextObj = NULL;
  893. }
  894. break;
  895. }
  896. case ID_MENU_READ_EXCEL_QGIS:
  897. {
  898. CQPoint ptExcelStartPt = ptWorld;
  899. CQReadExcelToView ReadExcelToMap(pMap,pCoordSys,ptExcelStartPt);
  900. CWaitCursor wait;
  901. BOOL bSuccess = ReadExcelToMap.ReadExcelFromPC();
  902. CBoundaryRect brect;
  903. pMap->CalculateBoundary(&brect);
  904. CRect rectMap;
  905. pCoordSys->WPtoLP(brect,&rectMap);
  906. if(bSuccess)
  907. {
  908. AfxMessageBox("Excel文件矢量化完成");
  909. }
  910. pDoc->m_MenuItemID = 0;
  911. break;
  912. }
  913. default:
  914. {
  915. m_nLbtDown = 0;
  916. break;
  917. }
  918. }
  919. CView::OnLButtonDown(nFlags, point);
  920. }
  921. void CQGISView::OnLButtonUp(UINT nFlags, CPoint point) 
  922. {
  923. // TODO: Add your message handler code here and/or call default
  924. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  925. ASSERT(pDoc);
  926. CQMapObj * pMap = pDoc->m_pMap;
  927. ASSERT(pMap);
  928. CQCoordSys * pCoordSys = pMap->GetCoordSysPointer();
  929. ASSERT(pCoordSys);
  930. CQSelObjManager * pSM = pMap->GetSelObjManager();
  931. ASSERT(pSM);
  932. CDC * pDC = GetDC();
  933. CQPoint ptWorld;
  934. pCoordSys->LPtoWP(point,&ptWorld);
  935. switch(pDoc->m_MenuItemID)
  936. {
  937. case IDM_MENU_PT_SELECT_OBJ_QGIS:
  938. {
  939. if(m_nLbtDown != 0)
  940. {
  941. pSM->RemoveAllSelObj(); //去除所有选中的图元对象
  942. if(pMap->Select(pSM,pCoordSys,ptWorld,g_QObj.g_fEffectiveDistance))
  943. {
  944. pSM->BeginFlash((CWnd *)this,2,1000);
  945. pSM->FlashObj(pCoordSys,this->GetSafeHwnd());
  946. m_nLbtDown = 0;
  947. }
  948. }
  949. break;
  950. }
  951. case IDM_MENU_CUT_LINE_QGIS: // 剪断线
  952. {
  953. if(m_nLbtDown>0)
  954. {
  955. BOOL bInLine = FALSE;
  956. CQBaseObj * pObj = pSM->GetCurSelObj();
  957. if(pObj->GetObjType() != QGIS_OBJ_LINE) break;
  958. CQLineObj * pLine = (CQLineObj *)pObj;
  959. CQPoint * ptFirst = NULL,* ptSecond = NULL;
  960. int nPtcount = pLine->m_PtList.GetSize();
  961. for(int i=0;i<nPtcount-1;i++)
  962. {
  963. ptFirst = pLine->m_PtList.GetPoint(i);
  964. ptSecond = pLine->m_PtList.GetPoint(i+1);
  965. if(!ptFirst || !ptSecond) return;
  966. bInLine = m_ptBegin.PtInLine(*ptFirst,*ptSecond);
  967. if(bInLine == TRUE)break;
  968. }
  969. if(bInLine)
  970. {
  971. CQLineObj * pCutLine = new CQLineObj;
  972. CQPointArray ptTmArray;
  973. int nFirst = -1;
  974. FindNearestTwoPoints(nFirst,&m_ptBegin,pLine);
  975. pCutLine->m_PtList.AddPoint(m_ptBegin.GetX(),m_ptBegin.GetY());
  976. if(nFirst+1 == nPtcount-1)
  977. {
  978. pCutLine->m_PtList.AddPoint(pLine->m_PtList.GetPoint(nFirst+1));
  979. }
  980. else if(nFirst+1<nPtcount)
  981. {
  982. for(int m=nFirst+1;m<nPtcount;m++)
  983. {
  984. pCutLine->m_PtList.AddPoint(pLine->m_PtList.GetPoint(m));
  985. }
  986. }
  987. for(int kk=0;kk<=nFirst;kk++)
  988. {
  989. ptTmArray.AddPoint(pLine->m_PtList.GetPoint(kk));
  990. }
  991. CBoundaryRect bRect1,bRect2;
  992. pLine->m_PtList.Copy(ptTmArray);
  993. pLine->m_PtList.AddPoint(m_ptBegin.GetX(),m_ptBegin.GetY());
  994. pLine->CalculateBoundary(&bRect1);
  995. pCutLine->CalculateBoundary(&bRect2);
  996. pLine->SetShowPointFlag(TRUE);
  997. pCutLine->SetShowPointFlag(TRUE);
  998. bRect2.Union(&bRect1);
  999. double fstep = 2.5f;
  1000. bRect2.Lager(fstep);
  1001. pCutLine->SetObjLayerID(pLine->GetObjLayerID());
  1002. pCutLine->SetObjMapID(pLine->GetObjMapID());
  1003. pMap->AddObject(pCutLine);
  1004. CRect rectTm;
  1005. m_nLbtDown = 0;
  1006. ReleaseCapture();
  1007. pCoordSys->WPtoLP(bRect2,&rectTm);
  1008. pSM->EndFlash((CWnd *)this,2);
  1009. InvalidateRect(rectTm,TRUE);
  1010. pDoc->m_MenuItemID = ID_EDIT_BUTTON_ARROW;
  1011. }
  1012. }
  1013. m_nLbtDown = 0;
  1014. ReleaseCapture();
  1015. break;
  1016. }
  1017. case IDM_MENU_ADD_POLYLINE_STREAM:   //添加流线
  1018. {
  1019. if(m_nLbtDown>0)
  1020. {
  1021. int nPtSize = m_ptArray.GetSize();
  1022. if(nPtSize < 2) //若点集中点的数量少于2 则退出
  1023. {
  1024. m_ptArray.RemoveAll();
  1025. m_nLbtDown = 0;
  1026. ReleaseCapture();
  1027. }
  1028. else
  1029. {
  1030. CBoundaryRect bRect;
  1031. CRect rectTemp;
  1032. CQLineObj * pStreamLine = new CQLineObj;
  1033. pStreamLine->m_PtList.Copy(m_ptArray);
  1034. pStreamLine->CalculateBoundary(&bRect);
  1035. pMap->AddObject(pStreamLine);
  1036. m_ptArray.DeleteAll(); //删除点阵里所有的点
  1037. ReleaseCapture();
  1038. m_nLbtDown = 0;
  1039. pCoordSys->WPtoLP(bRect,&rectTemp);
  1040. InvalidateRect(rectTemp);
  1041. }
  1042. }
  1043. break;
  1044. }
  1045. case ID_MENU_MOVE_MAP:
  1046. {
  1047. m_nLbtDown = 0;
  1048. ReleaseCapture();
  1049. long lOrX,lOry;
  1050. pCoordSys->GetStartOfWnd(lOrX,lOry);
  1051. DrawAxis(m_bDrawAxis,pDC,lOrX,lOry);
  1052. break;
  1053. }
  1054. case IDM_MENU_RECT_SELECT_OBJ_QGIS:
  1055. {
  1056. if(m_nLbtDown>0)
  1057. {
  1058. pDC->SetROP2(R2_NOT);
  1059. pDC->SelectStockObject(NULL_BRUSH);
  1060. m_nLbtDown = 0;
  1061. m_ptOld = ptWorld;
  1062. double fMinx = min(m_ptBegin.GetX(),ptWorld.GetX());
  1063. double fMinY = min(m_ptBegin.GetY(),ptWorld.GetY());
  1064. double fMaxX = max(m_ptBegin.GetX(),ptWorld.GetX());
  1065. double fMaxY = max(m_ptBegin.GetY(),ptWorld.GetY());
  1066. CBoundaryRect bRect;
  1067. bRect.m_fMinX = fMinx;
  1068. bRect.m_fMinY = fMinY;
  1069. bRect.m_fMaxX = fMaxX;
  1070. bRect.m_fMaxY = fMaxY;
  1071. long lMinx,lMinY,lMaxX,lMaxY;
  1072. pCoordSys->WPtoLP(fMinx,fMinY,&lMinx,&lMinY);
  1073. pCoordSys->WPtoLP(fMaxX,fMaxY,&lMaxX,&lMaxY);
  1074. pDC->Rectangle(lMinx,lMinY,lMaxX,lMaxY);
  1075. pSM->RemoveAllSelObj();
  1076. if(m_nSelectType == QGIS_SELECT_UNKNOWN)
  1077. {
  1078. if(pMap->Select(pSM,pCoordSys,bRect))
  1079. {
  1080. pSM->BeginFlash((CWnd *)this,2,1000);
  1081. pSM->FlashObj(pCoordSys,this->GetSafeHwnd());
  1082. }
  1083. }
  1084. else if(m_nSelectType == QGIS_SELECT_POINT) //假如是选择点
  1085. {
  1086. if(pMap->Select(pSM,pCoordSys,bRect))
  1087. {
  1088. POSITION pos = pSM->GetHeadPosition();
  1089. CQSelObjManager * pTmSel = new CQSelObjManager;
  1090. CQBaseObj * pObj = pSM->GetHead();
  1091. while (pos)
  1092. {
  1093. CQBaseObj * pObj = pSM->GetNext(pos);
  1094. if(pObj && pObj->GetObjDeleted()!=TRUE && pObj->GetObjHided()!=TRUE && pObj->GetObjType()==QGIS_OBJ_POINT)
  1095. {
  1096. pObj->SetObjSelected(FALSE);
  1097. pTmSel->AddSelObj(pObj);
  1098. }
  1099. }
  1100. pSM->RemoveAllSelObj();
  1101. if(pTmSel->GetSelObjCount()>0)
  1102. {
  1103. POSITION pos_2 = pTmSel->GetHeadPosition();
  1104. while (pos_2)
  1105. {
  1106. CQBaseObj * pObj = pTmSel->GetNext(pos_2);
  1107. pObj->SetObjSelected(FALSE);
  1108. pSM->AddSelObj(pObj);
  1109. }
  1110. pTmSel->RemoveAllSelObj();
  1111. }
  1112. pSM->BeginFlash((CWnd *)this,2,1000);
  1113. pSM->FlashObj(pCoordSys,this->GetSafeHwnd());
  1114. delete pTmSel;
  1115. pTmSel = NULL;
  1116. }
  1117. }
  1118. }
  1119. m_nLbtDown = 0;
  1120. ReleaseCapture();
  1121. break;
  1122. }
  1123. default:
  1124. {
  1125. break;
  1126. }
  1127. }
  1128. CView::OnLButtonUp(nFlags, point);
  1129. }
  1130. void CQGISView::OnMouseMove(UINT nFlags, CPoint point) 
  1131. {
  1132. // TODO: Add your message handler code here and/or call default
  1133. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  1134. ASSERT(pDoc);
  1135. CQMapObj * pMap = pDoc->m_pMap;
  1136. ASSERT(pMap);
  1137. CQSelObjManager * pSM = pMap->GetSelObjManager();
  1138. ASSERT(pSM);
  1139. CQCoordSys * pCoordSys = pMap->GetCoordSysPointer();
  1140. ASSERT(pCoordSys);
  1141. CDC * pDC = GetDC();
  1142. CPen pen(PS_SOLID,0,RGB(0,0,255));
  1143. CPen * pOldPen = pDC->SelectObject(&pen);
  1144. CQPoint ptWorld;
  1145. pCoordSys->LPtoWP(point,&ptWorld);
  1146. COLORREF cl = RGB(0,0,0);
  1147. ///////////////////////////////////////////////////////////
  1148. CStatusBar * pStatus = NULL;
  1149. CString szMapScale; //定义一个临时变量用于存储鼠标的坐标值 
  1150. CString szMousePos;
  1151. //获取状态栏的窗口指针
  1152. pStatus = (CStatusBar *)AfxGetApp()->m_pMainWnd->GetDescendantWindow(AFX_IDW_STATUS_BAR);
  1153. if(pStatus)
  1154. {
  1155. CString szMapUnit =  pCoordSys->GetUnitNameCHS();
  1156. const char * pchar = LPCTSTR(szMapUnit);
  1157. szMapScale.Format("当前地图比例尺1:%f",pMap->GetCoordSysPointer()->GetMapScale());
  1158. pStatus->SetPaneText(1,szMapScale);
  1159. szMousePos.Format("X  =%10.5f%s,Y  =%10.5f%s",ptWorld.GetX(),pchar,ptWorld.GetY(),pchar);
  1160. pStatus->SetPaneText(2,szMousePos);
  1161. }
  1162. ///////////////////////////////////////////////////////////
  1163. switch(pDoc->m_MenuItemID)
  1164. {
  1165. case IDM_MENU_ADD_LINE_QGIS: //当前是画线操作
  1166. {
  1167. if(m_nLbtDown>0)     //假如鼠标已经点击了
  1168. {
  1169. pDC->SetROP2(R2_NOT);
  1170. //设置为不填充状态
  1171. if(m_ptEnd != m_ptBegin)
  1172. {
  1173. pDC->MoveTo(GetBeginPos());
  1174. pDC->LineTo(GetEndPos());
  1175. }
  1176. m_ptEnd = ptWorld;
  1177. pDC->MoveTo(GetBeginPos());
  1178. pDC->LineTo(GetEndPos());
  1179. }
  1180. break;
  1181. }
  1182. case IDM_MENU_RECT_SELECT_OBJ_QGIS:
  1183. {
  1184. if(m_nLbtDown >0)
  1185. {
  1186. pDC->SetROP2(R2_NOT);
  1187. pDC->SelectStockObject(NULL_BRUSH);
  1188. CPoint ptBegin,ptOld;
  1189. pCoordSys->WPtoLP(m_ptBegin,&ptBegin);
  1190. if(m_ptOld != m_ptBegin)
  1191. {
  1192. pCoordSys->WPtoLP(m_ptOld,&ptOld);
  1193. long lMinx = min(ptBegin.x,ptOld.x);
  1194. long lMinY = min(ptBegin.y,ptOld.y);
  1195. long lMaxX = max(ptBegin.x,ptOld.x);
  1196. long lMaxY = max(ptBegin.y,ptOld.y);
  1197. pDC->Rectangle(lMinx,lMinY,lMaxX,lMaxY);
  1198. }
  1199. m_ptOld = ptWorld;
  1200. pCoordSys->WPtoLP(m_ptOld,&ptOld);
  1201. long lMinx = min(ptBegin.x,ptOld.x);
  1202. long lMinY = min(ptBegin.y,ptOld.y);
  1203. long lMaxX = max(ptBegin.x,ptOld.x);
  1204. long lMaxY = max(ptBegin.y,ptOld.y);
  1205. pDC->Rectangle(lMinx,lMinY,lMaxX,lMaxY);
  1206. break;
  1207. }
  1208. }
  1209. case IDM_MENU_ADD_POLYLINE:
  1210. {
  1211. if(m_nLbtDown>0)
  1212. {
  1213. if(m_ptOld != m_ptBegin)
  1214. {
  1215. pDC->SetROP2(R2_NOT);
  1216. pCoordSys->WPtoLP(m_ptBegin,&m_ptLBegin);
  1217. pCoordSys->WPtoLP(m_ptOld,&m_ptLOld);
  1218. pDC->MoveTo(m_ptLBegin);
  1219. pDC->LineTo(m_ptLOld);
  1220. }
  1221. pDC->SetROP2(R2_NOT);
  1222. m_ptOld = ptWorld;
  1223. pCoordSys->WPtoLP(m_ptBegin,&m_ptLBegin);
  1224. pCoordSys->WPtoLP(m_ptOld,&m_ptLOld);
  1225. pDC->MoveTo(m_ptLBegin);
  1226. pDC->LineTo(m_ptLOld);
  1227. }
  1228. break;
  1229. }
  1230. case IDM_MENU_MOVE_LINE_QGIS:
  1231. case IDM_MENU_MOVE_OBJ_QGIS:
  1232. {
  1233. if(m_nLbtDown>0)
  1234. {
  1235. CBoundaryRect BRect,bAllRect;
  1236. COLORREF cl = RGB(160,160,160);
  1237. if(m_ptOld != m_ptBegin)
  1238. {
  1239. pCoordSys->WPtoLP(m_ptBegin,&m_ptLBegin);
  1240. pCoordSys->WPtoLP(m_ptOld,&m_ptLOld);
  1241. double dx = ptWorld.GetX() - m_ptOld.GetX();
  1242. double dy = ptWorld.GetY() - m_ptOld.GetY();
  1243. int nSelObj = pSM->GetSelObjCount();
  1244. POSITION pos = pSM->GetHeadPosition();
  1245. while (pos)
  1246. {
  1247. CQBaseObj * pObj = pSM->GetNext(pos);
  1248. if(pObj && !pObj->GetObjDeleted() && !pObj->GetObjHided())
  1249. {
  1250. pObj->Display(pCoordSys,pDC,R2_NOT,2,&cl);
  1251. pObj->Move(dx,dy);
  1252. pObj->Display(pCoordSys,pDC,R2_NOT,2,&cl);
  1253. }
  1254. }
  1255. pDC->SetROP2(R2_NOT);
  1256. pDC->MoveTo(m_ptLBegin);
  1257. pDC->LineTo(m_ptLOld);
  1258. }
  1259. m_ptOld = ptWorld;
  1260. pDC->SetROP2(R2_NOT);
  1261. pCoordSys->WPtoLP(m_ptBegin,&m_ptLBegin);
  1262. pCoordSys->WPtoLP(m_ptOld,&m_ptLOld);
  1263. pDC->MoveTo(m_ptLBegin);
  1264. pDC->LineTo(m_ptLOld);
  1265. }
  1266. break;
  1267. }
  1268. case IDM_MENU_ROTATE_LINE_QGIS:
  1269. case IDM_MENU_ROTATE_OBJ_QGIS:
  1270. {
  1271. if(m_nLbtDown>0)
  1272. {
  1273. if(pSM->GetSelObjCount()<=0)break;
  1274. CObList tmSelObjs; 
  1275. POSITION pos = pSM->GetHeadPosition();
  1276. while (pos)
  1277. {
  1278. CQBaseObj * pObj = pSM->GetNext(pos);
  1279. if(!pObj) continue;
  1280. tmSelObjs.AddTail(pObj);
  1281. }
  1282.      pSM->EndFlash((CWnd *)this,2);
  1283. COLORREF cl = RGB(0,0,0);
  1284. // m_ptEnd = ptWorld;
  1285. pDC->SetROP2(R2_NOT);
  1286. if(m_ptOld != m_ptBegin)
  1287. {
  1288. pCoordSys->WPtoLP(m_ptBegin,&m_ptLBegin);
  1289. pCoordSys->WPtoLP(m_ptOld,&m_ptLOld);
  1290. double fAngle1 = atan2(ptWorld.GetY()-m_ptBegin.GetY(),ptWorld.GetX()-m_ptBegin.GetX());
  1291. double fAngle2 = atan2(m_ptOld.GetY()-m_ptBegin.GetY(),m_ptOld.GetX()-m_ptBegin.GetX());
  1292. double fAngle = CQGISAlgorithmLib::RadianToDegree(fAngle1-fAngle2);
  1293. pos = tmSelObjs.GetHeadPosition();
  1294. while (pos)
  1295. {
  1296. CQBaseObj * pObj = (CQBaseObj *)tmSelObjs.GetNext(pos);
  1297. pObj->Display(pCoordSys,pDC,R2_NOT,2,&cl);
  1298. pObj->Rotate(m_ptBegin,fAngle);
  1299. pObj->Display(pCoordSys,pDC,R2_NOT,2,&cl);
  1300. }
  1301. pDC->MoveTo(m_ptLBegin);
  1302. pDC->LineTo(m_ptLOld);
  1303. }
  1304. m_ptOld = ptWorld;
  1305. pCoordSys->WPtoLP(m_ptBegin,&m_ptLBegin);
  1306. pCoordSys->WPtoLP(m_ptOld,&m_ptLOld);
  1307. pDC->MoveTo(m_ptLBegin);
  1308. pDC->LineTo(m_ptLOld);
  1309. pos = tmSelObjs.GetHeadPosition();
  1310. while (pos)
  1311. {
  1312. CQBaseObj * pObj = (CQBaseObj *)tmSelObjs.GetNext(pos);
  1313. pSM->AddSelObj(pObj);
  1314. }
  1315. tmSelObjs.RemoveAll();
  1316. }
  1317. break;
  1318. }
  1319. case IDM_MENU_ADD_RECT_QGIS:
  1320. {
  1321. if(m_nLbtDown > 0)
  1322. {
  1323. CPoint pt1,pt2;
  1324. pDC->SetROP2(R2_NOT);
  1325. if(m_ptOld != m_ptBegin)
  1326. {
  1327. pCoordSys->WPtoLP(m_ptBegin,&m_ptLBegin);
  1328. pCoordSys->WPtoLP(m_ptOld,&m_ptLOld);
  1329. pt1.x = m_ptLBegin.x;
  1330. pt1.y = m_ptLOld.y;
  1331. pt2.x = m_ptLOld.x;
  1332. pt2.y = m_ptLBegin.y;
  1333. pDC->MoveTo(m_ptLBegin);
  1334. pDC->LineTo(pt1);
  1335. pDC->LineTo(m_ptLOld);
  1336. pDC->LineTo(pt2);
  1337. pDC->LineTo(m_ptLBegin);
  1338. }
  1339. m_ptOld = ptWorld;
  1340. pCoordSys->WPtoLP(m_ptBegin,&m_ptLBegin);
  1341. pCoordSys->WPtoLP(m_ptOld,&m_ptLOld);
  1342. pt1.x = m_ptLBegin.x;
  1343. pt1.y = m_ptLOld.y;
  1344. pt2.x = m_ptLOld.x;
  1345. pt2.y = m_ptLBegin.y;
  1346. pDC->MoveTo(m_ptLBegin);
  1347. pDC->LineTo(pt1);
  1348. pDC->LineTo(m_ptLOld);
  1349. pDC->LineTo(pt2);
  1350. pDC->LineTo(m_ptLBegin);
  1351. }
  1352. break;
  1353. }
  1354. case IDM_MENU_ADD_CIRCLE_QGIS:
  1355. {
  1356. if(m_nLbtDown == 1)
  1357. {
  1358. long lCr = 0;
  1359. double fR = 0;
  1360. CPen crpen(PS_DASH,0,RGB(0,0,255));
  1361. CPen * pOldPenCr = pDC->SelectObject(&crpen);
  1362. pDC->SelectStockObject(NULL_BRUSH);
  1363. if(m_ptOld != m_ptBegin)
  1364. {
  1365. pDC->SetROP2(R2_NOT);
  1366. lCr = (GetOldPos().x-GetBeginPos().x)*(GetOldPos().x-GetBeginPos().x) + 
  1367. (GetOldPos().y-GetBeginPos().y)*(GetOldPos().y-GetBeginPos().y);
  1368. lCr = static_cast<long>(sqrt(static_cast<double>(lCr)));
  1369. CPoint pt = GetBeginPos();
  1370. pDC->Ellipse(pt.x-lCr,pt.y-lCr,pt.x+lCr,pt.y+lCr);
  1371. }
  1372. m_ptOld = ptWorld;
  1373. pDC->SetROP2(R2_NOT);
  1374. lCr = (GetOldPos().x-GetBeginPos().x)*(GetOldPos().x-GetBeginPos().x) + 
  1375. (GetOldPos().y-GetBeginPos().y)*(GetOldPos().y-GetBeginPos().y);
  1376. lCr = static_cast<long>(sqrt(static_cast<double>(lCr)));
  1377. CPoint pt = GetBeginPos();
  1378. pDC->Ellipse(pt.x-lCr,pt.y-lCr,pt.x+lCr,pt.y+lCr);
  1379. pDC->SelectObject(pOldPenCr);
  1380. }
  1381. break;
  1382. }
  1383. case IDM_MENU_ADD_ELLIPSE_QGIS:
  1384. {
  1385. m_ptEnd = ptWorld;
  1386. if(m_nLbtDown==1)
  1387. {
  1388. pDC->SetROP2(R2_NOT);
  1389. pDC->MoveTo(GetBeginPos());
  1390. pDC->LineTo(GetOldPos());
  1391. pDC->MoveTo(GetBeginPos());
  1392. pDC->LineTo(GetEndPos());
  1393. }
  1394. else if(m_nLbtDown==2)
  1395. {
  1396. long lx=0,ly=0;
  1397. CQPoint ptCenter;
  1398. pDC->SetROP2(R2_NOT);
  1399. m_Ellipse.GetCenterPoint(ptCenter);
  1400. pCoordSys->WPtoLP(ptCenter.GetX(),ptCenter.GetY(),&lx,&ly);
  1401. pDC->MoveTo(lx,ly);
  1402. pDC->LineTo(GetOldPos());
  1403. pDC->MoveTo(lx,ly);
  1404. pDC->LineTo(GetEndPos());
  1405. //DrawEllipse(m_EllipsePara);
  1406. COLORREF cl = RGB(0,0,0);
  1407. DrawEllipse(m_Ellipse,pDC);
  1408. double dx = ptCenter.GetX() - ptWorld.GetX();
  1409. double dy = ptCenter.GetY() - ptWorld.GetY();
  1410. double fShortAxis = sqrt( dx*dx + dy*dy );//椭圆短轴
  1411. m_Ellipse.SetShortAxis(fShortAxis);
  1412. //DrawEllipse(m_EllipsePara);
  1413. DrawEllipse(m_Ellipse,pDC);
  1414. }
  1415. else
  1416. {
  1417. }
  1418. m_ptOld = ptWorld;
  1419. break;
  1420. }
  1421. case IDM_MENU_ADD_POLYLINE_STREAM:  //造流线
  1422. {
  1423. if(m_nLbtDown>0 && MK_LBUTTON && nFlags)
  1424. {
  1425. pDC->SetROP2(R2_NOT);
  1426. pDC->MoveTo(GetBeginPos());
  1427. pDC->LineTo(point);
  1428. m_ptBegin = ptWorld;
  1429. m_ptArray.AddPoint(ptWorld.GetX(),ptWorld.GetY());
  1430. m_nLbtDown++;
  1431. break;
  1432. }
  1433. }
  1434. case ID_MENU_MOVE_MAP:
  1435. {
  1436. if((m_ptOld!=ptWorld) && (nFlags&MK_LBUTTON) && m_nLbtDown==1)
  1437. {
  1438. long dx,dy;
  1439. dx=point.x-GetOldPos().x;
  1440. dy=point.y-GetOldPos().y;
  1441. pCoordSys->Translate(GetOldPos(),point);
  1442. ScrollWindow(dx,dy);
  1443. m_ptOld = ptWorld;
  1444. }
  1445. break;
  1446. }
  1447. case ID_MENU_ADD_HORI_LINE_QGIS: //水平线的操作
  1448. {
  1449. if(m_nLbtDown>0)
  1450. {
  1451. pDC->SetROP2(R2_NOT);
  1452. if(m_ptOld != m_ptBegin)
  1453. {
  1454. pDC->MoveTo(GetBeginPos().x,GetBeginPos().y);
  1455. pDC->LineTo(GetOldPos().x,GetBeginPos().y);
  1456. }
  1457. m_ptOld = ptWorld;
  1458. pDC->MoveTo(GetBeginPos().x,GetBeginPos().y);
  1459. pDC->LineTo(GetOldPos().x,GetBeginPos().y);
  1460. }
  1461. break;
  1462. }
  1463. case ID_MENU_ADD_VERVICAL_LINE_QGIS: // 对垂直线的操作
  1464. {
  1465. if(m_nLbtDown>0)
  1466. {
  1467. pDC->SetROP2(R2_NOT);
  1468. if(m_ptOld != m_ptBegin)
  1469. {
  1470. pDC->MoveTo(GetBeginPos().x,GetBeginPos().y);
  1471. pDC->LineTo(GetBeginPos().x,GetOldPos().y);
  1472. }
  1473. m_ptOld = ptWorld;
  1474. pDC->MoveTo(GetBeginPos().x,GetBeginPos().y);
  1475. pDC->LineTo(GetBeginPos().x,GetOldPos().y);
  1476. }
  1477. break;
  1478. }
  1479. default:
  1480. {
  1481. break;
  1482. }
  1483. }
  1484. pDC->SelectObject(pOldPen);
  1485. CView::OnMouseMove(nFlags, point);
  1486. }
  1487. void CQGISView::OnRButtonDown(UINT nFlags, CPoint point) 
  1488. {
  1489. // TODO: Add your message handler code here and/or call default
  1490. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  1491. ASSERT(pDoc);
  1492. CQMapObj * pMap = pDoc->m_pMap;
  1493. ASSERT(pMap);
  1494. CQCoordSys * pCoordSys = pMap->GetCoordSysPointer();
  1495. ASSERT(pCoordSys);
  1496. CDC * pDC = GetDC();
  1497. CQSelObjManager * pSM = pMap->GetSelObjManager();
  1498. ASSERT(pSM);
  1499. CQPoint ptWorld;
  1500. pCoordSys->LPtoWP(point,&ptWorld);
  1501. switch(pDoc->m_MenuItemID)
  1502. {
  1503. case IDM_MENU_ADD_LINE_QGIS:
  1504. {
  1505. if(m_nLbtDown == 1)
  1506. {
  1507. pDC->SetROP2(R2_NOT);
  1508. pCoordSys->WPtoLP(m_ptBegin,&m_ptLBegin);
  1509. pDC->MoveTo(m_ptLBegin);
  1510. pDC->LineTo(point);
  1511. m_ptArray.DeleteAll();
  1512. m_nLbtDown = 0;
  1513. ReleaseCapture();
  1514. }
  1515. break;
  1516. }
  1517. case IDM_MENU_ADD_POLYLINE:
  1518. {
  1519. if(m_nLbtDown == 1)
  1520. {
  1521. pDC->SetROP2(R2_NOT);
  1522. pCoordSys->WPtoLP(m_ptBegin,&m_ptLBegin);
  1523. pDC->MoveTo(m_ptLBegin);
  1524. pDC->LineTo(point);
  1525. m_ptArray.DeleteAll();
  1526. m_nLbtDown = 0;
  1527. ReleaseCapture();
  1528. }
  1529. else
  1530. {
  1531. CQLineObj * pLine = new CQLineObj;
  1532. pLine->m_PtList.Copy(m_ptArray);
  1533. pLine->SetObjLayerID(pMap->GetCurLayer()->GetLayerID());
  1534. pLine->SetObjMapID(pMap->GetMapID());
  1535. if(pLine && pLine->m_PtList.GetSize()>1)
  1536. {
  1537. CBoundaryRect BRect;
  1538. pLine->CalculateBoundary(&BRect);
  1539. pMap->AddObject(pLine);
  1540. CRect rect;
  1541. pCoordSys->WPtoLP(BRect,&rect);
  1542. rect.left = min(rect.left,point.x);
  1543. rect.top = min(rect.top,point.y);
  1544. rect.right = max(rect.right,point.x);
  1545. rect.bottom = max(rect.bottom,point.y);
  1546. InvalidateRect(rect);
  1547. m_nLbtDown = 0;
  1548. ReleaseCapture();
  1549. }
  1550. }
  1551. m_nLbtDown = 0;
  1552. break;
  1553. }
  1554. case IDM_MENU_MOVE_LINE_QGIS:
  1555. case IDM_MENU_MOVE_OBJ_QGIS: //移动对象在点击右键后结束
  1556. {
  1557. m_nLbtDown = 0;
  1558. if(pSM->GetSelObjCount()>0)
  1559. pSM->EndFlash((CWnd *)this,2);
  1560. pDoc->m_MenuItemID = ID_EDIT_BUTTON_ARROW;
  1561. ReleaseCapture();
  1562. break;
  1563. }
  1564. case IDM_MENU_ROTATE_LINE_QGIS:
  1565. case IDM_MENU_ROTATE_OBJ_QGIS: //移动对象的操作
  1566. {
  1567. m_nLbtDown = 0;
  1568. if(pSM->GetSelObjCount()>0)
  1569. pSM->EndFlash((CWnd *)this,2);
  1570. pDoc->m_MenuItemID = ID_EDIT_BUTTON_ARROW;
  1571. ReleaseCapture();
  1572. break;
  1573. }
  1574. case IDM_MENU_ADD_CIRCLE_QGIS:
  1575. {
  1576. if(m_nLbtDown == 1) //假如单击了一次后不想再 画了 
  1577. {
  1578. m_nLbtDown = 0;
  1579. ReleaseCapture();
  1580. pDoc->m_MenuItemID = ID_EDIT_BUTTON_ARROW;
  1581. m_ptOld = ptWorld;
  1582. pDC->SetROP2(R2_NOT);
  1583. pDC->SelectStockObject(NULL_BRUSH);
  1584. long lCr = (GetOldPos().x-GetBeginPos().x)*(GetOldPos().x-GetBeginPos().x) + 
  1585. (GetOldPos().y-GetBeginPos().y)*(GetOldPos().y-GetBeginPos().y);
  1586. lCr = static_cast<long>(sqrt(static_cast<double>(lCr)));
  1587. CPoint pt = GetBeginPos();
  1588. pDC->Ellipse(pt.x-lCr,pt.y-lCr,pt.x+lCr,pt.y+lCr);
  1589. }
  1590. break;
  1591. }
  1592. case IDM_MENU_ADD_ELLIPSE_QGIS:  //绘制椭圆形时的操作
  1593. {
  1594. if(m_nLbtDown == 1)  //假如单击了一次就不想画了 
  1595. {
  1596. m_nLbtDown = 0;  //结束鼠标输入
  1597. ReleaseCapture(); //释放鼠标捕捉
  1598. pDC->SetROP2(R2_NOT);
  1599. pDC->MoveTo(GetBeginPos());
  1600. pDC->LineTo(point);
  1601. pDoc->m_MenuItemID = ID_EDIT_BUTTON_ARROW;
  1602. }
  1603. else if(m_nLbtDown == 2) // 如果鼠标单击了两次
  1604. {
  1605. //就要绘制一个椭圆
  1606. pDC->SetROP2(R2_NOT);
  1607. CQEllipseObj tmEllipse;
  1608. tmEllipse.Copy(m_Ellipse);// 设置临时椭圆对象的参数
  1609. DrawEllipse(tmEllipse,pDC);
  1610. CPoint ptTemp;
  1611. pCoordSys->WPtoLP(ptCenter,&ptTemp);
  1612. pDC->MoveTo(ptTemp);
  1613. pDC->LineTo(point);
  1614. m_nLbtDown = 0;
  1615. ReleaseCapture();
  1616. pDoc->m_MenuItemID = ID_EDIT_BUTTON_ARROW;
  1617. }
  1618. break;
  1619. }
  1620. case IDM_MENU_LINK_POINT_TO_LINE_QGIS:  //连点成线
  1621. {
  1622. if(m_nLbtDown == 0)
  1623. {
  1624. ReleaseCapture();
  1625. pDoc->m_MenuItemID = ID_EDIT_BUTTON_ARROW;
  1626. break;
  1627. }
  1628. else
  1629. {
  1630. int nptSize = m_vecObj.size();
  1631. if(nptSize>=2)
  1632. {
  1633. BOOL bCreated = TRUE;
  1634. CQLineObj * pNewLine = new CQLineObj;
  1635. for(int i=0;i<nptSize;i++)
  1636. {
  1637. CQPointObj * pPt = dynamic_cast<CQPointObj *>(m_vecObj.at(i));
  1638. if(pPt == NULL)
  1639. {
  1640. bCreated = FALSE;
  1641. break;
  1642. }
  1643. else
  1644. {
  1645. double dx=0.0f,dy=0.0f;
  1646. pPt->GetPointPos(dx,dy);
  1647. pNewLine->m_PtList.AddPoint(dx,dy);
  1648. }
  1649. }
  1650. if(bCreated == FALSE)
  1651. {
  1652. delete pNewLine;
  1653. pNewLine = NULL;
  1654. }
  1655. else
  1656. {
  1657. pNewLine->SetObjName(CString("连点成线对象"));
  1658. CBoundaryRect bRect;
  1659. pNewLine->CalculateBoundary(&bRect);
  1660. CRect rectLine;
  1661. pCoordSys->WPtoLP(bRect,&rectLine);
  1662. pMap->AddObject(pNewLine);
  1663. InvalidateRect(rectLine,FALSE);
  1664. }
  1665. }
  1666. m_nLbtDown = 0;
  1667. ReleaseCapture();
  1668. pDoc->m_MenuItemID = ID_EDIT_BUTTON_ARROW;
  1669. m_vecObj.clear();
  1670. break;
  1671. }
  1672. }
  1673. case ID_MENU_ADD_HORI_LINE_QGIS: //水平线
  1674. {
  1675. if(m_nLbtDown == 1)
  1676. {
  1677. //假如在画线的过程想要结束
  1678. ReleaseCapture();
  1679. m_nLbtDown = 0;
  1680. CRect rect;
  1681. rect.left = GetBeginPos().x - 1;
  1682. rect.top = GetBeginPos().y - 1;
  1683. rect.right = point.x + 2;
  1684. rect.bottom = GetBeginPos().y + 1;
  1685. InvalidateRect(rect,TRUE);
  1686. }
  1687. break;
  1688. }
  1689. case ID_MENU_ADD_VERVICAL_LINE_QGIS:
  1690. {
  1691. if(m_nLbtDown == 1)
  1692. {
  1693. ReleaseCapture();
  1694. m_nLbtDown = 0;
  1695. CRect rect;
  1696. rect.left = GetBeginPos().x - 1;
  1697. rect.top = GetBeginPos().y - 1;
  1698. rect.right = GetOldPos().x + 1;
  1699. rect.bottom = GetOldPos().y +1;
  1700. InvalidateRect(rect,TRUE);
  1701. }
  1702. break;
  1703. }
  1704. case ID_MENU_ADD_TEXT_QGIS:
  1705. {
  1706. m_nLbtDown = 0;
  1707. pDoc->m_MenuItemID = 0;
  1708. break;
  1709. }
  1710. }
  1711. CView::OnRButtonDown(nFlags, point);
  1712. }
  1713. void CQGISView::OnCancelMode() 
  1714. {
  1715. CView::OnCancelMode();
  1716. // TODO: Add your message handler code here
  1717. }
  1718. void CQGISView::OnMenuAddLineQgis() 
  1719. {
  1720. // TODO: Add your command handler code here
  1721. CQGISDoc * pDoc = GetDocument(); //获取文档指针
  1722. ASSERT(pDoc);
  1723. pDoc->m_MenuItemID = IDM_MENU_ADD_LINE_QGIS;
  1724. m_nLbtDown = 0;
  1725. }
  1726. void CQGISView::OnMenuAddPointQgis() 
  1727. {
  1728. // TODO: Add your command handler code here
  1729. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  1730. ASSERT(pDoc);
  1731. pDoc->m_MenuItemID = IDM_MENU_ADD_POINT_QGIS;
  1732. m_nLbtDown = 0;
  1733. }
  1734. BOOL CQGISView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  1735. {
  1736. // TODO: Add your message handler code here and/or call default
  1737. CQGISDoc * pDoc = GetDocument();
  1738. ASSERT(pDoc);
  1739. if(pDoc->m_MenuItemID == IDM_MENU_ADD_POINT_QGIS ||
  1740. pDoc->m_MenuItemID == IDM_MENU_ADD_LINE_QGIS ||
  1741. pDoc->m_MenuItemID == IDM_MENU_PT_SELECT_OBJ_QGIS ||
  1742. pDoc->m_MenuItemID == IDM_MENU_RECT_SELECT_OBJ_QGIS ||
  1743. pDoc->m_MenuItemID == IDM_MENU_ADD_POLYLINE ||
  1744. pDoc->m_MenuItemID == IDM_MENU_CUT_LINE_QGIS ||
  1745. pDoc->m_MenuItemID == IDM_MENU_MIRROR_LINE_X_QGIS ||
  1746. pDoc->m_MenuItemID == IDM_MENU_MIRROR_LINE_Y_QGIS ||
  1747. pDoc->m_MenuItemID == IDM_MENU_MIRROR_O_QGIS || 
  1748. pDoc->m_MenuItemID == ID_MENU_ADD_VERVICAL_LINE_QGIS ||
  1749. pDoc->m_MenuItemID == ID_MENU_ADD_HORI_LINE_QGIS ||
  1750. pDoc->m_MenuItemID == IDM_MENU_ADD_LINE_QGIS ||
  1751. pDoc->m_MenuItemID == ID_MENU_ADD_TEXT_QGIS ||
  1752. pDoc->m_MenuItemID == ID_MENU_READ_EXCEL_QGIS)
  1753. {
  1754. HCURSOR hCursor;
  1755. //测试中发现 替换为LoadCursor就无法显示 
  1756. //得出结论 Loadcursor针对自定义的光标资源
  1757. hCursor = AfxGetApp()->LoadStandardCursor(IDC_CROSS);
  1758. SetCursor(hCursor);
  1759. ShowCursor(TRUE);
  1760. return TRUE;
  1761. }
  1762. else if(pDoc->m_MenuItemID == ID_MENU_MOVE_MAP)
  1763. {
  1764. HCURSOR hCursor;
  1765. hCursor = AfxGetApp()->LoadCursor(IDC_CURSOR_MOVE_MAP);
  1766. SetCursor(hCursor);
  1767. ShowCursor(TRUE);
  1768. return TRUE;
  1769. }
  1770. else
  1771. {
  1772. HCURSOR hCursor;
  1773. hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
  1774. SetCursor(hCursor);
  1775. ShowCursor(TRUE);
  1776. return TRUE;
  1777. }
  1778. return CView::OnSetCursor(pWnd,nHitTest,message);
  1779. }
  1780. void CQGISView::OnMenuSetMapAtt() 
  1781. {
  1782. // TODO: Add your command handler code here
  1783. CDlgMapAttSet dlg;
  1784. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  1785. CQMapObj * pMap = pDoc->m_pMap;
  1786. if(!pMap)return;
  1787. if(dlg.DoModal() == IDOK)
  1788. {
  1789. CQCoordSys * pSys = pMap->GetCoordSysPointer();
  1790. double fMapScale = dlg.m_lMapScale;
  1791. pSys->SetMapScale(fMapScale);
  1792. pSys->SetUnitType(dlg.m_nUnitType);
  1793. pMap->GetBoundary()->m_fMinX = dlg.m_fLeftX;
  1794. pMap->GetBoundary()->m_fMinY = dlg.m_fLeftY;
  1795. pMap->GetBoundary()->m_fMaxX = dlg.m_fRightX;
  1796. pMap->GetBoundary()->m_fMaxY = dlg.m_fRightY;
  1797. pSys->SetViewportOrg(static_cast<long>(dlg.m_fLeftX),static_cast<long>(dlg.m_fLeftY));
  1798. }
  1799. }
  1800. void CQGISView::OnSize(UINT nType, int cx, int cy) 
  1801. {
  1802. CView::OnSize(nType, cx, cy);
  1803. // TODO: Add your message handler code here
  1804. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  1805. CQMapObj * pMap = pDoc->m_pMap;
  1806. ASSERT(pMap);
  1807. pMap->GetCoordSysPointer()->SetViewport(0,0,cx,cy);
  1808. pMap->GetCoordSysPointer()->SetWndport(0,0,cx,cy);
  1809. pMap->GetCoordSysPointer()->SetStartOfWnd(10,cy-10);
  1810. }
  1811. CPoint CQGISView::GetBeginPos() 
  1812. {
  1813. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  1814. CQMapObj * pMap = pDoc->m_pMap;
  1815. CQCoordSys * pSys = pMap->GetCoordSysPointer();
  1816. ASSERT(pSys);
  1817. CPoint ptBegin;
  1818. pSys->WPtoLP(m_ptBegin,&ptBegin);
  1819. return ptBegin;
  1820. }
  1821. CPoint CQGISView::GetOldPos() 
  1822. {
  1823. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  1824. CQMapObj * pMap = pDoc->m_pMap;
  1825. CQCoordSys * pSys = pMap->GetCoordSysPointer();
  1826. ASSERT(pSys);
  1827. CPoint ptOld;
  1828. pSys->WPtoLP(m_ptOld,&ptOld);
  1829. return ptOld;
  1830. }
  1831. CPoint CQGISView::GetEndPos() 
  1832. {
  1833. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  1834. CQMapObj * pMap = pDoc->m_pMap;
  1835. CQCoordSys * pSys = pMap->GetCoordSysPointer();
  1836. ASSERT(pSys);
  1837. CPoint ptEnd;
  1838. pSys->WPtoLP(m_ptEnd,&ptEnd);
  1839. return ptEnd;
  1840. }
  1841. CQPoint CQGISView::GetwBeginPos()
  1842. {
  1843. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  1844. CQMapObj * pMap = pDoc->m_pMap;
  1845. CQCoordSys * pSys = pMap->GetCoordSysPointer();
  1846. ASSERT(pSys);
  1847. CQPoint ptwBegin;
  1848. pSys->LPtoWP(m_ptLBegin,&ptwBegin);
  1849. return ptwBegin;
  1850. }
  1851. CQPoint CQGISView::GetWOldPos()
  1852. {
  1853. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  1854. CQMapObj * pMap = pDoc->m_pMap;
  1855. CQCoordSys * pSys = pMap->GetCoordSysPointer();
  1856. ASSERT(pSys);
  1857. CQPoint ptwBegin;
  1858. pSys->LPtoWP(m_ptLBegin,&ptwBegin);
  1859. return ptwBegin;
  1860. }
  1861. CQPoint CQGISView::GetWEndPos()
  1862. {
  1863. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  1864. CQMapObj * pMap = pDoc->m_pMap;
  1865. CQCoordSys * pSys = pMap->GetCoordSysPointer();
  1866. ASSERT(pSys);
  1867. CQPoint ptwEnd;
  1868. pSys->LPtoWP(m_ptLBegin,&ptwEnd);
  1869. return ptwEnd;
  1870. }
  1871. void CQGISView::OnMenuPtSelectObjQgis() 
  1872. {
  1873. // TODO: Add your command handler code here
  1874. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  1875. pDoc->m_MenuItemID = IDM_MENU_PT_SELECT_OBJ_QGIS;
  1876. m_nLbtDown = 0;
  1877. pDoc->m_pMap->GetSelObjManager()->BeginFlash((CWnd*)this,2,1000);
  1878. }
  1879. void CQGISView::OnTimer(UINT nIDEvent) 
  1880. {
  1881. // TODO: Add your message handler code here and/or call default
  1882. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  1883. ASSERT(pDoc);
  1884. CQSelObjManager * pSel = pDoc->m_pMap->GetSelObjManager();
  1885. ASSERT(pSel);
  1886. if(pSel->GetSelObjCount()>0)
  1887. {
  1888. pSel->FlashObj(pDoc->m_pMap->GetCoordSysPointer(),this->GetSafeHwnd());
  1889. }
  1890. CView::OnTimer(nIDEvent);
  1891. }
  1892. //放弃选中
  1893. void CQGISView::OnMenuUselectObjQgis() 
  1894. {
  1895. // TODO: Add your command handler code here
  1896. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  1897. ASSERT(pDoc);
  1898. CQMapObj * pMap = pDoc->m_pMap;
  1899. ASSERT(pMap);
  1900. CRect rectTemp;
  1901. pMap->GetSelObjManager()->GetScreenRect(pMap->GetCoordSysPointer(),rectTemp);
  1902. pMap->GetSelObjManager()->RemoveAllSelObj(); //除去所有选中图元
  1903. pMap->GetSelObjManager()->EndFlash(this->GetSafeHwnd(),2);
  1904. InvalidateRect(rectTemp,TRUE);
  1905. m_nSelectType = QGIS_SELECT_UNKNOWN;
  1906. }
  1907. void CQGISView::OnMenuLineAttSet() 
  1908. {
  1909. // TODO: Add your command handler code here
  1910. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  1911. ASSERT(pDoc);
  1912. CQSelObjManager * pSel = pDoc->m_pMap->GetSelObjManager();
  1913. ASSERT(pSel);
  1914. CQCoordSys * pSys = pDoc->m_pMap->GetCoordSysPointer();
  1915. ASSERT(pSys);
  1916. CQLayerObj * pCurLayer = pDoc->m_pMap->GetCurLayer();
  1917. ASSERT(pCurLayer);
  1918. CQBaseObj * pObj = pSel->GetCurSelObj();
  1919. if(pObj->GetObjType() != QGIS_OBJ_LINE)
  1920. return;
  1921. CDlgLineAttSet dlg(pCurLayer,1,(CQLineObj*)pObj);
  1922. if(dlg.DoModal() == IDOK)
  1923. {
  1924. CQLineObj * ppObj = (CQLineObj *)pCurLayer->FindObj(pObj->GetObjID());
  1925. short nObjLineType = dlg.m_nLineStyle;
  1926. ppObj->SetobjLineType(nObjLineType);
  1927. ppObj->SetObjLineWidth(dlg.m_fLineWidth);
  1928. ppObj->SetObjPenColor(dlg.m_crLine);
  1929. ppObj->SetLineClosed(dlg.m_nLineClosed);
  1930. ppObj->SetShowPointFlag(dlg.m_bLineShowPt);
  1931. CBoundaryRect Brect;
  1932. ppObj->CalculateBoundary(&Brect);
  1933. CRect rect;
  1934. pSys->WPtoLP(Brect,&rect);
  1935. InvalidateRect(rect);
  1936. }
  1937. }
  1938. void CQGISView::OnUpdateMenuLineAttSet(CCmdUI* pCmdUI) 
  1939. {
  1940. // TODO: Add your command update UI handler code here
  1941. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  1942. ASSERT(pDoc);
  1943. CQSelObjManager * pSel = pDoc->m_pMap->GetSelObjManager();
  1944. ASSERT(pSel);
  1945. int nSel = pSel->GetSelObjCount();
  1946. if(nSel == 0) 
  1947. {
  1948. pCmdUI->Enable(FALSE);
  1949. return;
  1950. }
  1951. CQBaseObj * pObj = pSel->GetCurSelObj();
  1952. if(pObj->GetObjType() == QGIS_OBJ_LINE && nSel == 1)
  1953. pCmdUI->Enable(TRUE);
  1954. else
  1955. pCmdUI->Enable(FALSE);
  1956. }
  1957. void CQGISView::OnMenuRectSelectObjQgis() 
  1958. {
  1959. // TODO: Add your command handler code here
  1960. CQGISDoc * pDoc = (CQGISDoc*)GetDocument();
  1961. pDoc->m_MenuItemID = IDM_MENU_RECT_SELECT_OBJ_QGIS;
  1962. m_nLbtDown = 0;
  1963. pDoc->m_pMap->GetSelObjManager()->BeginFlash((CWnd*)this,2,1000);
  1964. }
  1965. void CQGISView::OnMenuDeleteObjQgis() 
  1966. {
  1967. // TODO: Add your command handler code here
  1968. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  1969. ASSERT(pDoc);
  1970. CQSelObjManager * pSM = pDoc->m_pMap->GetSelObjManager();
  1971. ASSERT(pSM);
  1972. CQMapObj * pMap = pDoc->m_pMap;
  1973. ASSERT(pMap);
  1974. if(pSM->GetSelObjCount()>0)
  1975. {
  1976. //  int nLayercount = pDoc->m_pMap->GetLayerCount();
  1977. //  for(int i=0;i<nLayercount;i++)
  1978. //  {
  1979. //  CQLayerObj * pLayer = pMap->GetLayer(i);
  1980. //  if(pLayer && pLayer->GetShowFlag() && !pLayer->GetDeleteFlag())
  1981. //  {
  1982. //  int nObjCount = pLayer->GetObjCount();
  1983. //  for(int j=0;j<nObjCount;j++)
  1984. //  {
  1985. //  CQBaseObj * pObj = pLayer->GetObj(j);
  1986. //  if(pObj && !pObj->GetObjDeleted() && !pObj->GetObjHided())
  1987. //  {
  1988. //  POSITION pos = pSM->GetHeadPosition();
  1989. //  while (pos)
  1990. //  {
  1991. //  CQBaseObj * psmObj = pSM->GetNext(pos);
  1992. //  if(psmObj->GetObjID() == pObj->GetObjID())
  1993. //  {
  1994. //  pObj->SetObjDeleted(TRUE);
  1995. //  }
  1996. //  }
  1997. //  }
  1998. //  }
  1999. //  }
  2000. // }
  2001. POSITION pos = pSM->GetHeadPosition();
  2002. while(pos)
  2003. {
  2004. CQBaseObj * pObj = pSM->GetNext(pos);
  2005. pObj->SetObjDeleted(TRUE);
  2006. }
  2007. CRect rectTemp;
  2008. pMap->GetSelObjManager()->GetScreenRect(pMap->GetCoordSysPointer(),rectTemp);
  2009. pMap->GetSelObjManager()->RemoveAllSelObj(); //除去所有选中图元
  2010. InvalidateRect(rectTemp);
  2011. pMap->GetSelObjManager()->EndFlash(this->GetSafeHwnd(),2);
  2012. }
  2013. }
  2014. //添加折线对象
  2015. void CQGISView::OnMenuAddPolyline() 
  2016. {
  2017. // TODO: Add your command handler code here
  2018. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  2019. ASSERT(pDoc);
  2020. pDoc->m_MenuItemID = IDM_MENU_ADD_POLYLINE;
  2021. m_nLbtDown=0;
  2022. }
  2023. void CQGISView::OnEditButtonArrow() 
  2024. {
  2025. // TODO: Add your command handler code here
  2026. CQGISDoc * pDoc = (CQGISDoc*)GetDocument();
  2027. pDoc->m_MenuItemID = ID_EDIT_BUTTON_ARROW;
  2028. m_nLbtDown = 0;
  2029. }
  2030. void CQGISView::OnMenuMoveObjQgis() 
  2031. {
  2032. // TODO: Add your command handler code here
  2033. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  2034. ASSERT(pDoc);
  2035. pDoc->m_MenuItemID = IDM_MENU_MOVE_OBJ_QGIS;
  2036. m_nLbtDown = 0;
  2037. }
  2038. void CQGISView::OnUpdateMenuMoveObjQgis(CCmdUI* pCmdUI) 
  2039. {
  2040. // TODO: Add your command update UI handler code here
  2041. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  2042. ASSERT(pDoc);
  2043. CQSelObjManager * pSel = pDoc->m_pMap->GetSelObjManager();
  2044. ASSERT(pSel);
  2045. int nSel = pSel->GetSelObjCount();
  2046. if(nSel == 0) 
  2047. {
  2048. pCmdUI->Enable(FALSE);
  2049. return;
  2050. }
  2051. pCmdUI->Enable(TRUE);
  2052. }
  2053. void CQGISView::OnMenuHideObjQgis() 
  2054. {
  2055. // TODO: Add your command handler code here
  2056. CQGISDoc * pDoc  = (CQGISDoc *)GetDocument();
  2057. ASSERT(pDoc);
  2058. CQSelObjManager * pSM = pDoc->m_pMap->GetSelObjManager();
  2059. ASSERT(pSM);
  2060. int nSelCount = pSM->GetCount();
  2061. if(nSelCount == 0)return;
  2062. POSITION pos = pSM->GetHeadPosition();
  2063. while (pos)
  2064. {
  2065. CQBaseObj * pObj = pSM->GetNext(pos);
  2066. if(!pObj || pObj->GetObjDeleted() || pObj->GetObjHided()) continue;
  2067. pObj->SetObjHided(TRUE);
  2068. }
  2069. InvalidateRect(NULL,FALSE);
  2070. pSM->EndFlash((CWnd *)this,2);
  2071. }
  2072. void CQGISView::OnUpdateMenuHideObjQgis(CCmdUI* pCmdUI) 
  2073. {
  2074. // TODO: Add your command update UI handler code here
  2075. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  2076. ASSERT(pDoc);
  2077. int nSel = pDoc->m_pMap->GetSelObjManager()->GetSelObjCount();
  2078. if(nSel)
  2079. pCmdUI->Enable(TRUE);
  2080. else
  2081. pCmdUI->Enable(FALSE);
  2082. }
  2083. void CQGISView::OnMenuShowObjQgis() 
  2084. {
  2085. // TODO: Add your command handler code here
  2086. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  2087. ASSERT(pDoc);
  2088. CQMapObj * pMap = pDoc->m_pMap;
  2089. ASSERT(pMap);
  2090. int nLayerCount = pMap->GetLayerCount();
  2091. for(int i=0;i<nLayerCount;i++)
  2092. {
  2093. CQLayerObj * pLayer = pMap->GetLayer(i);
  2094. if(!pLayer || pLayer->GetDeleteFlag() || !pLayer->GetShowFlag()) continue;
  2095. int nObjCount = pLayer->GetObjCount();
  2096. for(int j=0;j<nObjCount;j++)
  2097. {
  2098. CQBaseObj * pObj = pLayer->GetObj(j);
  2099. if(!pObj || pObj->GetObjDeleted() || !pObj->GetObjHided()) continue;
  2100. pObj->SetObjHided(FALSE);
  2101. }
  2102. }
  2103. InvalidateRect(NULL,FALSE);
  2104. }
  2105. void CQGISView::OnMenuRotateObjQgis() 
  2106. {
  2107. // TODO: Add your command handler code here
  2108. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  2109. ASSERT(pDoc);
  2110. pDoc->m_MenuItemID = IDM_MENU_ROTATE_OBJ_QGIS;
  2111. m_nLbtDown = 0;
  2112. }
  2113. void CQGISView::OnUpdateMenuRotateObjQgis(CCmdUI* pCmdUI) 
  2114. {
  2115. // TODO: Add your command update UI handler code here
  2116. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  2117. ASSERT(pDoc);
  2118. int nSel = pDoc->m_pMap->GetSelObjManager()->GetSelObjCount();
  2119. if(nSel)
  2120. pCmdUI->Enable(TRUE);
  2121. else
  2122. pCmdUI->Enable(FALSE);
  2123. }
  2124. void CQGISView::OnMenuCutLineQgis() 
  2125. {
  2126. // TODO: Add your command handler code here
  2127. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  2128. ASSERT(pDoc);
  2129. pDoc->m_MenuItemID = IDM_MENU_CUT_LINE_QGIS; //剪断线
  2130. m_nLbtDown = 0;
  2131. }
  2132. void CQGISView::OnUpdateMenuCutLineQgis(CCmdUI* pCmdUI) 
  2133. {
  2134. // TODO: Add your command update UI handler code here
  2135. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  2136. ASSERT(pDoc);
  2137. int nSel = pDoc->m_pMap->GetSelObjManager()->GetSelObjCount();
  2138. if(nSel == 1 && pDoc->m_pMap->GetSelObjManager()->GetCurSelObj()->GetObjType() == QGIS_OBJ_LINE)
  2139. pCmdUI->Enable(TRUE);
  2140. else
  2141. pCmdUI->Enable(FALSE);
  2142. }
  2143. void CQGISView::FindNearestTwoPoints(int &nFirst,CQPoint *pPt, CQLineObj *pLine)
  2144. {
  2145. if(!pLine || !pPt)return;
  2146. int nPtCount = pLine->m_PtList.GetSize();
  2147. if(nPtCount <=1 )return;
  2148. else   //这里要使用排序算法
  2149. {
  2150. vector<double> dDis;
  2151. CQPoint * ptf = NULL;
  2152. for(int i=0;i<nPtCount;i++)
  2153. {
  2154. ptf = pLine->m_PtList.GetPoint(i);
  2155. double fDis = pPt->Distance(*ptf);
  2156. dDis.push_back(fDis);  //将到每个点的距离都保存起来  进行排序
  2157. }
  2158. double fMin = dDis[0];
  2159. nFirst = 0;
  2160. for(int m=0;m<nPtCount;m++)
  2161. {
  2162. double fd = dDis[m];
  2163. if(fd<=fMin)
  2164. {
  2165. fMin = fd;
  2166. nFirst = m;
  2167. }
  2168. }
  2169. }
  2170. }
  2171. void CQGISView::OnMenuDeleteLineQgis() 
  2172. {
  2173. // TODO: Add your command handler code here
  2174. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  2175. ASSERT(pDoc);
  2176. CQSelObjManager * pSM = pDoc->m_pMap->GetSelObjManager();
  2177. ASSERT(pSM);
  2178. int nSelCount = pSM->GetSelObjCount();
  2179. POSITION pos = pSM->GetHeadPosition();
  2180. while (pos)
  2181. {
  2182. CQBaseObj * pObj = pSM->GetNext(pos);
  2183. if(pObj && !pObj->GetObjDeleted() && !pObj->GetObjHided())
  2184. {
  2185. pObj->SetObjDeleted(TRUE);
  2186. }
  2187. }
  2188. pSM->EndFlash((CWnd *)this,2);
  2189. InvalidateRect(NULL,TRUE);
  2190. }
  2191. void CQGISView::OnUpdateMenuDeleteLineQgis(CCmdUI* pCmdUI) 
  2192. {
  2193. // TODO: Add your command update UI handler code here
  2194. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  2195. CQSelObjManager * pSM = pDoc->m_pMap->GetSelObjManager();
  2196. int nSelObj = pSM->GetSelObjCount();
  2197. BOOL bTrue = TRUE;
  2198. POSITION pos = pSM->GetHeadPosition();
  2199. while (pos)
  2200. {
  2201. CQBaseObj * pObj = (CQBaseObj *)pSM->GetNext(pos);
  2202. if(pObj->GetObjType() == QGIS_OBJ_POINT)
  2203. {
  2204. bTrue = FALSE;
  2205. break;
  2206. }
  2207. }
  2208. pCmdUI->Enable(bTrue);
  2209. }
  2210. void CQGISView::OnMenuMoveLineQgis() 
  2211. {
  2212. // TODO: Add your command handler code here
  2213. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  2214. pDoc->m_MenuItemID = IDM_MENU_MOVE_LINE_QGIS;
  2215. m_nLbtDown = 0;
  2216. }
  2217. void CQGISView::OnUpdateMenuMoveLineQgis(CCmdUI* pCmdUI) 
  2218. {
  2219. // TODO: Add your command update UI handler code here
  2220. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  2221. CQSelObjManager * pSM = pDoc->m_pMap->GetSelObjManager();
  2222. int nSelObj = pSM->GetSelObjCount();
  2223. BOOL bTrue = TRUE;
  2224. POSITION pos = pSM->GetHeadPosition();
  2225. while (pos)
  2226. {
  2227. CQBaseObj * pObj = (CQBaseObj *)pSM->GetNext(pos);
  2228. if(pObj->GetObjType() == QGIS_OBJ_POINT)
  2229. {
  2230. bTrue = FALSE;
  2231. break;
  2232. }
  2233. }
  2234. pCmdUI->Enable(bTrue);
  2235. }
  2236. void CQGISView::OnUpdateMenuRotateLineQgis(CCmdUI* pCmdUI) 
  2237. {
  2238. // TODO: Add your command update UI handler code here
  2239. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  2240. CQSelObjManager * pSM = pDoc->m_pMap->GetSelObjManager();
  2241. int nSelObj = pSM->GetSelObjCount();
  2242. BOOL bTrue = TRUE;
  2243. POSITION pos = pSM->GetHeadPosition();
  2244. while (pos)
  2245. {
  2246. CQBaseObj * pObj = (CQBaseObj *)pSM->GetNext(pos);
  2247. if(pObj->GetObjType() == QGIS_OBJ_POINT)
  2248. {
  2249. bTrue = FALSE;
  2250. break;
  2251. }
  2252. }
  2253. pCmdUI->Enable(bTrue);
  2254. }
  2255. void CQGISView::OnMenuRotateLineQgis() 
  2256. {
  2257. // TODO: Add your command handler code here
  2258. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  2259. pDoc->m_MenuItemID = IDM_MENU_ROTATE_LINE_QGIS;
  2260. m_nLbtDown = 0;
  2261. }
  2262. void CQGISView::OnMenuLinkLineQgis() 
  2263. {
  2264. // TODO: Add your command handler code here
  2265. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  2266. pDoc->m_MenuItemID = IDM_MENU_LINK_LINE_QGIS_;
  2267. m_nLbtDown = 0;
  2268. }
  2269. void CQGISView::OnMenuMirrorLineXQgis() 
  2270. {
  2271. // TODO: Add your command handler code here
  2272. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  2273. pDoc->m_MenuItemID = IDM_MENU_MIRROR_LINE_X_QGIS;
  2274. m_nLbtDown = 0;
  2275. }
  2276. void CQGISView::OnMenuMirrorLineYQgis() 
  2277. {
  2278. // TODO: Add your command handler code here
  2279. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  2280. pDoc->m_MenuItemID = IDM_MENU_MIRROR_LINE_Y_QGIS;
  2281. m_nLbtDown = 0;
  2282. }
  2283. void CQGISView::OnMenuMirrorOQgis() 
  2284. {
  2285. // TODO: Add your command handler code here
  2286. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  2287. pDoc->m_MenuItemID = IDM_MENU_MIRROR_O_QGIS;
  2288. m_nLbtDown = 0;
  2289. }
  2290. //添加矩形
  2291. void CQGISView::OnMenuAddRectQgis() 
  2292. {
  2293. // TODO: Add your command handler code here
  2294. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  2295. pDoc->m_MenuItemID = IDM_MENU_ADD_RECT_QGIS;
  2296. m_nLbtDown = 0;
  2297. }
  2298. void CQGISView::OnMenuLayerManagerQgis() 
  2299. {
  2300. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  2301. ASSERT(pDoc);
  2302. CQCoordSys * pSys = NULL;
  2303. CQMapObj * pMap = pDoc->m_pMap;
  2304. ASSERT(pMap);
  2305. pSys = pMap->GetCoordSysPointer();
  2306. ASSERT(pSys);
  2307. CDlgLayerManager layerdlg(0,pMap);
  2308. if(layerdlg.DoModal() == IDOK)
  2309. {
  2310. CBoundaryRect Brect;
  2311. CRect rectTemp;
  2312. pMap->CalculateBoundary(&Brect);
  2313. pSys->WPtoLP(Brect,&rectTemp);
  2314. InvalidateRect(rectTemp,TRUE);
  2315. }
  2316. }
  2317. void CQGISView::OnMenuAddCircleQgis() 
  2318. {
  2319. // TODO: Add your command handler code here
  2320. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  2321. pDoc->m_MenuItemID =  IDM_MENU_ADD_CIRCLE_QGIS;
  2322. m_nLbtDown = 0;
  2323. }
  2324. void CQGISView::OnMenuAddEllipseQgis() 
  2325. {
  2326. // TODO: Add your command handler code here
  2327. CQGISDoc * pDoc = (CQGISDoc *)GetDocument();
  2328. pDoc->m_MenuItemID =  IDM_MENU_ADD_ELLIPSE_QGIS;
  2329. m_nLbtDown = 0;
  2330. CString szHelp = "本系统绘制椭圆,先拖动鼠标左键确定两端点确定椭圆的大小,然后在拉动橡皮线对椭圆的形状进行调整";
  2331. AfxMessageBox(szHelp);
  2332. }
  2333. //创建一个椭圆对象 并且返回其指针
  2334. CQEllipseObj * CQGISView::CreateEllipse(CQEllipseObj & Ellipse)
  2335. {
  2336. CQEllipseObj * pEllipse = new CQEllipseObj;
  2337. CQPoint centerPt;
  2338. Ellipse.GetCenterPoint(centerPt);
  2339. pEllipse->SetEllipseParams(centerPt.GetX(),centerPt.GetY(),Ellipse.GetLongAxis(),Ellipse.GetShortAxis(),
  2340. Ellipse.GetStartAngleRad(),Ellipse.GetEndAngleRad(),Ellipse.GetRotateAngleRad());
  2341. return pEllipse;
  2342. }
  2343. void CQGISView::DrawEllipse(CQEllipseObj & ellipse,CDC * pDC)
  2344. {
  2345.   CQCoordSys * pCs = GetDocument()->m_pMap->GetCoordSysPointer();
  2346. if(!pCs)return;
  2347. double x=0,y=0;//世界坐标
  2348. //////////////////////////////////////////////////////////////////////////
  2349. x = ellipse.GetStartAngleRad() - ellipse.GetRotateAngleRad();
  2350. y = ellipse.GetEndAngleRad() - ellipse.GetRotateAngleRad();
  2351. double dStart = min(x,y);
  2352. double dEnd = max(x,y);
  2353. double dStep = fabs(dEnd-dStart) / 100;//100个点绘制椭圆
  2354. if(dStep==0) return;
  2355. long lx=0,ly=0;//逻辑坐标
  2356. double a = ellipse.GetLongAxis();
  2357. double b = ellipse.GetShortAxis();
  2358. double i = dStart;
  2359. double xx=0,yy=0;
  2360. double ro = 0;
  2361. ro = a*b / sqrt( b*b*cos(i)*cos(i) + a*a*sin(i)*sin(i) );
  2362. x = cos(i) * ro;
  2363. y = sin(i) * ro;
  2364. xx = x*cos(ellipse.GetRotateAngleRad()) - y*sin(ellipse.GetRotateAngleRad());
  2365. yy = x*sin(ellipse.GetRotateAngleRad()) + y*cos(ellipse.GetRotateAngleRad());
  2366. CQPoint ptCenter;
  2367. ellipse.GetCenterPoint(ptCenter);
  2368. xx += ptCenter.GetX();
  2369. yy += ptCenter.GetY();
  2370. pCs->WPtoLP(xx,yy, &lx,&ly);
  2371. pDC->MoveTo(lx,ly);
  2372. for(;i<=dEnd;i+=dStep)
  2373. {
  2374. ro = a*b / sqrt( b*b*cos(i)*cos(i) + a*a*sin(i)*sin(i) );
  2375. x = cos(i) * ro;
  2376. y = sin(i) * ro;
  2377. xx = x*cos(ellipse.GetRotateAngleRad()) - y*sin(ellipse.GetRotateAngleRad());
  2378. yy = x*sin(ellipse.GetRotateAngleRad()) + y*cos(ellipse.GetRotateAngleRad());
  2379. xx += ptCenter.GetX();
  2380. yy += ptCenter.GetY();
  2381. pCs->WPtoLP(xx,yy, &lx,&ly);
  2382. pDC->LineTo(lx,ly);
  2383. }
  2384. i = dEnd;
  2385. ro = a*b / sqrt( b*b*cos(i)*cos(i) + a*a*sin(i)*sin(i) );
  2386. x = cos(i) * ro;
  2387. y = sin(i) * ro;
  2388. xx = x*cos(ellipse.GetRotateAngleRad()) - y*sin(ellipse.GetRotateAngleRad());
  2389. yy = x*sin(ellipse.GetRotateAngleRad()) + y*cos(ellipse.GetRotateAngleRad());
  2390. xx += ptCenter.GetX();
  2391. yy += ptCenter.GetY();
  2392. pCs->WPtoLP(xx,yy, &lx,&ly);
  2393. pDC->LineTo(lx,ly);
  2394. }
  2395. //保证点属性菜单 打开后有意义
  2396. void CQGISView::OnUpdateMenuPointAttsetQgis(CCmdUI* pCmdUI) 
  2397. {
  2398. // TODO: Add your command update UI handler code here
  2399. CQGISDoc * pDoc = GetDocument(); //获取文档对象的指针
  2400. ASSERT(pDoc);
  2401. CQSelObjManager * psel = pDoc->m_pMap->GetSelObjManager(); //选择对象管理器
  2402. ASSERT(psel);
  2403. int nSel = psel->GetSelObjCount();
  2404. if(nSel == 0) 
  2405. {
  2406. pCmdUI->Enable(FALSE);
  2407. return;
  2408. }
  2409. CQBaseObj * pObj = psel->GetCurSelObj();
  2410. if(pObj->GetObjType() == QGIS_OBJ_POINT && nSel == 1)
  2411. pCmdUI->Enable(TRUE);
  2412. else
  2413. pCmdUI->Enable(FALSE);
  2414. }
  2415. void CQGISView::OnMenuPointAttsetQgis() 
  2416. {
  2417. // TODO: Add your command handler code here
  2418. CQGISDoc * pDoc = GetDocument();
  2419. ASSERT(pDoc);
  2420. CQMapObj * pMap = pDoc->m_pMap;
  2421. ASSERT(pMap);
  2422. CQSelObjManager * pSel = pDoc->m_pMap->GetSelObjManager();
  2423. ASSERT(pSel);   // 获取选择对象管理器
  2424. CQCoordSys * pSys = pMap->GetCoordSysPointer();
  2425. ASSERT(pSys);
  2426. CQPointObj * pPoint = NULL;
  2427. pPoint = static_cast<CQPointObj *>(pSel->GetCurSelObj()); //static_cast在向下转换中是安全的
  2428. if(pPoint != NULL)
  2429. {
  2430. CQDlgPtAttSet ptDlg(pMap,pPoint);
  2431. if(ptDlg.DoModal() == IDOK)
  2432. {
  2433. CBoundaryRect bRect;
  2434. pPoint->CalculateBoundary(&bRect);
  2435. CRect rect;
  2436. pSys->WPtoLP(bRect,&rect);
  2437. pSel->EndFlash((CWnd*)this,2);
  2438. InvalidateRect(rect,TRUE);
  2439. }
  2440. }
  2441. }
  2442. //连点成线功能采取交互形式,每次选中一个点加入到线对象里
  2443. void CQGISView::OnMenuLinkPointToLineQgis() 
  2444. {
  2445. CQGISDoc * pDoc = GetDocument();
  2446. ASSERT(pDoc);
  2447. pDoc->m_MenuItemID = IDM_MENU_LINK_POINT_TO_LINE_QGIS;
  2448. m_nLbtDown = 0;
  2449. }
  2450. //添加流线
  2451. void CQGISView::OnMenuAddPolylineStream() 
  2452. {
  2453. // TODO: Add your command handler code here
  2454. CQGISDoc * pDoc = GetDocument();
  2455. ASSERT(pDoc);
  2456. pDoc->m_MenuItemID =  IDM_MENU_ADD_POLYLINE_STREAM;
  2457. m_nLbtDown = 0;
  2458. }
  2459. //刷新视图的代码
  2460. void CQGISView::OnMenuRefreshView() 
  2461. {
  2462. // TODO: Add your command handler code here
  2463. CQGISDoc * pDoc = GetDocument();
  2464. ASSERT(pDoc);
  2465. CQMapObj * pMap = pDoc->m_pMap;
  2466. ASSERT(pMap);
  2467. CQCoordSys * pCoord = pMap->GetCoordSysPointer();
  2468. ASSERT(pCoord);
  2469. CBoundaryRect bRect;
  2470. CRect rectTemp;
  2471. pMap->CalculateBoundary(&bRect);
  2472. pCoord->WPtoLP(bRect,&rectTemp);
  2473. InvalidateRect(rectTemp);
  2474. }
  2475. //全图显示
  2476. void CQGISView::OnMenuDrawAllobjInView() 
  2477. {
  2478. // TODO: Add your command handler code here
  2479. CQGISDoc * pDoc = GetDocument();
  2480. ASSERT(pDoc);
  2481. CQMapObj * pMap = pDoc->m_pMap;
  2482. ASSERT(pMap);
  2483. CQCoordSys * pCoord = pMap->GetCoordSysPointer();
  2484. ASSERT(pCoord);
  2485. pMap->DisplayAllInView(pCoord,this);
  2486. }
  2487. //图幅移动功能
  2488. void CQGISView::OnMenuMoveMap() 
  2489. {
  2490. CQGISDoc * pDoc = GetDocument(); //获取文档指针
  2491. ASSERT(pDoc);
  2492. if(pDoc->m_MenuItemID != ID_MENU_MOVE_MAP)
  2493. {
  2494. pDoc->m_MenuItemID = ID_MENU_MOVE_MAP;
  2495. pDoc->m_hCursorCur = ::LoadCursor(AfxGetInstanceHandle(),
  2496. MAKEINTRESOURCE(IDC_CURSOR_MOVE_MAP));
  2497. m_nLbtDown = 0;
  2498. }
  2499. }
  2500. CRect CQGISView::DrawAxis(BOOL bDraw,CDC * pDC,long &lWndX,long &lWndY)
  2501. {
  2502. //绘制坐标系的代码
  2503. if(pDC == NULL)
  2504. return CRect(0,0,0,0);
  2505. if(bDraw != TRUE)
  2506. return CRect(0,0,0,0);
  2507. CRect rectAxis;
  2508. long lOx = lWndX,lOy = lWndY;
  2509. long xArrow = (long)(5*tan(PI/4));
  2510. long Dx = lOx+80;
  2511. CPen pen(PS_SOLID,0,RGB(0,0,0));
  2512. CPen * pOldPen = pDC->SelectObject(&pen);
  2513. CBrush brush(RGB(0,0,0));
  2514. CBrush * pOldBrush = pDC->SelectObject(&brush);
  2515. pDC->MoveTo(lOx,lOy-80);
  2516. pDC->LineTo(lOx,lOy);
  2517. pDC->LineTo(lOx+80,lOy);
  2518. pDC->Ellipse(lOx-2,lOy-2,lOx+2,lOy+2);
  2519. //画向上的箭头的右半部分
  2520. pDC->MoveTo(lOx,lOy-80);
  2521. pDC->LineTo(lOx+xArrow,lOy-70);
  2522. pDC->TextOut(lOx+xArrow+10,lOy-70,"X");
  2523. //画向上的箭头的左半部分
  2524. pDC->MoveTo(lOx,lOy-80);
  2525. pDC->LineTo(lOx-xArrow,lOy-70);
  2526. //画向右的箭头
  2527. pDC->MoveTo(lOx+70,lOy+xArrow);
  2528. pDC->LineTo(lOx+80,lOy);
  2529. pDC->LineTo(lOx+70,lOy-xArrow);
  2530. pDC->TextOut(lOx+60,lOy-xArrow-15,"Y");
  2531. rectAxis.left = lOx-5;
  2532. rectAxis.top = lOy-80;
  2533. rectAxis.bottom = lOy+xArrow;
  2534. rectAxis.right = lOx+90;
  2535. pDC->SelectObject(pOldBrush);
  2536. pDC->SelectObject(pOldPen);
  2537. return rectAxis;
  2538. }
  2539. void CQGISView::OnMenuAxisQgis() 
  2540. {
  2541. CQGISDoc * pDoc = GetDocument();
  2542. ASSERT(pDoc);
  2543. CQCoordSys * pSys = pDoc->m_pMap->GetCoordSysPointer();
  2544. ASSERT(pSys);
  2545. static BOOL bShowAxis = FALSE;
  2546. static CRect rectAxis;
  2547. if((bShowAxis = !bShowAxis)!=FALSE)
  2548. {
  2549. CClientDC dc(this);
  2550. long lOrX = 0,lOrY = 0;
  2551. pSys->GetStartOfWnd(lOrX,lOrY);
  2552. m_bDrawAxis = TRUE;
  2553. rectAxis = DrawAxis(m_bDrawAxis,&dc,lOrX,lOrY);
  2554. }
  2555. else
  2556. {
  2557. m_bDrawAxis = FALSE;
  2558. InvalidateRect(rectAxis,TRUE);
  2559. }
  2560. }
  2561. //曲线光滑
  2562. void CQGISView::OnUpdateMenuInterpretationCurve(CCmdUI *pCmdUI)
  2563. {
  2564. CQGISDoc * pDoc = GetDocument();
  2565. ASSERT(pDoc);
  2566. CQSelObjManager * pSel = pDoc->m_pMap->GetSelObjManager();
  2567. ASSERT(pSel);
  2568. if(pSel->GetSelObjCount() == 0)
  2569. {
  2570. pCmdUI->SetCheck(0);
  2571. }
  2572. else
  2573. {
  2574. POSITION pos = pSel->GetHeadPosition();
  2575. WORD nCheck = 0;
  2576. while (pos)
  2577. {
  2578. CQBaseObj * pObj = pSel->GetNext(pos);
  2579. if(pObj->GetObjType() == QGIS_OBJ_LINE)
  2580. {
  2581. nCheck = 1;
  2582. break;
  2583. }
  2584. }
  2585. pCmdUI->SetCheck(nCheck);
  2586. }
  2587. }
  2588. void CQGISView::OnUpdateMenuTwiceBcurve(CCmdUI *pCmdUI)
  2589. {
  2590. CQGISDoc * pDoc = GetDocument();
  2591. ASSERT(pDoc);
  2592. CQSelObjManager * pSel = pDoc->m_pMap->GetSelObjManager();
  2593. ASSERT(pSel);
  2594. if(pSel->GetSelObjCount() == 0)
  2595. {
  2596. pCmdUI->SetCheck(0);
  2597. }
  2598. else
  2599. {
  2600. POSITION pos = pSel->GetHeadPosition();
  2601. WORD nCheck = 0;
  2602. while (pos)
  2603. {
  2604. CQBaseObj * pObj = pSel->GetNext(pos);
  2605. if(pObj->GetObjType() == QGIS_OBJ_LINE)
  2606. {
  2607. nCheck = 1;
  2608. break;
  2609. }
  2610. }
  2611. pCmdUI->SetCheck(nCheck);
  2612. }
  2613. }
  2614. void CQGISView::OnUpdateMenuThirdBcurve(CCmdUI *pCmdUI)
  2615. {
  2616. CQGISDoc * pDoc = GetDocument();
  2617. ASSERT(pDoc);
  2618. CQSelObjManager * pSel = pDoc->m_pMap->GetSelObjManager();
  2619. ASSERT(pSel);
  2620. if(pSel->GetSelObjCount() == 0)
  2621. {
  2622. pCmdUI->SetCheck(0);
  2623. }
  2624. else
  2625. {
  2626. POSITION pos = pSel->GetHeadPosition();
  2627. WORD nCheck = 0;
  2628. while (pos)
  2629. {
  2630. CQBaseObj * pObj = pSel->GetNext(pos);
  2631. if(pObj->GetObjType() == QGIS_OBJ_LINE)
  2632. {
  2633. nCheck = 1;
  2634. break;
  2635. }
  2636. }
  2637. pCmdUI->SetCheck(nCheck);
  2638. }
  2639. }
  2640. void CQGISView::OnMenuInterpretationCurve()
  2641. {
  2642. CQGISDoc * pDoc = GetDocument();
  2643. ASSERT(pDoc);
  2644. CQSelObjManager * pSel = pDoc->m_pMap->GetSelObjManager();
  2645. ASSERT(pSel);
  2646. CQCoordSys * pCoordsys = pDoc->m_pMap->GetCoordSysPointer();
  2647. ASSERT(pCoordsys);
  2648. POSITION pos = pSel->GetHeadPosition();
  2649. CBoundaryRect bRect,bUnionRect;
  2650. while (pos)
  2651. {
  2652. CQBaseObj * pObj = pSel->GetNext(pos);
  2653. if(pObj->GetObjType() == QGIS_OBJ_LINE)
  2654. {
  2655. CQLineObj * pLine = dynamic_cast<CQLineObj *>(pObj);
  2656. if(pLine != NULL)
  2657. {
  2658. pLine->PtListBeThin(0.00001f);
  2659. pLine->SetSplineType(1);
  2660. pLine->CalculateBoundary(&bRect);
  2661. bRect.Lager(1.0f);
  2662. bUnionRect.Union(&bRect);
  2663. }
  2664. }
  2665. }
  2666. if(bRect.IsValid() != FALSE)
  2667. {
  2668. CRect rectTm;
  2669. pCoordsys->WPtoLP(bRect,&rectTm);
  2670. InvalidateRect(rectTm,TRUE);
  2671. }
  2672. pSel->EndFlash(this->GetSafeHwnd(),1);
  2673. }
  2674. //二次样条
  2675. void CQGISView::OnMenuTwiceBcurve()
  2676. {
  2677. CQGISDoc * pDoc = GetDocument();
  2678. ASSERT(pDoc);
  2679. CQSelObjManager * pSel = pDoc->m_pMap->GetSelObjManager();
  2680. ASSERT(pSel);
  2681. CQCoordSys * pCoordsys = pDoc->m_pMap->GetCoordSysPointer();
  2682. ASSERT(pCoordsys);
  2683. POSITION pos = pSel->GetHeadPosition();
  2684. CBoundaryRect bRect,bUnionRect;
  2685. while (pos)
  2686. {
  2687. CQBaseObj * pObj = pSel->GetNext(pos);
  2688. if(pObj->GetObjType() == QGIS_OBJ_LINE)
  2689. {
  2690. CQLineObj * pLine = dynamic_cast<CQLineObj *>(pObj);
  2691. if(pLine != NULL)
  2692. {
  2693. pLine->PtListBeThin(0.00001f);
  2694. pLine->SetSplineType(2);
  2695. pLine->CalculateBoundary(&bRect);
  2696. bUnionRect.Union(&bRect);
  2697. }
  2698. }
  2699. }
  2700. if(bRect.IsValid() != FALSE)
  2701. {
  2702. CRect rectTm;
  2703. pCoordsys->WPtoLP(bRect,&rectTm);
  2704. InvalidateRect(rectTm,TRUE);
  2705. }
  2706. pSel->EndFlash(this->GetSafeHwnd(),1);
  2707. }
  2708. //三次样条
  2709. void CQGISView::OnMenuThirdBcurve()
  2710. {
  2711. CQGISDoc * pDoc = GetDocument();
  2712. ASSERT(pDoc);
  2713. CQSelObjManager * pSel = pDoc->m_pMap->GetSelObjManager();
  2714. ASSERT(pSel);
  2715. CQCoordSys * pCoordsys = pDoc->m_pMap->GetCoordSysPointer();
  2716. ASSERT(pCoordsys);
  2717. POSITION pos = pSel->GetHeadPosition();
  2718. CBoundaryRect bRect,bUnionRect;
  2719. while (pos)
  2720. {
  2721. CQBaseObj * pObj = pSel->GetNext(pos);
  2722. if(pObj->GetObjType() == QGIS_OBJ_LINE)
  2723. {
  2724. CQLineObj * pLine = dynamic_cast<CQLineObj *>(pObj);
  2725. if(pLine != NULL)
  2726. {
  2727. pLine->PtListBeThin(0.00001f);
  2728. pLine->SetSplineType(3);
  2729. pLine->CalculateBoundary(&bRect);
  2730. bUnionRect.Union(&bRect);
  2731. }
  2732. }
  2733. }
  2734. if(bRect.IsValid() != FALSE)
  2735. {
  2736. CRect rectTm;
  2737. pCoordsys->WPtoLP(bRect,&rectTm);
  2738. InvalidateRect(rectTm,TRUE);
  2739. }
  2740. pSel->EndFlash(this->GetSafeHwnd(),1);
  2741. }
  2742. //选择点
  2743. void CQGISView::OnMenuSelectPointQgis()
  2744. {
  2745. CQGISDoc * pDoc = GetDocument();
  2746. ASSERT(pDoc);
  2747. pDoc->m_MenuItemID = IDM_MENU_RECT_SELECT_OBJ_QGIS;
  2748. m_nLbtDown = 0;
  2749. m_nSelectType = QGIS_SELECT_POINT; //选择点
  2750. }
  2751. void CQGISView::OnMenuPtLinkToLineQgis()
  2752. {
  2753. CQGISDoc * pDoc = GetDocument();
  2754. ASSERT(pDoc);
  2755. CQSelObjManager * pSM = pDoc->m_pMap->GetSelObjManager();
  2756. ASSERT(pSM);
  2757. CQCoordSys * pCoordSys = pDoc->m_pMap->GetCoordSysPointer();
  2758. ASSERT(pCoordSys);
  2759. if(pSM->GetSelObjCount()>2)
  2760. return;
  2761. POSITION pos = pSM->GetHeadPosition();
  2762. CQPointObj * pPt = NULL;
  2763. CQLineObj * pLine = NULL;
  2764. CQBaseObj * pObj = NULL;
  2765. while (pos)
  2766. {
  2767. pObj = pSM->GetNext(pos);
  2768. if(pObj->GetObjType() == QGIS_OBJ_POINT)
  2769. {
  2770. pPt = dynamic_cast<CQPointObj *>(pObj);
  2771. }
  2772. else if(pObj->GetObjType() == QGIS_OBJ_LINE)
  2773. {
  2774. pLine = dynamic_cast<CQLineObj *>(pObj);
  2775. }
  2776. }
  2777. if(pPt!=NULL && pLine!=NULL)
  2778. {
  2779. //求出点到直线两端点的距离
  2780. CBoundaryRect bRect;
  2781. int nPtCount = pLine->m_ptListDisplay.GetSize();
  2782. CQPoint ptPt;
  2783. double dx=0.0f,dy=0.0f;
  2784. pPt->GetPointPos(dx,dy);
  2785. ptPt.SetPoint(dx,dy);
  2786. CQPoint * ptOne = pLine->m_PtList.GetPoint(0);
  2787. CQPoint * ptLast = pLine->m_PtList.GetPoint(nPtCount-1);
  2788. double dDisOne=0.0f,dDisTwo=0.0f;
  2789. dDisOne = ptPt.Distance(*ptOne);
  2790. dDisTwo = ptPt.Distance(*ptLast);
  2791. if(dDisOne<=dDisTwo)
  2792. {
  2793. pLine->m_PtList.InsertAt(0,ptPt.GetX(),ptPt.GetY());
  2794. }
  2795. else
  2796. {
  2797. pLine->m_PtList.AddPoint(ptPt.GetX(),ptPt.GetY());
  2798. }
  2799. pLine->CalculateBoundary(&bRect);
  2800. CRect rect;
  2801. pCoordSys->WPtoLP(bRect,&rect);
  2802. InvalidateRect(rect,FALSE);
  2803. }
  2804. pSM->EndFlash(this->GetSafeHwnd(),2);
  2805. }
  2806. void CQGISView::OnUpdateMenuPtLinkToLineQgis(CCmdUI *pCmdUI)
  2807. {
  2808. CQGISDoc * pDoc = GetDocument();
  2809. ASSERT(pDoc);
  2810. CQSelObjManager * pSel = pDoc->m_pMap->GetSelObjManager();
  2811. ASSERT(pSel);
  2812. POSITION pos = pSel->GetHeadPosition();
  2813. int nSelCount = pSel->GetSelObjCount();
  2814. if(nSelCount<=0)
  2815. {
  2816. pCmdUI->Enable(FALSE);
  2817. return;
  2818. }
  2819. int i=0;
  2820. while (pos)
  2821. {
  2822. CQBaseObj * pObj = pSel->GetNext(pos);
  2823. if(pObj->GetObjType() == QGIS_OBJ_POINT || pObj->GetObjType() == QGIS_OBJ_LINE)
  2824. {
  2825. break;
  2826. }
  2827. ++i;
  2828. }
  2829. if(i>nSelCount || nSelCount>2)
  2830. {
  2831. pCmdUI->Enable(FALSE);
  2832. }
  2833. else
  2834. {
  2835. pCmdUI->Enable(TRUE);
  2836. }
  2837. }
  2838. //添加垂直线
  2839. void CQGISView::OnMenuAddVervicalLineQgis()
  2840. {
  2841. CQGISDoc * pDoc = GetDocument();
  2842. ASSERT(pDoc);
  2843. pDoc->m_MenuItemID = ID_MENU_ADD_VERVICAL_LINE_QGIS;
  2844. m_nLbtDown = 0;
  2845. }
  2846. // 添加水平线
  2847. void CQGISView::OnMenuAddHoriLineQgis()
  2848. {
  2849. CQGISDoc * pDoc = GetDocument();
  2850. ASSERT(pDoc);
  2851. pDoc->m_MenuItemID = ID_MENU_ADD_HORI_LINE_QGIS;
  2852. m_nLbtDown = 0;
  2853. }
  2854. void CQGISView::OnDglspkLineGetptQgis()
  2855. {
  2856. CQGISDoc * pDoc = GetDocument();
  2857. ASSERT(pDoc);
  2858. CQSelObjManager * pSel = pDoc->m_pMap->GetSelObjManager();
  2859. ASSERT(pSel);
  2860. CQCoordSys * pCoordObj = pDoc->m_pMap->GetCoordSysPointer();
  2861. ASSERT(pCoordObj);
  2862. if(pSel->GetSelObjCount() == 1)
  2863. {
  2864. CQBaseObj * pBase = pSel->GetCurSelObj();
  2865. if(pBase != NULL && pBase->GetObjType() == QGIS_OBJ_LINE)
  2866. {
  2867. CQLineObj * pLine = dynamic_cast<CQLineObj *>(pBase);
  2868. if(pLine != NULL)
  2869. {
  2870. double fBeThin = 0.0f;
  2871. CDlgLineBeThin dlg;
  2872. if(dlg.DoModal() == IDOK)
  2873. {
  2874. fBeThin = dlg.m_fBeThin;
  2875. CQGISAlgorithmLib::PtListLess(pLine->m_PtList,fBeThin);
  2876. CBoundaryRect bRect;
  2877. pLine->CalculateBoundary(&bRect);
  2878. CRect rect;
  2879. pCoordObj->WPtoLP(bRect,&rect);
  2880. InvalidateRect(rect,TRUE);
  2881. pSel->EndFlash(this->GetSafeHwnd(),2);
  2882. }
  2883. }
  2884. }
  2885. }
  2886. }
  2887. void CQGISView::OnUpdateDglspkLineGetptQgis(CCmdUI *pCmdUI)
  2888. {
  2889. CQGISDoc * pDoc = GetDocument();
  2890. ASSERT(pDoc);
  2891. CQSelObjManager * pSel = pDoc->m_pMap->GetSelObjManager();
  2892. ASSERT(pSel);
  2893. if(pSel->GetSelObjCount() == 0)
  2894. {
  2895. pCmdUI->Enable(FALSE);
  2896. }
  2897. else
  2898. {
  2899. if(pSel->GetSelObjCount() == 1)
  2900. {
  2901. CQBaseObj * pbase = pSel->GetCurSelObj();
  2902. if(pbase->GetObjType() == QGIS_OBJ_LINE)
  2903. {
  2904. pCmdUI->Enable(TRUE);
  2905. return;
  2906. }
  2907. }
  2908. }
  2909. pCmdUI->Enable(FALSE);
  2910. }
  2911. void CQGISView::OnMenuAddTextQgis()
  2912. {
  2913. CQGISDoc * pDoc = GetDocument();
  2914. ASSERT(pDoc);
  2915. pDoc->m_MenuItemID = ID_MENU_ADD_TEXT_QGIS;
  2916. m_nLbtDown = 0;
  2917. }
  2918. void CQGISView::OnMenuTextParaSet()
  2919. {
  2920. CQGISDoc * pDoc = GetDocument();
  2921. ASSERT(pDoc);
  2922. CQSelObjManager * pSel = pDoc->m_pMap->GetSelObjManager();
  2923. ASSERT(pSel);
  2924. CQCoordSys * pSys = pDoc->m_pMap->GetCoordSysPointer();
  2925. ASSERT(pSys);
  2926. POSITION pos = pSel->GetHeadPosition();
  2927. CQTextObj * pTextObj = NULL;
  2928. while (pos)
  2929. {
  2930. CQBaseObj * pObj = pSel->GetNext(pos);
  2931. if(pObj->GetObjType() == QGIS_OBJ_LABEL)
  2932. {
  2933. pTextObj = dynamic_cast<CQTextObj *>(pObj);
  2934. break;
  2935. }
  2936. }
  2937. if(pTextObj != NULL)
  2938. {
  2939. QDlgTextSet dlg(pTextObj);
  2940. if(dlg.DoModal() == IDOK)
  2941. {
  2942. CBoundaryRect bRect;
  2943. CRect rect;
  2944. pTextObj->CalculateBoundary(&bRect);
  2945. pSys->WPtoLP(bRect,&rect);
  2946. pSel->EndFlash(this->GetSafeHwnd(),2);
  2947. InvalidateRect(rect,TRUE);
  2948. }
  2949. }
  2950. }
  2951. //Excel文件矢量化
  2952. void CQGISView::OnMenuReadExcelQgis()
  2953. {
  2954. CQGISDoc * pDoc = GetDocument();
  2955. ASSERT(pDoc);
  2956. pDoc->m_MenuItemID = ID_MENU_READ_EXCEL_QGIS;
  2957. m_nLbtDown = 0;
  2958. }