// DlgMarker.cpp : 实现文件 // #include "stdafx.h" #include "DlgMarker.h" #include "afxdialogex.h" // CDlgMarker 对话框 IMPLEMENT_DYNAMIC(CDlgMarker, CBCGPDialog) CDlgMarker::CDlgMarker(CWnd* pParent /*=NULL*/) : CBCGPDialog(CDlgMarker::IDD, pParent) { EnableVisualManagerStyle(TRUE, TRUE); m_iSelectedIndex = -1; } CDlgMarker::~CDlgMarker() { } void CDlgMarker::DoDataExchange(CDataExchange* pDX) { CBCGPDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_TREE_MARKERS, m_treeMarkers); } BEGIN_MESSAGE_MAP(CDlgMarker, CBCGPDialog) ON_BN_CLICKED(IDC_BUTTON_SELECTMARKER, &CDlgMarker::OnBnClickedButtonSelectMarker) ON_BN_CLICKED(IDC_BUTTON_ADDMARKER, &CDlgMarker::OnBnClickedButtonAddMarker) ON_BN_CLICKED(IDC_BUTTON_DELETEMARKER, &CDlgMarker::OnBnClickedButtonDeleteMarker) ON_NOTIFY(NM_CLICK, IDC_TREE_MARKERS, &CDlgMarker::OnNMClickTreeMarkers) END_MESSAGE_MAP() // CDlgMarker 消息处理程序 BOOL CDlgMarker::OnInitDialog() { CBCGPDialog::OnInitDialog(); m_strMarkerConfig = GetSoftwareCurrentDirectory() + _T("\\Markers.ini"); m_treeMarkers.SetBkColor(RGB(53,53,57)); //设置为与对话框背景颜色一致 m_treeMarkers.SetTextColor(RGB(255,255,255)); //设置树控件文本颜色 //读取标记点配置文件(删去名称为空的标记点),更新树控件 RewriteMarkerConfig(); return TRUE; } //展开所有的子根节点 void CDlgMarker::MyExpandTree(HTREEITEM hTreeItem) { HTREEITEM hNextItem = m_treeMarkers.GetNextItem(hTreeItem, TVGN_NEXT); while (hNextItem != NULL) { MyExpandTree(hNextItem); hNextItem = m_treeMarkers.GetNextItem(hNextItem, TVGN_NEXT); } m_treeMarkers.Expand(hTreeItem,TVE_EXPAND); } //功能:移动对话框到给定的显示区域 void CDlgMarker::MoveToGivenArea(const CRect rcArea) { CRect m_rcDlgArea; m_rcDlgArea = rcArea; m_rcDlgArea.top += 90; SetWindowPos( &CWnd::wndTop, m_rcDlgArea.left, m_rcDlgArea.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE/* | SWP_HIDEWINDOW*/ ); } //在地图上选择标记点 void CDlgMarker::OnBnClickedButtonSelectMarker() { g_bSelectMarker = true; ::PostMessage(g_mapHwnd, WM_SEND_MAPCURSORMODE, 4, 0); //设置Map CurMode为None } //显示标记点坐标到编辑框 void CDlgMarker::ShowMarkerCoordinate(double& markerLon, double& markerLat) { CString str; str.Format(_T("Marker%d"), g_iHaveMarkedPts+1); GetDlgItem(IDC_EDIT_MARKER_NAME)->SetWindowText(str); str.Format(_T("%.7f"), markerLon); GetDlgItem(IDC_EDIT_MARKER_LON)->SetWindowText(str); str.Format(_T("%.7f"), markerLat); GetDlgItem(IDC_EDIT_MARKER_LAT)->SetWindowText(str); } //添加标记点 void CDlgMarker::OnBnClickedButtonAddMarker() { //最多支持20个标记点 if (g_iHaveMarkedPts >= 20) { BCGPMessageBoxEx(NULL,_T("最多支持20个标记点!"),_T("Tip"),MB_OK,MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US)); return ; } g_iHaveMarkedPts++; CString str; GetDlgItem(IDC_EDIT_MARKER_NAME)->GetWindowText(str); g_iMarkerName[g_iHaveMarkedPts-1] = str; GetDlgItem(IDC_EDIT_MARKER_LON)->GetWindowText(str); g_iMarkerLon[g_iHaveMarkedPts-1] = atof(str); GetDlgItem(IDC_EDIT_MARKER_LAT)->GetWindowText(str); g_iMarkerLat[g_iHaveMarkedPts-1] = atof(str); //在地图上显示标记点 ::PostMessage(g_mapHwnd, WM_SEND_DRAWMARKER, g_iHaveMarkedPts-1, 0); //标记点写配置文件 CString strTitle; strTitle.Format(_T("Marker%d"),g_iHaveMarkedPts); str.Format(_T("%s"), g_iMarkerName[g_iHaveMarkedPts-1]); WritePrivateProfileString(strTitle,_T("Name"),str,m_strMarkerConfig); str.Format(_T("%.7f"), g_iMarkerLon[g_iHaveMarkedPts-1]); WritePrivateProfileString(strTitle,_T("Lon"),str,m_strMarkerConfig); str.Format(_T("%.7f"), g_iMarkerLat[g_iHaveMarkedPts-1]); WritePrivateProfileString(strTitle,_T("Lat"),str,m_strMarkerConfig); //插入节点 HTREEITEM hItem; hItem = m_treeMarkers.InsertItem(strTitle, 1, 1, m_treeMarkers.GetRootItem(), TVI_LAST); m_treeMarkers.SetItemData(hItem, g_iHaveMarkedPts); //选中节点 m_treeMarkers.SetCheck(hItem, TRUE); //焦点移到节点上 m_treeMarkers.SelectItem(hItem); m_treeMarkers.SetFocus(); //获取选中节点的索引 m_iSelectedIndex = m_treeMarkers.GetItemData(hItem); } //读取标记点配置文件(删去名称为空的标记点),更新树控件 void CDlgMarker::RewriteMarkerConfig() { g_iHaveMarkedPts = 0; CString str, strTitle; //读取配置文件中的所有标记点信息(名称为空的除外) for (int i=0;i<g_iMarkerPtNum;i++) { g_lMarkerLayerID[i] = -1; strTitle.Format(_T("Marker%d"),i+1); TCHAR inBuf[30]; CString sLon, sLat; GetPrivateProfileString(strTitle,_T("Lon"),0,inBuf,20,m_strMarkerConfig); sLon.Format(_T("%s"), inBuf); GetPrivateProfileString(strTitle,_T("Lat"),0,inBuf,20,m_strMarkerConfig); sLat.Format(_T("%s"), inBuf); if ((sLon != _T("")) && (sLat != _T(""))) { g_iHaveMarkedPts++; GetPrivateProfileString(strTitle,_T("Name"),0,inBuf,20,m_strMarkerConfig); g_iMarkerName[g_iHaveMarkedPts-1].Format(_T("%s"), inBuf); GetPrivateProfileString(strTitle,_T("Lon"),0,inBuf,20,m_strMarkerConfig); g_iMarkerLon[g_iHaveMarkedPts-1] = atof(inBuf); GetPrivateProfileString(strTitle,_T("Lat"),0,inBuf,20,m_strMarkerConfig); g_iMarkerLat[g_iHaveMarkedPts-1] = atof(inBuf); } } //将读取的标记信息写进配置文件(目的是筛去空的标记点) for (int i=0;i<g_iHaveMarkedPts;i++) { strTitle.Format(_T("Marker%d"),i+1); str.Format(_T("%s"), g_iMarkerName[i]); WritePrivateProfileString(strTitle,_T("Name"),str,m_strMarkerConfig); str.Format(_T("%.7f"), g_iMarkerLon[i]); WritePrivateProfileString(strTitle,_T("Lon"),str,m_strMarkerConfig); str.Format(_T("%.7f"), g_iMarkerLat[i]); WritePrivateProfileString(strTitle,_T("Lat"),str,m_strMarkerConfig); } //剩余的标记点信息置空 for (int i=g_iHaveMarkedPts;i<g_iMarkerPtNum;i++) { strTitle.Format(_T("Marker%d"),i+1); WritePrivateProfileString(strTitle,_T("Name"),_T(""),m_strMarkerConfig); WritePrivateProfileString(strTitle,_T("Lon"),_T(""),m_strMarkerConfig); WritePrivateProfileString(strTitle,_T("Lat"),_T(""),m_strMarkerConfig); } //树控件删除所有节点 m_treeMarkers.DeleteAllItems(); //插入根节点 HTREEITEM hRoot; hRoot = m_treeMarkers.InsertItem(_T("标记点"), 0, 0); //设置根节点数据,可以用来代表节点索引 m_treeMarkers.SetItemData(hRoot, 0); //插入子节点(标记点名称) for (int i=0;i<g_iHaveMarkedPts;i++) { str.Format(_T("Marker%d"),i+1); HTREEITEM hChild; hChild = m_treeMarkers.InsertItem(str, 1, 1, hRoot, TVI_LAST); //设置子节点数据,可以用来代表节点索引 m_treeMarkers.SetItemData(hChild, i+1); } //展开所有根节点 MyExpandTree(m_treeMarkers.GetRootItem()); } //删除选中的标记点 void CDlgMarker::OnBnClickedButtonDeleteMarker() { if (m_iSelectedIndex == 0) //删除所有标记点 { //确认是否删除所有标记点 if (IDYES != BCGPMessageBoxEx(NULL, _T("确认删除所有标记点?"), _T("Tip"), MB_YESNO,MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US))) { return; } HTREEITEM item = m_treeMarkers.GetChildItem(m_treeMarkers.GetRootItem()); while (item) { m_iSelectedIndex = m_treeMarkers.GetItemData(item); g_iMarkerName[m_iSelectedIndex-1] = _T(""); g_iMarkerLon[m_iSelectedIndex-1] = 0; g_iMarkerLat[m_iSelectedIndex-1] = 0; CString strTitle; strTitle.Format(_T("Marker%d"),m_iSelectedIndex); WritePrivateProfileString(strTitle,_T("Name"),_T(""),m_strMarkerConfig); WritePrivateProfileString(strTitle,_T("Lon"),_T(""),m_strMarkerConfig); WritePrivateProfileString(strTitle,_T("Lat"),_T(""),m_strMarkerConfig); ::PostMessage(g_mapHwnd, WM_SEND_DRAWMARKER, m_iSelectedIndex-1, 1); HTREEITEM childItem = m_treeMarkers.GetNextItem(item, TVGN_NEXT); m_treeMarkers.DeleteItem(item); item = childItem; } g_iHaveMarkedPts = 0; } else if (m_iSelectedIndex > 0) //删除选中的标记点 { CString strTitle, str; for (int i=m_iSelectedIndex;i<g_iHaveMarkedPts;i++) { //g_iMarkerName[i-1] = g_iMarkerName[i]; g_iMarkerLon[i-1] = g_iMarkerLon[i]; g_iMarkerLat[i-1] = g_iMarkerLat[i]; g_bMarkerPlot[i-1] = g_bMarkerPlot[i]; if (g_bMarkerPlot[i-1]) { ::PostMessage(g_mapHwnd, WM_SEND_DRAWMARKER, i-1, 0); } else { ::PostMessage(g_mapHwnd, WM_SEND_DRAWMARKER, i-1, 1); } strTitle.Format(_T("Marker%d"),i); str.Format(_T("%s"), g_iMarkerName[i-1]); WritePrivateProfileString(strTitle,_T("Name"),str,m_strMarkerConfig); str.Format(_T("%.7f"), g_iMarkerLon[i-1]); WritePrivateProfileString(strTitle,_T("Lon"),str,m_strMarkerConfig); str.Format(_T("%.7f"), g_iMarkerLat[i-1]); WritePrivateProfileString(strTitle,_T("Lat"),str,m_strMarkerConfig); } g_iMarkerName[g_iHaveMarkedPts-1] = _T(""); g_iMarkerLon[g_iHaveMarkedPts-1] = 0; g_iMarkerLat[g_iHaveMarkedPts-1] = 0; g_bMarkerPlot[g_iHaveMarkedPts-1] = false; ::PostMessage(g_mapHwnd, WM_SEND_DRAWMARKER, g_iHaveMarkedPts-1, 1); strTitle.Format(_T("Marker%d"),g_iHaveMarkedPts); WritePrivateProfileString(strTitle,_T("Name"),_T(""),m_strMarkerConfig); WritePrivateProfileString(strTitle,_T("Lon"),_T(""),m_strMarkerConfig); WritePrivateProfileString(strTitle,_T("Lat"),_T(""),m_strMarkerConfig); m_treeMarkers.DeleteItem(m_treeMarkers.GetSelectedItem()); g_iHaveMarkedPts--; { HTREEITEM item = m_treeMarkers.GetChildItem(m_treeMarkers.GetRootItem()); int _iIndex = 0; while (item) { _iIndex++; m_treeMarkers.SetItemData(item, _iIndex); str.Format(_T("Marker%d"), _iIndex); m_treeMarkers.SetItemText(item, str); item = m_treeMarkers.GetNextItem(item, TVGN_NEXT); } } } GetDlgItem(IDC_EDIT_MARKER_NAME)->SetWindowText(_T("")); GetDlgItem(IDC_EDIT_MARKER_LON)->SetWindowText(_T("")); GetDlgItem(IDC_EDIT_MARKER_LAT)->SetWindowText(_T("")); m_iSelectedIndex = -1; } //单击树控件的响应事件函数 void CDlgMarker::OnNMClickTreeMarkers(NMHDR *pNMHDR, LRESULT *pResult) { //获取当前鼠标点击消息的坐标点 CPoint pt = GetCurrentMessage()->pt; //转换成树控件的客户区坐标 m_treeMarkers.ScreenToClient(&pt); UINT uFlags = 0; //获取鼠标点击坐标处的节点 HTREEITEM hItem = m_treeMarkers.HitTest(pt, &uFlags); if ((hItem != nullptr) && (TVHT_ONITEMSTATEICON & uFlags)) //鼠标点击节点复选框 { //选中该节点 m_treeMarkers.SelectItem(hItem); //获取点击前节点的选中状态 BOOL bCheck = m_treeMarkers.GetCheck(hItem); SetChildCheck(hItem, !bCheck); SetParentCheck(hItem, !bCheck); //获取选中节点的数据 m_iSelectedIndex = m_treeMarkers.GetItemData(hItem); if (m_iSelectedIndex > 0) { CString str; str.Format(_T("%s"), g_iMarkerName[m_iSelectedIndex-1]); GetDlgItem(IDC_EDIT_MARKER_NAME)->SetWindowText(str); str.Format(_T("%.7f"), g_iMarkerLon[m_iSelectedIndex-1]); GetDlgItem(IDC_EDIT_MARKER_LON)->SetWindowText(str); str.Format(_T("%.7f"), g_iMarkerLat[m_iSelectedIndex-1]); GetDlgItem(IDC_EDIT_MARKER_LAT)->SetWindowText(str); //根据选中状态显示或隐藏标记点 if (!bCheck) { ::PostMessage(g_mapHwnd, WM_SEND_DRAWMARKER, m_iSelectedIndex-1, 0); } else { ::PostMessage(g_mapHwnd, WM_SEND_DRAWMARKER, m_iSelectedIndex-1, 1); } } else if (m_iSelectedIndex == 0) { for (int i=0;i<g_iHaveMarkedPts;i++) { //if (g_iMarkerName[i] != _T("")) { //根据选中状态显示或隐藏标记点 if (!bCheck) { ::PostMessage(g_mapHwnd, WM_SEND_DRAWMARKER, i, 0); } else { ::PostMessage(g_mapHwnd, WM_SEND_DRAWMARKER, i, 1); } } } GetDlgItem(IDC_EDIT_MARKER_NAME)->SetWindowText(_T("")); GetDlgItem(IDC_EDIT_MARKER_LON)->SetWindowText(_T("")); GetDlgItem(IDC_EDIT_MARKER_LAT)->SetWindowText(_T("")); } } else if ((hItem != nullptr) && (TVHT_ONITEMLABEL & uFlags)) //鼠标点击节点名称 { //选中该节点 m_treeMarkers.SelectItem(hItem); //获取选中节点的数据 m_iSelectedIndex = m_treeMarkers.GetItemData(hItem); if (m_iSelectedIndex > 0) { CString str; str.Format(_T("%s"), g_iMarkerName[m_iSelectedIndex-1]); GetDlgItem(IDC_EDIT_MARKER_NAME)->SetWindowText(str); str.Format(_T("%.7f"), g_iMarkerLon[m_iSelectedIndex-1]); GetDlgItem(IDC_EDIT_MARKER_LON)->SetWindowText(str); str.Format(_T("%.7f"), g_iMarkerLat[m_iSelectedIndex-1]); GetDlgItem(IDC_EDIT_MARKER_LAT)->SetWindowText(str); //当前节点置为选中状态 m_treeMarkers.SetCheck(hItem, TRUE); SetChildCheck(hItem, TRUE); SetParentCheck(hItem, TRUE); //显示当前选中标记点 ::PostMessage(g_mapHwnd, WM_SEND_DRAWMARKER, m_iSelectedIndex-1, 0); } else if (m_iSelectedIndex == 0) { GetDlgItem(IDC_EDIT_MARKER_NAME)->SetWindowText(_T("")); GetDlgItem(IDC_EDIT_MARKER_LON)->SetWindowText(_T("")); GetDlgItem(IDC_EDIT_MARKER_LAT)->SetWindowText(_T("")); } } *pResult = 0; } //设置某节点的子节点的选中状态 void CDlgMarker::SetChildCheck(HTREEITEM item, BOOL bCheck) { HTREEITEM childItem = m_treeMarkers.GetChildItem(item); while (childItem) { m_treeMarkers.SetCheck(childItem, bCheck); SetChildCheck(childItem, bCheck); childItem = m_treeMarkers.GetNextItem(childItem, TVGN_NEXT); } } //设置某节点的父节点的选中状态 void CDlgMarker::SetParentCheck(HTREEITEM item, BOOL bCheck) { HTREEITEM parent = m_treeMarkers.GetParentItem(item); if (parent == NULL) { return ; } if (bCheck) { m_treeMarkers.SetCheck(parent, bCheck); } else { HTREEITEM bro = m_treeMarkers.GetNextItem(item, TVGN_NEXT); bool bFlag = false; while (bro) { if (m_treeMarkers.GetCheck(bro)) { bFlag = true; break; } bro = m_treeMarkers.GetNextItem(bro, TVGN_NEXT); } if (!bFlag) { bro = m_treeMarkers.GetNextItem(item, TVGN_PREVIOUS); while (bro) { if (m_treeMarkers.GetCheck(bro)) { bFlag = true; break; } bro = m_treeMarkers.GetNextItem(bro, TVGN_PREVIOUS); } } if (!bFlag) { m_treeMarkers.SetCheck(parent, false); } } SetParentCheck(parent, m_treeMarkers.GetCheck(parent)); }