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.

202 lines
4.7 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// LonLatDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "LonLatDlg.h"
//#include "afxdialogex.h"
#include "Globe.h"
#include "afxwin.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);
}
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());
}
}