// 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 vec_lat = angle.split(strLat.GetBuffer(),splitSymbol); vector 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()); } }