You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

554 lines
14 KiB
C++

// 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;i<g_iMarkerPtNum;++i)
{
g_lMarkerLayerID[i] = -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 >= 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<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));
}