|
|
// LonLatDlg.cpp : 实现文件
|
|
|
//
|
|
|
|
|
|
#include "stdafx.h"
|
|
|
#include "LonLatDlg.h"
|
|
|
//#include "afxdialogex.h"
|
|
|
#include "Globe.h"
|
|
|
#include "afxwin.h"
|
|
|
#include "afxdialogex.h"
|
|
|
|
|
|
// CLonLatDlg 对话框
|
|
|
|
|
|
IMPLEMENT_DYNAMIC(CLonLatDlg, CDialog)
|
|
|
|
|
|
CLonLatDlg::CLonLatDlg(CWnd* pParent /*=NULL*/)
|
|
|
: CDialog(CLonLatDlg::IDD, pParent)
|
|
|
{
|
|
|
//EnableVisualManagerStyle(TRUE, TRUE);
|
|
|
m_lon = 0.0;
|
|
|
m_lat = 0.0;
|
|
|
posTypeID = 0;
|
|
|
}
|
|
|
|
|
|
CLonLatDlg::~CLonLatDlg()
|
|
|
{
|
|
|
}
|
|
|
|
|
|
void CLonLatDlg::DoDataExchange(CDataExchange* pDX)
|
|
|
{
|
|
|
CDialog::DoDataExchange(pDX);
|
|
|
DDX_Text(pDX, IDC_EDIT_LON, m_lon);
|
|
|
DDX_Text(pDX, IDC_EDIT_LAT, m_lat);
|
|
|
DDX_Control(pDX, IDC_EDIT_LON, m_lon_edit);
|
|
|
DDX_Control(pDX, IDC_EDIT_LAT, m_lat_edit);
|
|
|
DDX_Control(pDX, IDC_COMBO_TYPE_XY, m_coord_type);
|
|
|
DDX_Control(pDX, IDC_CONFIRM_BTN, m_BtnOK);
|
|
|
}
|
|
|
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CLonLatDlg, CDialog)
|
|
|
ON_BN_CLICKED(IDC_CONFIRM_BTN, &CLonLatDlg::OnBnClickedConfirmBtn)
|
|
|
ON_BN_CLICKED(IDC_CHECK1, &CLonLatDlg::OnBnClickedCheck1)
|
|
|
ON_CBN_SELCHANGE(IDC_COMBO_TYPE_XY, &CLonLatDlg::OnCbnSelchangeComboType)
|
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
// CLonLatDlg 消息处理程序
|
|
|
|
|
|
//获取是否手动输入状态
|
|
|
bool CLonLatDlg::GetAutoEditStatus()
|
|
|
{
|
|
|
return m_isMouseMove;
|
|
|
}
|
|
|
|
|
|
|
|
|
//输入经度、纬度,并显示出来
|
|
|
//输入:经度lon,纬度lat
|
|
|
void CLonLatDlg::SetLonLatInfo(const double lon, const double lat)
|
|
|
{
|
|
|
if (posTypeID==0) //度
|
|
|
{
|
|
|
m_lon = lon;
|
|
|
m_lat = lat;
|
|
|
UpdateData(FALSE);
|
|
|
}
|
|
|
else if (posTypeID==1) // 度分秒
|
|
|
{
|
|
|
string str_lat,str_lon;
|
|
|
angle.getDMSString(lon,lat,str_lon,str_lat);
|
|
|
SetDlgItemText(IDC_EDIT_LON,str_lon.c_str());
|
|
|
SetDlgItemText(IDC_EDIT_LAT,str_lat.c_str());
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
void CLonLatDlg::OnCancel()
|
|
|
{
|
|
|
//发送主程序,标识已经关闭
|
|
|
if (g_mapHwnd != NULL)
|
|
|
{
|
|
|
::PostMessage(g_mapHwnd, WM_CLOSE_LONLAT_DIALOG, 0, 0);
|
|
|
}
|
|
|
|
|
|
CDialog::OnCancel();
|
|
|
}
|
|
|
|
|
|
|
|
|
//功能:移动对话框到给定的显示区域
|
|
|
void CLonLatDlg::MoveToGivenArea(const CRect rcArea)
|
|
|
{
|
|
|
m_rcDlgArea = rcArea;
|
|
|
m_rcDlgArea.top += 20;
|
|
|
}
|
|
|
|
|
|
BOOL CLonLatDlg::OnInitDialog()
|
|
|
{
|
|
|
CDialog::OnInitDialog();
|
|
|
|
|
|
SetWindowPos( &CWnd::wndTop, m_rcDlgArea.left, m_rcDlgArea.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE | SWP_HIDEWINDOW );
|
|
|
|
|
|
m_CheckBox.SubclassDlgItem(IDC_CHECK1, this);
|
|
|
m_CheckBox.SetCheck(BST_UNCHECKED); // 设置默认未选中状态
|
|
|
|
|
|
m_isMouseMove = true;
|
|
|
m_coord_type.AddString(_T("度"));
|
|
|
m_coord_type.AddString(_T("度分秒"));
|
|
|
m_coord_type.SetCurSel(0);
|
|
|
lastTypeID = 0;
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
|
// 异常: OCX 属性页应返回 FALSE
|
|
|
}
|
|
|
|
|
|
|
|
|
void CLonLatDlg::OnBnClickedConfirmBtn()
|
|
|
{
|
|
|
// TODO: 在此添加控件通知处理程序代码
|
|
|
|
|
|
CString str_lon;
|
|
|
CString str_lat;
|
|
|
GetDlgItemText(IDC_EDIT_LON, str_lon);
|
|
|
GetDlgItemText(IDC_EDIT_LAT, str_lat);
|
|
|
double lon = _tstof(str_lon);
|
|
|
double lat = _tstof(str_lat);
|
|
|
//::SendMessage(g_mapHwnd, WM_SEND_MAPLOCATION, WPARAM(_tstof(lon)*1000000), LPARAM(_tstof(lat)*1000000));
|
|
|
::SendMessage(g_mapHwnd, WM_SEND_MAPLOCATION, (WPARAM)&lon, (LPARAM)&lat);
|
|
|
}
|
|
|
|
|
|
|
|
|
// ‘手动输入’单选框变化时触发函数
|
|
|
void CLonLatDlg::OnBnClickedCheck1()
|
|
|
{
|
|
|
// TODO: 在此添加控件通知处理程序代码
|
|
|
if (m_CheckBox.GetCheck() == BST_CHECKED)
|
|
|
{
|
|
|
// 复选框被选中
|
|
|
m_isMouseMove = false;
|
|
|
// 文本框设为可编辑
|
|
|
m_lon_edit.SetReadOnly(FALSE);
|
|
|
m_lat_edit.SetReadOnly(FALSE);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
// 复选框未选中
|
|
|
m_isMouseMove = true;
|
|
|
// 文本框设为只读
|
|
|
m_lon_edit.SetReadOnly(TRUE);
|
|
|
m_lat_edit.SetReadOnly(TRUE);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
// 坐标类型改变事件
|
|
|
void CLonLatDlg::OnCbnSelchangeComboType()
|
|
|
{
|
|
|
std::string splitSymbol = "EWNSs+\/-,;°度′'’分\""”秒、,; ";
|
|
|
CString strLat,strLon;
|
|
|
m_lat_edit.GetWindowTextA(strLat);
|
|
|
m_lon_edit.GetWindowTextA(strLon);
|
|
|
|
|
|
posTypeID = m_coord_type.GetCurSel();
|
|
|
//TRACE(_T("当前选择 %d\n"),posTypeID);
|
|
|
if (lastTypeID == posTypeID) //类型未改变,不执行坐标变换
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
lastTypeID = posTypeID; // 更新坐标方式
|
|
|
}
|
|
|
|
|
|
if (posTypeID==0) //度
|
|
|
{
|
|
|
double tarLon,tarLat;
|
|
|
|
|
|
vector<string> vec_lat = angle.split(strLat.GetBuffer(),splitSymbol);
|
|
|
vector<string> vec_lon = angle.split(strLon.GetBuffer(),splitSymbol);
|
|
|
|
|
|
int lon_d = stoi(vec_lon.at(0));
|
|
|
int lon_m = stoi(vec_lon.at(1));
|
|
|
double lon_s = stod(vec_lon.at(2));
|
|
|
angle.DmstoDeg(lon_d,lon_m,lon_s,tarLon);
|
|
|
|
|
|
int lat_d = stoi(vec_lat.at(0));
|
|
|
int lat_m = stoi(vec_lat.at(1));
|
|
|
double lat_s = stod(vec_lat.at(2));
|
|
|
angle.DmstoDeg(lat_d,lat_m,lat_s,tarLat);
|
|
|
|
|
|
|
|
|
SetDlgItemText(IDC_EDIT_LON,angle.DoubleToString(tarLon).c_str());
|
|
|
SetDlgItemText(IDC_EDIT_LAT,angle.DoubleToString(tarLat).c_str());
|
|
|
}
|
|
|
else if (posTypeID==1) //度分秒
|
|
|
{
|
|
|
double lat,lon;
|
|
|
lat = _tstof(strLat);
|
|
|
lon = _tstof(strLon);
|
|
|
|
|
|
string str_lat,str_lon;
|
|
|
angle.getDMSString(lon,lat,str_lon,str_lat);
|
|
|
|
|
|
SetDlgItemText(IDC_EDIT_LON,str_lon.c_str());
|
|
|
SetDlgItemText(IDC_EDIT_LAT,str_lat.c_str());
|
|
|
}
|
|
|
}
|