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

GDI/图象编程

开发平台:

Visual C++

  1. // DlgLayerManager.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "..qgis.h"
  5. #include "DlgLayerManager.h"
  6. #include "..QObjectsincludeQLayerObj.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CDlgLayerManager dialog
  14. //第一个参数是操作类别
  15. CDlgLayerManager::CDlgLayerManager(int nOpflag,CQMapObj * pMap,CWnd* pParent /*=NULL*/)
  16. : CDialog(CDlgLayerManager::IDD, pParent)
  17. {
  18. //{{AFX_DATA_INIT(CDlgLayerManager)
  19. //}}AFX_DATA_INIT
  20. if(!pMap)return;
  21. m_pMap = pMap;
  22. m_nIndex = -1; //表示图层的正确位置
  23. m_nOpflag = nOpflag;
  24. }
  25. void CDlgLayerManager::DoDataExchange(CDataExchange* pDX)
  26. {
  27. CDialog::DoDataExchange(pDX);
  28. //{{AFX_DATA_MAP(CDlgLayerManager)
  29. DDX_Control(pDX, IDC_LIST_LAYER_QGIS, m_LayerList);
  30. DDX_Text(pDX,IDC_EDIT_LAYER_ID_QGIS,m_lLayerID);
  31. DDX_Text(pDX,IDC_EDIT_LAYER_NAME_QGIS,m_szLayerName);
  32. DDX_Text(pDX,IDC_EDIT_LAYER_DIS_QGIS,m_szLayerDis);
  33. DDX_Radio(pDX,IDC_RADIO_LAYER_SHOW,m_nLayerShow);
  34. DDX_Radio(pDX,IDC_RADIO_LAYER_DELETE_QGIS,m_nLayerDel);
  35. DDX_Radio(pDX,IDC_RADIO_LAYER_EDIT_QGIS,m_nLayerEdit);
  36. //}}AFX_DATA_MAP
  37. }
  38. BEGIN_MESSAGE_MAP(CDlgLayerManager, CDialog)
  39. //{{AFX_MSG_MAP(CDlgLayerManager)
  40. ON_NOTIFY(NM_CLICK, IDC_LIST_LAYER_QGIS, OnClickListLayerQgis)
  41. ON_BN_CLICKED(IDC_BUTTON_NEW_LAYER_QGIS, OnButtonNewLayerQgis)
  42. ON_BN_CLICKED(IDC_BUTTON_DELETE_LAYER_QGIS, OnButtonDeleteLayerQgis)
  43. ON_BN_CLICKED(IDC_BUTTON_TOP_QGIS, OnButtonTopQgis)
  44. ON_BN_CLICKED(IDC_BUTTON_BOTTOM_QGIS, OnButtonBottomQgis)
  45. ON_BN_CLICKED(IDC_BUTTON_PRE_QGIS, OnButtonPreQgis)
  46. ON_BN_CLICKED(IDC_BUTTON_NEXT_QGIS, OnButtonNextQgis)
  47. ON_BN_CLICKED(IDC_BUTTON_SET_CUR_QGIS,OnButtonSetCurQgis)
  48. //}}AFX_MSG_MAP
  49. END_MESSAGE_MAP()
  50. /////////////////////////////////////////////////////////////////////////////
  51. // CDlgLayerManager message handlers
  52. BOOL CDlgLayerManager::OnInitDialog() 
  53. {
  54. CDialog::OnInitDialog();
  55. //初始化列表控件
  56. m_pcurLyr = NULL;
  57. m_pcurLyr = m_pMap->GetCurLayer();
  58. if(!m_pcurLyr) return FALSE;
  59. if(m_nOpflag == 0)
  60. SetControlEdit(FALSE);
  61. else if(m_nOpflag == 1)
  62. SetControlEdit(TRUE);
  63. m_LayerList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
  64.     m_LayerList.InsertColumn(0,"图层ID",LVCFMT_CENTER,80);
  65. m_LayerList.InsertColumn(1,"图层名称",LVCFMT_CENTER,120);
  66. m_LayerList.InsertColumn(2,"图层描述",LVCFMT_CENTER,120);
  67. m_LayerList.InsertColumn(3,"显示状态",LVCFMT_CENTER,80);  // return TRUE unless you set the focus to a control
  68. m_LayerList.InsertColumn(4,"可编辑状态",LVCFMT_CENTER,100);     
  69. m_LayerList.InsertColumn(5,"当前图层",LVCFMT_CENTER,100);
  70. GetDlgItem(IDC_EDIT_LAYER_ID_QGIS)->EnableWindow(FALSE);
  71. ResetList(m_pMap);
  72. int nLayercount = m_pMap->GetLayerCount();
  73. m_pLyrVector.clear();
  74. for(int i=0;i<nLayercount;i++)
  75. {
  76. CQLayerObj * pLyr = m_pMap->GetLayer(i);
  77. if(pLyr && !pLyr->GetDeleteFlag())
  78. {
  79. m_pLyrVector.push_back(pLyr);
  80. }
  81. }
  82. CString szLayerCount;
  83. szLayerCount.Format("%d",nLayercount);
  84. GetDlgItem(IDC_EDIT_LAYER_COUNT_QGIS)->SetWindowText(LPCTSTR(szLayerCount));
  85. GetDlgItem(IDC_EDIT_CUR_LAYER_NAME_QGIS)->SetWindowText(LPCTSTR(m_pcurLyr->GetLayerName()));
  86. return TRUE;  // return TRUE unless you set the focus to a control
  87.               // EXCEPTION: OCX Property Pages should return FALSE
  88. }
  89. void CDlgLayerManager::ResetList(CQMapObj *pMap)
  90. {
  91. UpdateData(TRUE);
  92. m_LayerList.DeleteAllItems();
  93. if(!pMap) return;
  94. int nLayerCount = pMap->GetLayerCount();
  95. if(nLayerCount == 0)return;
  96. int nitem = 0;
  97. long lCurLyrId = m_pMap->GetCurLayer()->GetLayerID();
  98. for(int i=0;i<nLayerCount;i++)
  99. {
  100. CQLayerObj * pLayer = pMap->GetLayer(i);
  101. if(!pLayer)return;
  102. if(pLayer->GetDeleteFlag())continue;
  103. long lID = pLayer->GetLayerID();
  104. CString szID;
  105. szID.Format("%ld",lID);
  106. CString szLayerName = pLayer->GetLayerName();
  107. CString szLayerDis = pLayer->GetLayerDis();
  108. BOOL bCanEdit = pLayer->GetEditFlag();
  109. BOOL bShow = pLayer->GetShowFlag();
  110. CString szCurLyr;
  111. szCurLyr = (lCurLyrId == lID) ? "是" : "否";
  112. CString szShow,szDelete,szEdit;
  113. szShow = bShow ? "显示" : "隐藏";
  114. szEdit = bCanEdit ? "可编辑" : "冻结";
  115. nitem = m_LayerList.InsertItem(0xffff,LPCTSTR(szID));
  116. m_LayerList.SetItem(nitem,1,1,LPCTSTR(szLayerName),NULL,0,0,0);
  117. m_LayerList.SetItem(nitem,2,1,LPCTSTR(szLayerDis),NULL,0,0,0);
  118. m_LayerList.SetItem(nitem,3,1,LPCTSTR(szShow),NULL,0,0,0);
  119. m_LayerList.SetItem(nitem,4,1,LPCTSTR(szEdit),NULL,0,0,0);
  120. m_LayerList.SetItem(nitem,5,1,LPCTSTR(szCurLyr),NULL,0,0,0);
  121. }
  122. m_pcurLyr = NULL;
  123. m_pcurLyr = m_pMap->GetCurLayer();
  124. if(!m_pcurLyr)
  125. {
  126. AfxMessageBox("获取当前图层失败!");
  127. return;
  128. }
  129. SetControlContent(m_pcurLyr);
  130. UpdateData(FALSE);
  131. }
  132. void CDlgLayerManager::ResetList(vector<CQLayerObj *> pLyrVector)
  133. {
  134. UpdateData(TRUE);
  135. m_LayerList.DeleteAllItems();
  136. if(!m_pMap) return;
  137. int nLayerCount = pLyrVector.size();
  138. if(nLayerCount == 0)return;
  139. int nitem = 0;
  140. long lCurLyrId = m_pcurLyr->GetLayerID();
  141. for(int i=0;i<nLayerCount;i++)
  142. {
  143. CQLayerObj * pLayer = pLyrVector[i];
  144. if(!pLayer)return;
  145. if(pLayer->GetDeleteFlag())continue;
  146. long lID = pLayer->GetLayerID();
  147. CString szID;
  148. szID.Format("%ld",lID);
  149. CString szLayerName = pLayer->GetLayerName();
  150. CString szLayerDis = pLayer->GetLayerDis();
  151. BOOL bCanEdit = pLayer->GetEditFlag();
  152. BOOL bShow = pLayer->GetShowFlag();
  153. CString szCurLyr;
  154. szCurLyr = (lCurLyrId == lID) ? "是" : "否";
  155. CString szShow,szDelete,szEdit;
  156. szShow = bShow ? "显示" : "隐藏";
  157. szEdit = bCanEdit ? "可编辑" : "冻结";
  158. nitem = m_LayerList.InsertItem(0xffff,LPCTSTR(szID));
  159. m_LayerList.SetItem(nitem,1,1,LPCTSTR(szLayerName),NULL,0,0,0);
  160. m_LayerList.SetItem(nitem,2,1,LPCTSTR(szLayerDis),NULL,0,0,0);
  161. m_LayerList.SetItem(nitem,3,1,LPCTSTR(szShow),NULL,0,0,0);
  162. m_LayerList.SetItem(nitem,4,1,LPCTSTR(szEdit),NULL,0,0,0);
  163. m_LayerList.SetItem(nitem,5,1,LPCTSTR(szCurLyr),NULL,0,0,0);
  164. }
  165. UpdateData(FALSE);
  166. }
  167. //设置控件的操作状态 
  168. void CDlgLayerManager::SetControlEdit(BOOL bEdit)
  169. {
  170. int nLayercount = m_pLyrVector.size();
  171. if(nLayercount == 1)
  172. {
  173. GetDlgItem(IDC_RADIO_LAYER_DELETE_QGIS)->EnableWindow(FALSE);
  174. GetDlgItem(IDC_RADIO_LAYER_UDELETE_QGIS)->EnableWindow(FALSE);
  175. }
  176. else
  177. {
  178. GetDlgItem(IDC_RADIO_LAYER_DELETE_QGIS)->EnableWindow(bEdit);
  179. GetDlgItem(IDC_RADIO_LAYER_UDELETE_QGIS)->EnableWindow(bEdit);
  180. }
  181. }
  182. void CDlgLayerManager::OnClickListLayerQgis(NMHDR* pNMHDR, LRESULT* pResult) 
  183. {
  184. // TODO: Add your control notification handler code here
  185. m_nIndex = -1;
  186. POSITION pos = m_LayerList.GetFirstSelectedItemPosition();
  187. m_nIndex=m_LayerList.GetNextSelectedItem(pos);
  188. if(m_nIndex>-1)
  189. {
  190. CQLayerObj * pLyr = NULL;
  191. pLyr = m_pLyrVector[m_nIndex];
  192. if(!pLyr->GetDeleteFlag() && pLyr)
  193. {
  194. SetControlContent(pLyr);
  195. }
  196. }
  197. *pResult = 0;
  198. }
  199. void CDlgLayerManager::SetControlContent(CQLayerObj *pLayer)
  200. {
  201. UpdateData(TRUE);
  202. CQLayerObj * ppLayer = NULL;
  203. ppLayer = pLayer;
  204. if(!ppLayer)
  205. {
  206. AfxMessageBox("当前图层对象不存在!");
  207. return;
  208. }
  209. m_lLayerID = ppLayer->GetLayerID();
  210. m_szLayerName = ppLayer->GetLayerName();
  211. m_szLayerDis = ppLayer->GetLayerDis();
  212. m_nLayerShow = ppLayer->GetShowFlag() ? 0 : 1;
  213. m_nLayerDel = ppLayer->GetDeleteFlag() ? 0 : 1;
  214. m_nLayerEdit = ppLayer->GetEditFlag() ? 0 : 1;
  215. UpdateData(FALSE);
  216. }
  217. void CDlgLayerManager::OnOK()
  218. {
  219. UpdateData(TRUE);
  220. int nLayerCount = m_pLyrVector.size();
  221. if(nLayerCount == 1 && m_nLayerDel == 0)
  222. {
  223. AfxMessageBox("地图中必须存在一个图层!");
  224. m_nLayerDel = 0;
  225. UpdateData(FALSE);
  226. return;
  227. }
  228. int nLyrCount = 0;
  229. for(int i=0;i<nLayerCount;i++)
  230. {
  231. CQLayerObj * player = m_pLyrVector[i];
  232. if(!player) return;
  233. if(player->GetLayerName().IsEmpty())
  234. {
  235. nLyrCount++;
  236. long lId = player->GetLayerID();
  237. CString szName;
  238. szName.Format("%ld",lId);
  239. player->SetLayerName(szName);
  240. }
  241. }
  242. if(nLyrCount != 0)
  243. {
  244. AfxMessageBox("经过图层修改信息修改后,有%d个图层的名称为空,为了使一个图层有意义,系统已经进行了自动赋值操作,请见谅!");
  245. ResetList(m_pLyrVector);
  246. return;
  247. }
  248. int nLayerCountInMap = m_pMap->GetLayerCount();
  249. for(int m=0;m<nLayerCountInMap;m++)
  250. {
  251. CQLayerObj * pLyr = m_pMap->GetLayer(m);
  252. if(!pLyr) return;
  253. m_pMap->RemoveLayer(pLyr);  //可以全部都删除
  254. }
  255. for(int j=0;j<nLayerCount;j++)
  256. {
  257. if(m_pLyrVector[j])
  258. {
  259. m_pMap->AddLayer(m_pLyrVector[j]);
  260. m_pLyrVector[j]->SetMapID(m_pMap->GetMapID());
  261. }
  262. }
  263. CDialog::OnOK();
  264. }
  265. //新建图层
  266. void CDlgLayerManager::OnButtonNewLayerQgis() 
  267. {
  268. // TODO: Add your control notification handler code here
  269. UpdateData(TRUE);
  270. if(!m_pMap) 
  271. {
  272. AfxMessageBox("当前的地图对象不存在!");
  273. return;
  274. }
  275. CQLayerObj * pLyr = NULL;
  276. pLyr = new CQLayerObj;
  277. if(!pLyr)
  278. {
  279. AfxMessageBox("图层创建失败!");
  280. return;
  281. }
  282. pLyr->SetMapID(m_pMap->GetMapID());
  283. long lLayerID = pLyr->GetLayerID();
  284. //到最后点击了确定后才能生效 m_pMap->AddLayer(pLyr);
  285. //m_pMap->SetCurLayer(pLyr);
  286. m_pLyrVector.push_back(pLyr);
  287. int nLyrCount = m_pLyrVector.size();
  288. CString szLayerCount;
  289. szLayerCount.Format("%d",nLyrCount);
  290. ResetList(m_pLyrVector);  //在这里面已经设置了的显示当前图层的显示顺序 
  291. SetControlEdit(TRUE);
  292. GetDlgItem(IDC_EDIT_LAYER_COUNT_QGIS)->SetWindowText(LPCTSTR(szLayerCount));
  293. UpdateData(FALSE);
  294. }
  295. //删除图层
  296. void CDlgLayerManager::OnButtonDeleteLayerQgis() 
  297. {
  298. // TODO: Add your control notification handler code here
  299. if(m_nIndex == -1) 
  300. {
  301. AfxMessageBox("请先选择要删除的图层");
  302. return;
  303. }
  304. if(!m_pMap)
  305. {
  306. AfxMessageBox("当前地图不存在!");
  307. return;
  308. }
  309. int nLyrcount = m_pLyrVector.size();
  310. if(m_nIndex > nLyrcount-1)
  311. {
  312. AfxMessageBox("图层索引超出限差");
  313. return;
  314. }
  315. long nLyr = m_pcurLyr->GetLayerID();
  316. if(nLyr == m_pLyrVector[m_nIndex]->GetLayerID()) 
  317. {
  318. AfxMessageBox("当前图层不能删除!");
  319. return;
  320. }
  321. m_pLyrVector[m_nIndex]->SetDeleteFlag(TRUE);
  322. ResetList(m_pLyrVector);
  323. SetControlContent(m_pcurLyr);
  324. int nLyrCount = m_pLyrVector.size();
  325. m_nIndex = -1;
  326. CString szLayerCount;
  327. szLayerCount.Format("%d",nLyrCount);
  328. SetControlEdit(FALSE);
  329. GetDlgItem(IDC_EDIT_LAYER_COUNT_QGIS)->SetWindowText(LPCTSTR(szLayerCount));
  330. GetDlgItem(IDC_EDIT_CUR_LAYER_NAME_QGIS)->SetWindowText(LPCTSTR(m_pcurLyr->GetLayerName()));
  331. UpdateData(FALSE);
  332. }
  333. //置换图层的顺序
  334. //将最后一个图层的位置移动到第一个
  335. void CDlgLayerManager::OnButtonTopQgis() 
  336. {
  337. // TODO: Add your control notification handler code here
  338. if(!m_pMap)
  339. {
  340. AfxMessageBox("当前地图不存在!");
  341. return;
  342. }
  343. int nLyrCount = m_pLyrVector.size();
  344. if(nLyrCount == 0)return;
  345. CQLayerObj * pTemp = NULL; //临时变量用于交换指针
  346. pTemp = m_pLyrVector[0];
  347. m_pLyrVector[0] = m_pLyrVector[nLyrCount-1];
  348. m_pLyrVector[nLyrCount-1] = pTemp;
  349. ResetList(m_pLyrVector);
  350. m_LayerList.SetSelectionMark(0);
  351. }
  352. //将第一个图层移动到最后的一个位置
  353. void CDlgLayerManager::OnButtonBottomQgis() 
  354. {
  355. // TODO: Add your control notification handler code here
  356. if(!m_pMap)
  357. {
  358. AfxMessageBox("当前地图不存在!");
  359. return;
  360. }
  361. int nLyrCount = m_pLyrVector.size();
  362. if(nLyrCount == 0)return;
  363. CQLayerObj * pTemp = NULL;
  364. pTemp = m_pLyrVector[0];
  365. m_pLyrVector[0] = m_pLyrVector[nLyrCount-1];
  366. m_pLyrVector[nLyrCount-1] = pTemp;
  367. ResetList(m_pLyrVector);
  368. m_LayerList.SetSelectionMark(nLyrCount-1);
  369. }
  370. void CDlgLayerManager::OnButtonPreQgis() 
  371. {
  372. // TODO: Add your control notification handler code here
  373. if(!m_pMap)
  374. {
  375. AfxMessageBox("当前地图不存在!");
  376. return;
  377. }
  378. if(m_nIndex <= -1)
  379. {
  380. AfxMessageBox("请先在列表框中选中你要移动位置的图层!");
  381. return;
  382. }
  383. if(m_nIndex<1)
  384. return;
  385. CQLayerObj * pTemp = NULL;
  386. pTemp = m_pLyrVector[m_nIndex];
  387. m_pLyrVector[m_nIndex] = m_pLyrVector[m_nIndex-1];
  388. m_pLyrVector[m_nIndex-1] = pTemp;
  389. m_nIndex--;
  390. ResetList(m_pLyrVector);
  391. m_LayerList.SetSelectionMark(m_nIndex);
  392. }
  393. void CDlgLayerManager::OnButtonNextQgis() 
  394. {
  395. // TODO: Add your control notification handler code here
  396. if(!m_pMap)
  397. {
  398. AfxMessageBox("当前地图不存在!");
  399. return;
  400. }
  401. int nLyrCount = m_pLyrVector.size();
  402. if(nLyrCount == 0)return;
  403. if(m_nIndex>=nLyrCount-1)
  404. return;
  405. CQLayerObj * pTemp = NULL;
  406. pTemp = m_pLyrVector[m_nIndex];
  407. m_pLyrVector[m_nIndex] = m_pLyrVector[m_nIndex+1];
  408. m_pLyrVector[m_nIndex+1] = pTemp;
  409. m_nIndex++;
  410. ResetList(m_pLyrVector);
  411. m_LayerList.SetSelectionMark(m_nIndex);
  412. }
  413. void CDlgLayerManager::OnButtonSetCurQgis() 
  414. {
  415. // TODO: Add your control notification handler code here
  416. UpdateData(TRUE);
  417. if(m_nIndex == -1 || !m_pMap)
  418. {
  419. AfxMessageBox("图层索引有误,或者当前地图不存在!");
  420. return;
  421. }
  422. m_pcurLyr = m_pLyrVector[m_nIndex];
  423. m_nIndex = -1;
  424. ResetList(m_pLyrVector);
  425. SetControlContent(m_pcurLyr);
  426. GetDlgItem(IDC_EDIT_CUR_LAYER_NAME_QGIS)->SetWindowText(LPCTSTR(m_pcurLyr->GetLayerName()));
  427. UpdateData(FALSE);
  428. }
  429. void CDlgLayerManager::OnCancel()
  430. {
  431. CDialog::OnCancel();
  432. }