// 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; for (int i=0;iSetWindowText(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 >= 120) { BCGPMessageBoxEx(NULL,_T("最多支持120个标记点!"),_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 0) //删除选中的标记点 { CString strTitle, str; for (int i=m_iSelectedIndex;iSetWindowText(_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;iSetWindowText(_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)); }